K8s v1.9中Docker Registry:2.6.2不安全仓库内部拉取镜像失败问题
嘿,我来帮你搞定这个集群内部拉取镜像的问题!你遇到的Proxy Authentication Required错误,大概率是节点上的Docker或kubelet代理配置没排除内部服务域名导致的,咱们一步步来排查解决:
首先先明确报错核心:
Failed to pull image "registry.default.svc.cluster.local/elasticsearch:6.0.0": rpc error: code = Unknown desc = Error response from daemon: Get https://registry.default.svc.cluster.local/v1/_ping : Proxy Authentication Required
这个错误说明节点上的Docker daemon在访问内部Registry Service域名时,错误地走了代理,但代理需要认证(或者根本不该走代理访问内部服务)。下面是具体解决步骤:
1. 修正Docker daemon的代理配置,排除内部域名
很多时候节点配置了全局代理,但没把K8s集群内部的域名/IP段加入NO_PROXY列表,导致访问内部服务时也走代理:
- 检查Docker的代理配置文件,通常是
/etc/systemd/system/docker.service.d/http-proxy.conf,或者直接查看/etc/docker/daemon.json里的代理配置(如果有的话) - 确保
NO_PROXY环境变量包含K8s集群的服务域名后缀、内部IP段,比如:
(IP段根据你的集群Pod/Service CIDR调整,10.96.0.0/12是K8s默认的Service CIDR)NO_PROXY=localhost,127.0.0.1,default.svc.cluster.local,.svc.cluster.local,10.96.0.0/12,192.168.0.0/16 - 修改后重新加载配置并重启Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
2. 确保所有集群节点都配置了正确的insecure-registries
你已经在某个节点配置了不安全仓库,但所有集群节点(Master+Worker)都需要同步这个配置——因为kubelet是在各个节点上调用Docker拉取镜像的:
- 登录每个节点,检查
/etc/docker/daemon.json是否同时包含外部NodePort地址和内部Service域名:
注意这里要加上Registry Service的域名和对应端口(默认Registry容器暴露的是5000端口,Service的端口要和它对应){ "insecure-registries": ["xx.xx.xx.xxx:30002", "registry.default.svc.cluster.local:5000"] } - 修改后重启Docker:
sudo systemctl restart docker
3. 验证Registry Service的连通性
先确认你的Registry Service是否正确指向了Pod,端口映射没问题:
- 查看Service的详细配置:
确保kubectl get svc registry -o yamlspec.ports里的targetPort是Registry容器的暴露端口(默认5000),port是Service的端口(比如5000) - 在集群内部的临时Pod里测试访问Registry:
如果能正常返回镜像列表,说明Service是通的;如果还是报代理错误,那就是节点的代理配置没彻底解决。kubectl run -it --rm busybox --image=busybox:1.28 -- wget -O- http://registry.default.svc.cluster.local:5000/v2/_catalog
4. 检查kubelet的代理配置(如果有设置)
有些集群会给kubelet单独配置代理,这也可能影响镜像拉取:
- 查看kubelet的配置文件,比如
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf或者/var/lib/kubelet/config.yaml - 确保kubelet的环境变量里也设置了
NO_PROXY,内容和Docker的NO_PROXY保持一致 - 修改后重启kubelet:
sudo systemctl restart kubelet
5. 测试镜像拉取
完成上述配置后,在集群内部测试拉取镜像:
kubectl run -it --rm test-registry --image=registry.default.svc.cluster.local/elasticsearch:6.0.0
如果能正常启动Pod,说明问题已经解决啦!
内容的提问来源于stack exchange,提问作者bladerunner512

