Kubernetes拉取本地私有Docker Registry镜像部署Pod失败如何解决
私有镜像仓库拉取失败解决方案
核心报错原因:Kubernetes节点的容器运行时默认使用HTTPS协议访问镜像仓库,你当前部署的Registry为无TLS的HTTP服务,且仅在当前操作节点配置了Docker的不安全仓库规则,未同步配置所有K8s集群节点的容器运行时。
方案一:配置所有K8s节点信任HTTP私有仓库(仅测试环境使用,不建议生产)
需要在所有Master和Worker节点执行对应容器运行时的配置:
节点使用Docker作为容器运行时
- 修改
/etc/docker/daemon.json,加入不安全仓库配置:
{ "insecure-registries" : [ "192.168.1.37:5000" ] }
- 重启服务生效:
sudo systemctl daemon-reload sudo systemctl restart docker
节点使用Containerd作为容器运行时(当前多数K8s发行版默认 runtime)
- 编辑containerd配置文件
/etc/containerd/config.toml,找到[plugins."io.containerd.grpc.v1.cri".registry]段,修改为:
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.37:5000"] endpoint = ["http://192.168.1.37:5000"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.37:5000".tls] insecure_skip_verify = true
- 重启containerd生效:
sudo systemctl restart containerd
配置完成后重新部署Pod即可正常拉取镜像。
方案二:使用带TLS和身份认证的私有仓库(生产环境推荐)
你提供的补充Registry部署命令已包含自签证书和身份认证配置,需额外完成以下三步配置:
- 所有K8s节点信任自签证书:将Registry节点生成的
domain.crt复制到所有K8s节点:
# 在部署Registry的节点执行,替换<节点IP>为所有K8s节点IP逐一执行 scp ./certs/domain.crt root@<节点IP>:/tmp/ # 分别登录每个节点执行 mkdir -p /etc/docker/certs.d/192.168.1.37:5000/ cp /tmp/domain.crt /etc/docker/certs.d/192.168.1.37:5000/ca.crt # 若使用containerd,还需加入系统信任 cp /tmp/domain.crt /usr/local/share/ca-certificates/192.168.1.37.crt update-ca-certificates systemctl restart containerd # 用Docker的话改为重启docker服务
- 创建K8s镜像拉取Secret:在部署Pod的命名空间下创建仓库认证Secret:
kubectl create secret docker-registry regcred \ --docker-server=192.168.1.37:5000 \ --docker-username=username \ --docker-password=password
- Pod配置中引用Secret:在Pod YAML中加入
imagePullSecrets字段:
apiVersion: v1 kind: Pod metadata: name: tf-http-server spec: containers: - name: tf-http-server image: 192.168.1.37:5000/truc/tf-http-server:0.1 imagePullSecrets: - name: regcred
内容的提问来源于stack exchange,提问作者Manitoba
相关产品推荐
相关产品推荐

