Kubernetes 1.10拉取私有镜像失败:/v1/_ping请求返回Not Found
首先得明确:你看到的/v1/_ping请求是Docker客户端(kubelet依赖Docker引擎拉取镜像)的默认行为——Docker客户端会先尝试调用旧的Registry V1 API的/_ping端点来探测仓库的API版本,如果失败,它会自动 fallback到V2 API。这个404本身不一定是导致拉取失败的直接原因,咱们得从其他地方找问题。
为什么会出现拉取失败?
从错误日志看,核心问题是Failed to pull image ... rpc error: code = Unknown desc = Error response from daemon: Get https://armdocker.rnd.se/v1/_ping: Not Found,但更关键的是,Docker客户端没有成功切换到V2 API,或者你的私有仓库存在其他访问/认证问题。
一步步排查与解决
1. 先在调度节点手动测试镜像拉取
你的Pod被调度到了node6,先登录到这个节点,直接用Docker命令拉取镜像,看看能不能成功:
docker pull armdocker.rnd.se/proj/authorization_backend:3.6.15
- 如果手动拉取也失败,说明问题出在节点与仓库的连接、认证或仓库本身配置上,和K8s关系不大。
- 如果手动拉取成功,再回到K8s的配置排查。
2. 验证私有仓库的V2 API可用性
手动测试仓库的V2 API端点:
curl https://armdocker.rnd.se/v2/
正常情况下,如果仓库支持V2,会返回类似这样的未授权提示(说明API是通的,只是需要认证):
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
如果返回404,那你的私有仓库可能没有正确配置V2 API,需要先修复仓库的配置。
3. 检查节点的Docker信任配置(重点!)
如果你的私有仓库用的是自签名HTTPS证书,节点上的Docker daemon默认会不信任这个证书,导致拉取失败。解决方法是:
在node6上创建证书目录并放置CA证书:
mkdir -p /etc/docker/certs.d/armdocker.rnd.se/ # 把你的仓库CA证书复制到这个目录,命名为ca.crt cp /path/to/your/ca.crt /etc/docker/certs.d/armdocker.rnd.se/ # 重启Docker daemon systemctl restart docker
之后再尝试手动拉取镜像,看是否成功。
4. 确认Pod/Deployment的imagePullSecret配置
虽然你创建了arm-docker secret,但必须确保你的Pod或Deployment配置里明确引用了这个secret,否则kubelet不会使用它来拉取镜像。示例配置:
apiVersion: apps/v1 kind: Deployment metadata: name: authorization-backend-deployment spec: replicas: 1 selector: matchLabels: app: auth-backend template: metadata: labels: app: auth-backend spec: containers: - name: auth-backend image: armdocker.rnd.se/proj/authorization_backend:3.6.15 # 这里必须添加imagePullSecrets引用 imagePullSecrets: - name: arm-docker
关于禁用/v1/_ping请求
这个请求是Docker客户端的内置逻辑,没有直接的禁用开关。但只要仓库支持V2 API,并且节点Docker配置正确,这个404请求不会影响最终的镜像拉取——客户端会自动切换到V2 API完成拉取。所以重点还是解决前面提到的认证、证书或仓库配置问题。
内容的提问来源于stack exchange,提问作者user4889345

