K8s无法从MinIO存储后端的本地镜像仓库拉取镜像
问题分析与解决步骤
核心问题:Kubernetes集群拉取私有镜像时,域名解析到错误IP(XX.XXX.XXX.120),导致连接被拒绝。以下是针对性的排查和解决方法:
1. 修正K8s节点的hosts映射
你仅在本地机器配置了/etc/hosts,但Kubernetes的所有工作节点都需要正确的域名-IP映射(因为是节点上的kubelet负责拉取镜像):
- 登录每个K8s工作节点,编辑
/etc/hosts,添加正确的映射:
注意:你当前hosts里写的是XX.XXX.XXX.32 proj.name.registrycharity.ches.registry,但镜像使用的是proj.name.registry,这两个域名必须一致,否则解析无效。
2. 验证节点上的域名解析
在每个K8s节点执行以下命令,确认域名解析结果:
nslookup proj.name.registry # 或 dig proj.name.registry
如果返回的IP仍是XX.XXX.XXX.120,说明:
- hosts配置未生效(可重启节点的dnsmasq或network服务)
- 节点使用的DNS服务器中存在该域名的错误记录,需修改DNS配置或优先使用hosts解析
3. 排查Service配置的有效性
你创建的Service仅适用于私有仓库部署在K8s集群内的场景:
- 如果仓库是集群外部服务:该Service完全无效,可直接删除,无需通过Service访问外部仓库
- 如果仓库是集群内部服务:需确认:
- 仓库Deployment的
labels包含app: ches-registry(与Service的selector匹配) - 仓库Pod处于Running状态,且
targetPort与仓库实际监听端口一致
- 仓库Deployment的
4. 临时绕过域名解析问题
若域名解析问题暂时无法解决,可直接在Deployment中使用IP替代域名:
apiVersion: apps/v1 kind: Deployment metadata: name: registry-test namespace: ches labels: app: registry-test spec: replicas: 1 selector: matchLabels: app: registry-test template: metadata: labels: app: registry-test spec: containers: - name: registry-test image: XX.XXX.XXX.32:5045/hello-world # 替换为仓库IP imagePullSecrets: - name: ches-registry-secret
注意:如果你的ches-registry-secret是基于域名创建的,需重新创建针对该IP的Secret:
kubectl create secret docker-registry ches-registry-secret \ --docker-server=XX.XXX.XXX.32:5045 \ --docker-username=<你的用户名> \ --docker-password=<你的密码> \ --namespace=ches
5. 检查节点与仓库的网络连通性
在K8s节点执行以下命令,验证仓库端口是否可达:
curl -k https://XX.XXX.XXX.32:5045/v2/_catalog
如果连接失败,需排查:
- 仓库服务器的防火墙是否开放5045端口
- 集群与仓库之间的网络策略、安全组是否允许TCP 5045端口的通信
内容的提问来源于stack exchange,提问作者e7lT2P
相关产品推荐
相关产品推荐

