使用kops配置不安全Docker Registry访问遇问题
解决Kops集群中Docker Push到不安全HTTP Registry失败的问题
我来帮你排查这个问题——在使用kops v1.8.1和Kubernetes v1.10.0的集群里,配置了不安全HTTP Registry但push失败是个挺常见的场景,咱们一步步来解决:
1. 先验证节点上的Docker配置是否真的生效
kops的集群清单配置需要正确同步到每个节点的Docker daemon里,你可以这么检查:
- 登录到集群的任意节点(比如用
kubectl exec -it <node-name> -- bash,或者通过SSH) - 查看Docker daemon的配置文件:
cat /etc/docker/daemon.json
你应该能看到类似这样的内容:{ "insecure-registries": ["<your-registry-hostname>"] } - 如果看不到这个配置,说明kops的配置没正确应用到节点上。这时候需要重新更新集群并滚动更新节点:
这个操作会让每个节点重新配置Docker并重启。kops update cluster --yes kops rolling-update cluster --yes
2. 重启Docker服务让配置生效
就算daemon.json配置正确了,Docker也需要重启才能加载新的不安全仓库设置:
- 在节点上执行重启命令(根据系统不同选择):
# Systemd系统(比如Ubuntu 16.04+、Amazon Linux 2) sudo systemctl restart docker # Upstart系统(比如旧版Ubuntu) sudo service docker restart - 重启后验证配置是否生效:
输出里应该能看到你的Registry hostname。docker info | grep -A5 Insecure
3. 检查集群节点到Registry的网络连通性
有时候push失败不是配置问题,而是网络不通:
- 在节点上测试Registry的可达性:
如果返回curl http://<your-registry-hostname>/v2/{}或者类似的空JSON响应,说明网络是通的;如果出现超时、连接拒绝,要检查:- Registry所在服务器的安全组是否允许集群节点的IP访问80端口
- 集群的VPC网络ACL是否放行到Registry的流量
- Registry服务是否正常运行(可以在Registry服务器上用
docker ps确认容器状态)
4. 确认镜像标签格式正确
推送的时候必须给镜像加上Registry的hostname前缀,否则Docker会默认尝试推送到Docker Hub,自然失败:
- 先给本地镜像打正确的标签:
docker tag your-local-image:tag <your-registry-hostname>/your-repo/image:tag - 再执行推送:
docker push <your-registry-hostname>/your-repo/image:tag
5. 针对kops v1.8.1的额外排查
这个版本比较老旧,可能存在集群层级配置不生效的情况,你可以尝试在Instance Group级别也添加Docker配置:
- 编辑你的Instance Group配置:
kops edit ig nodes - 在spec里添加Docker的不安全仓库设置:
spec: containers: - name: docker insecureRegistry: <your-registry-hostname> - 保存后再次更新集群并滚动更新节点:
kops update cluster --yes kops rolling-update cluster --yes
按照这个步骤排查下来,应该能解决你的push失败问题。
内容的提问来源于stack exchange,提问作者julienla
相关产品推荐
相关产品推荐

