如何让使用Containerd的Kubernetes默认使用Nexus私有镜像仓库?
问题1:未指定镜像仓库时仍从docker.io拉取
按以下顺序排查并修复:
确保配置生效:修改
/etc/containerd/config.toml后,必须重启containerd和kubelet服务,否则配置不会生效:systemctl restart containerd systemctl restart kubelet补充完整registry配置:仅配置mirror的endpoint还不够,需添加允许HTTP访问私有仓库的规则(你的Nexus用的是HTTP),在config.toml中追加:
[plugins."io.containerd.grpc.v1.cri".registry.configs."192...:8082".tls] insecure_skip_verify = true这段配置让containerd跳过该私有仓库的HTTPS证书验证,允许HTTP请求。
同步所有节点配置:确保集群中所有worker节点都更新了相同的config.toml,并且都执行了服务重启操作。
排查containerd日志:通过日志确认镜像拉取逻辑是否走了配置的私有仓库:
journalctl -u containerd -f | grep docker.io
问题2:指定Nexus地址拉取镜像失败
从Pod事件看,containerd默认用HTTPS访问你的Nexus但连接被拒绝,结合ping通但端口无法访问的情况,按以下步骤处理:
验证端口真实可达性:ping是ICMP协议,不代表TCP端口开放,在worker节点上执行以下命令测试8082端口:
# 测试HTTP访问是否正常 curl http://repo.mm.mm:8082/v2/_catalog # 或直接测试端口连通性 telnet repo.mm.mm 8082如果返回连接拒绝,说明Nexus的8082端口未对外暴露,或者防火墙/安全组阻止了worker节点的访问。
配置containerd用HTTP访问该仓库:在
/etc/containerd/config.toml中添加针对repo.mm.mm:8082的规则:[plugins."io.containerd.grpc.v1.cri".registry.configs."repo.mm.mm:8082".tls] insecure_skip_verify = true保存后重启containerd和kubelet,containerd就会改用HTTP访问你的Nexus仓库。
检查Nexus自身配置:
- 确认你创建的Docker代理仓库(指向docker.io)处于启用状态;
- 确认仓库允许匿名拉取(如果未配置imagePullSecret的话);
- 查看Nexus日志,排查是否有访问拒绝的记录。
确认镜像存在性:确保Nexus中已缓存
nginx:latest镜像,或者代理仓库能正常从docker.io拉取并缓存该镜像。
内容的提问来源于stack exchange,提问作者Guillaume

