Kubernetes集群从私有Docker Registry拉取镜像失败问题咨询
问题根因
报错核心是镜像拉取请求协议不匹配:你部署的私有Docker Registry默认未配置TLS证书,仅提供HTTP服务,但节点上的容器运行时默认使用HTTPS协议访问镜像仓库,触发http: server gave HTTP response to HTTPS client错误。
你已经配置了insecure-registries但未生效,通常是以下两类原因:
- 配置存在问题:
/etc/docker/daemon.json格式不合法(比如JSON语法错误、中文标点、遗漏逗号),或者修改配置后未重启Docker服务导致配置未加载;另外Master节点本地通过localhost:5000推送镜像是因为Docker默认放行localhost地址的HTTP请求,换成Master节点实际IP访问时依然会触发HTTPS校验。 - 运行时不匹配:Kubernetes 1.24及之后版本默认移除dockershim,使用containerd作为默认容器运行时,这类场景下kubelet拉取镜像不会读取Docker的
daemon.json配置,你在Docker配置里加的insecure-registries规则完全不生效。
修复方案
根据集群实际使用的容器运行时选择对应操作步骤:
场景1:使用Docker作为容器运行时
- 修正Worker节点(以及需要拉取私有仓库镜像的Master节点)的
/etc/docker/daemon.json,确保JSON格式合法,示例如下:
{ "insecure-registries": ["<替换为Master节点实际IP>:5000"] // 保留文件内原有其他配置,注意上一行配置末尾添加半角逗号 }
- 执行以下命令重载配置、重启Docker服务:
systemctl daemon-reload systemctl restart docker
- 执行
docker info命令,在输出的Insecure Registries段落确认<MasterIP>:5000已被加入列表,再手动执行docker pull <MasterIP>:5000/myimage:v2验证可以正常拉取镜像。
场景2:使用containerd作为容器运行时(K8s 1.24+默认场景)
- 编辑containerd默认配置文件
/etc/containerd/config.toml,添加私有仓库的HTTP访问、跳过TLS校验规则:
# 配置私有仓库端点,指定使用HTTP协议访问 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<MasterIP>:5000"] endpoint = ["http://<MasterIP>:5000"] # 配置跳过该仓库的TLS证书校验 [plugins."io.containerd.grpc.v1.cri".registry.configs."<MasterIP>:5000".tls] insecure_skip_verify = true
- 执行以下命令重启containerd服务让配置生效:
systemctl restart containerd
- 执行
crictl pull <MasterIP>:5000/myimage:v2手动验证镜像拉取,无报错则说明配置生效。
生产环境长期方案建议为私有Registry配置可信TLS证书(自签CA证书或公网可信证书),将CA根证书分发到所有集群节点的系统可信证书目录,无需配置insecure规则即可正常拉取镜像,安全性更高。
所有节点验证手动拉取镜像正常后,重新创建Pod即可正常运行,不会再出现ImagePullBackOff错误。
内容的提问来源于stack exchange,提问作者Rodr
相关产品推荐
相关产品推荐

