目录
前言
在 Kubernetes 中使用 crictl 拉取镜像时,默认使用存在于公共镜像库(如 Docker Hub 或 Google Container Registry)的镜像。如果想使用私有镜像库,可通过配置 containerd 或 crictl 来实现。本文举例证明如何将镜像源配置为私有镜像库。
实验环境
运行下列环境设置:
- Kubernetes 版本: 1.24+
- Container Runtime: containerd
- 私有镜像库地址:
https://172.16.20.20
根据您说明,您将私有镜像库设为 172.16.20.20 ,并在 containerd 配置中实现自动切换。
正确配置 crictl 使用私有镜像库
步骤1:配置 containerd 镜像源
在 Kubernetes 中,默认是通过 containerd 进行镜像拉取。您需要修改 containerd 配置文件:
-
打开
/etc/containerd/config.toml:sudo nano /etc/containerd/config.toml -
找到
[plugins."io.containerd.grpc.v1.cri".registry.mirrors],添加私有镜像库配置:[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://172.16.20.20"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://172.16.20.20"] 完整的路径应该是下面这样的 , 但是有时遇到 /etc/containerd/config.toml 文件内容很少的情况, 按如下方式写却又不生效 [plugins] [plugins."io.containerd.grpc.v1.cri"] [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.1ms.run"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://docker.1ms.run"] 如果未生效, 使用命令 containerd config dump 查看是否修改成功, 如果没有, 则说明文件位置不正确 通过如下命令覆盖配置文件, 从系统默认值中获取配置 sudo containerd config default > /etc/containerd/config.toml, 然后出来的配置文件就比较全了 然后找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] , 在下面添加新的mirrors 然后 重启 sudo systemctl restart containerd 检查是否生效 sudo containerd config dump 发现生效了 然后测试 crictl pull nginx:latest , 可以正常获取了 -
重启 containerd :
sudo systemctl restart containerd
步骤2:添加 TLS 证书配置
如果私有镜像库使用的是非证书的 HTTP,需要配置允许不安全连接:
-
修改
/etc/containerd/config.toml,在相应镜像源配置中添加 TLS 选项:[plugins."io.containerd.grpc.v1.cri".registry.configs."172.16.20.20".tls] insecure_skip_verify = true -
重启 containerd :
sudo systemctl restart containerd
步骤3:验证 crictl 拉取镜像
在修改完成 containerd 配置后,通过 crictl 检查镜像源是否配置正确。
-
下载指定镜像:
crictl pull nginx:latest -
检查镜像是否已成功下载:
crictl images
如果拉取成功,返回中的镜像应该包含前缀 172.16.20.20 :
IMAGE TAG IMAGE ID SIZE
172.16.20.20/library/nginx latest <IMAGE_ID> <SIZE>
如果拉取失败,检查私有镜像库是否存在相应镜像,参考下文添加手动上传部分。
步骤4:如果镜像不存在
报错信息
root@master:/etc/containerd# crictl pull nginx:latest
E1231 17:27:29.937259 5597 remote_image.go:180] "PullImage from image service failed" err="rpc error: code = NotFound desc = failed to pull and unpack image \"docker.io/library/nginx:latest\": failed to resolve reference \"docker.io/library/nginx:latest\": docker.io/library/nginx:latest: not found" image="nginx:latest"
FATA[0000] pulling image: rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/library/nginx:latest": failed to resolve reference "docker.io/library/nginx:latest": docker.io/library/nginx:latest: not found
如果私有镜像库中不存在 nginx:latest,需要将镜像上传到私有镜像库:
-
拉取镜像:
docker pull nginx:latest -
重命名为私有镜像库的路径:
docker tag nginx:latest 172.16.20.20/library/nginx:latest -
提交到私有镜像库:
docker push 172.16.20.20/library/nginx:latest -
重新通过
crictl pull拉取:crictl pull nginx:latest
总结
通过修改 containerd 配置,可以完成 Kubernetes 环境下 crictl 的私有镜像库配置。如果镜像不存在,可以通过手动提交或配置镜像代理来解决。将上进的步骤举行完成,即可使 Kubernetes 在私有环境下正常拉取镜像。
3745

被折叠的 条评论
为什么被折叠?



