You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:36:50