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

Kubernetes使用私有镜像仓库registro遇错,求解决方案

问题描述

已在Kubernetes中搭建名为registro的私有Docker镜像仓库,Service IP为10.43.48.208。通过kaniko推送了alpine镜像到该仓库,创建了认证secret,也配置了default服务账户的imagePullSecrets。

尝试运行使用该仓库镜像的Pod时,出现镜像拉取失败错误:

Failed to pull image "registro:5000/alpine": rpc error: code = Unknown desc = failed to pull and unpack image "registro:5000/alpine:latest": failed to resolve reference "registro:5000/alpine:latest": failed to do request: Head "https://registro:5000/v2/alpine/manifests/latest": dial tcp: lookup registro on 127.0.0.53:53: server misbehaving

即使在Pod配置中直接指定imagePullSecrets也失败。

疑问:

  1. 如何解决该镜像拉取错误?
  2. IP地址127.0.0.53是什么?
  3. 该仓库使用自签名证书,如何配置Kubernetes集群信任该证书?

更新1

通过kubectl port-forward将registro服务端口映射到本地,修改/etc/hosts并配置Docker信任证书后,本地可正常登录并拉取镜像,但Kubernetes集群内仍无法拉取,报错:

Failed to pull image "registro:5000/alpine": rpc error: code = Unknown desc = failed to pull and unpack image "registro:5000/alpine:latest": failed to resolve reference "registro:5000/alpine:latest": failed to do request: Head "https://registro:5000/v2/alpine/manifests/latest": EOF

本地curl请求该仓库接口可正常返回结果。


解决方案

1. 解决镜像拉取错误

针对初始DNS解析失败问题

初始报错核心是registro域名无法被解析,可按以下方式处理:

  • 直接使用Service IP绕过DNS:把镜像地址替换为10.43.48.208:5000/alpine,避免依赖域名解析。
  • 排查集群DNS服务:检查CoreDNS(或KubeDNS)Pod是否正常运行,在集群内测试Pod中执行nslookup registro验证解析结果。若解析失败,重启CoreDNS Pod或检查DNS配置是否存在异常。

针对更新后的EOF错误

结合本地可正常访问的情况,问题大概率出在集群节点未信任自签名证书,或节点层面的网络/SSL连接问题:

  • 先按问题3的步骤完成集群节点的证书信任配置。
  • 在每个集群节点上执行curl https://registro:5000/v2/alpine/manifests/latest(或用Service IP),若返回EOF,说明节点无法建立有效SSL连接,需确认证书是否正确部署到节点的容器运行时信任目录。
  • 检查仓库Service配置:确认Service的targetPort与仓库容器端口一致,且Service类型为ClusterIP时集群内访问权限正常。

2. IP地址127.0.0.53是什么?

这是系统systemd-resolved或dnsmasq服务监听的本地DNS解析器地址,负责转发本地DNS请求到集群DNS服务(如CoreDNS)。报错中提示该地址"server misbehaving",说明本地解析器无法正确转发请求到集群DNS,导致registro域名解析失败。

3. 配置Kubernetes集群信任自签名证书

需在集群所有节点上配置容器运行时信任该证书:

针对Docker环境

  1. 在每个节点创建证书目录:mkdir -p /etc/docker/certs.d/registro:5000(若用Service IP则为/etc/docker/certs.d/10.43.48.208:5000)。
  2. 将自签名证书文件(.crt格式)复制到上述目录。
  3. 重启Docker服务:systemctl restart docker。

针对Containerd环境

  1. 创建证书目录:mkdir -p /etc/containerd/certs.d/registro:5000。
  2. 复制证书到该目录,创建hosts.toml文件,内容如下:
    server = "https://registro:5000"
    [host."https://registro:5000"]
      ca = "/etc/containerd/certs.d/registro:5000/your-cert.crt"
    
  3. 重启containerd服务:systemctl restart containerd。

节点层面的证书信任是通用解决方案,也可在ImagePullSecret中包含证书,但前者覆盖范围更广。


内容的提问来源于stack exchange,提问作者david.perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:47:16