ctr crictl nerctl
发表于|更新于
|字数总计:1.5k|阅读时长:6分钟
ctr、crictl
概述
ctr是containerd自带的CLI命令行工具
crictl是k8s中CRI(容器运行时接口)的客户端,k8s使用该客户端和containerd进行交互
crictl 使用命名空间 k8s.io,即crictl image list = ctr -n=k8s.io image list
containerd 相比于 docker , 多了 namespace 概念, 每个 image 和 container 都会在各自的 namespace 下可见, 目前 k8s 会使用 k8s.io 命名空间
作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24起的版本的 kubelet 就彻底移除了dockershim,改为默认使用Containerd了,当然也使用cri-dockerd适配器来将Docker Engine与 Kubernetes 集成。
可以参考官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker
修改镜像 tag
ctr -n 命名空间 i tag 原tag 新tag
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 注意: 若新镜像reference 已存在, 需要先删除新reference, 或者如下方式强制替换 ctr -n k8s.io i tag --force registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
|
推送/拉取镜像
ctr --namespace=k8s.io images push [镜像名称]:[tag] --skip-verify --user admin:Harbor12345 ctr images pull [镜像名称]:[tag]
ctr -n k8s.io i pull -k k8s.gcr.io/pause:3.2 ctr -n k8s.io i push -k k8s.gcr.io/pause:3.2
crictl pull [镜像名称]:[tag]
|
⚠️:有些时候,使用ctr不能拉取镜像,反而使用 crictl 可以正常拉取镜像。
导出/导入镜像
ctr: ctr image export [镜像文件名] [镜像地址] ctr image import [镜像文件名]
ctr -n k8s.io i export pause.tar k8s.gcr.io/pause:3.2
ctr -n k8s.io i import pause.tar
crictl: 不支持类似docker save/load或者ctr image export/import的方式,可以通过本地仓库或远程仓库pull拉取
|
容器内执行命令
crictl ps crictl exec -i -t ee20ec2346fc5 ls
|
containerd 添加私有镜像库
containerd config default > /etc/containerd/config.toml
|
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"] endpoint = ["https://gcr.mirrors.ustc.edu.cn"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://gcr.mirrors.ustc.edu.cn/google-containers/"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"] endpoint = ["https://quay.mirrors.ustc.edu.cn"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."www.myharbor.com"] endpoint = ["https://www.myharbor.com/"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.harbor.com".tls] insecure_skip_verify = true ca_file = "/etc/containerd/certs.d/registry.harbor.com/ca.crt" cert_file = "/etc/containerd/certs.d/registry.harbor.com/registry.harbor.com.cert" key_file = "/etc/containerd/certs.d/registry.harbor.com/registry.harbor.com.key" [plugins."io.containerd.grpc.v1.cri".registry.configs."www.myharbor.com".auth] username = "admin" password = "Harbor12345"
|
⚠️
配置文件中有个默认的sandbox_image = “k8s.gcr.io/pause:3.2”,因为网络原因,理论上这个镜像是无法拉取的,但是配置了国内公共仓库:k8s.gcr.io (只是名称而已,实际是从endpoint地址中拉取镜像),因此可以拉取这个镜像。若是配置文件中没有配置国内公共仓库;k8s.gcr.io,则需要手动修改sandbox_image的值,确保这个镜像可以拉取
如果镜像仓库配置了双向认证,那么需要为 containerd 配置 ssl 证书用于 镜像仓库对 containerd 做认证。
Containerd 与 docker 都有默认仓库,均为 docker.io 。如果配置中未指定 mirror 为 docker.io,containerd 后会自动加载 docker.io 配置。与 docker 不同的是,containerd 可以修改 docker.io 对应的 endpoint(默认为 https://registry-1.docker.io ) ,而 docker 无法修改。
Docker 中可以通过 registry-mirrors 设置镜像加速地址。如果 pull 的镜像不带仓库地址(项目名+镜像名:tag),则会从默认镜像仓库去拉取镜像。如果配置了镜像加速地址,会先访问镜像加速仓库,如果没有返回数据,再访问默认的镜像仓库。
Containerd 目前没有直接配置镜像加速的功能,但 containerd 中可以修改 docker.io 对应的 endpoint,所以可以通过修改 endpoint 来实现镜像加速下载。因为 endpoint 是轮询访问,所以可以给 docker.io 配置多个仓库地址来实现 加速地址+默认仓库地址。
如上就是上文配置那些公共仓库的缘由。
重启containerd.service服务
重载 systemd 的 daemon守护进程并重启containerd.service服务
systemctl daemon-reload && systemctl restart containerd.service
|
nerdctl
nerdctl 使用效果与 docker 命令的语法一致
github:https://github.com/containerd/nerdctl
- 精简 (nerdctl–linux-amd64.tar.gz): 只包含 nerdctl
- 完整 (nerdctl-full–linux-amd64.tar.gz):包含 containerd, runc, and CNI 等依赖
nerdctl的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看 nerdctl。