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

image.png

修改镜像 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
ctr --namespace=k8s.io images push [镜像名称]:[tag] --skip-verify --user admin:Harbor12345
ctr images pull [镜像名称]:[tag]
# 注意需要填写完整的镜像地址,如docker.io/library/[镜像名称]:[tag]
# 若要指定具体名称空间,如k8s的,则在ctr后添加-n k8s.io,其他名称空间类似
# --skip-verify 跳过认证、-k
# 可通过ctr ns ls命令查看所有的名称空间
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
crictl pull [镜像名称]:[tag]
# 无推送命令

⚠️:有些时候,使用ctr不能拉取镜像,反而使用 crictl 可以正常拉取镜像。

导出/导入镜像

ctr:
ctr image export [镜像文件名] [镜像地址] # 导出
ctr image import [镜像文件名] # 导入
# 注意需要填写完整的镜像地址,如docker.io/library/[镜像名称]:[tag]
# 若要指定具体名称空间,如k8s的,则在ctr后添加-n k8s.io,其他名称空间类似
ctr -n k8s.io i export pause.tar k8s.gcr.io/pause:3.2
# 不支持 build,commit 镜像
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" #ca证书
cert_file = "/etc/containerd/certs.d/registry.harbor.com/registry.harbor.com.cert" #harbor证书
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" #harbor用户名
password = "Harbor12345" #harbor密码 配置截至到这里

⚠️

  • 配置文件中有个默认的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。

image.png