文章目录

  • 一 可能原因
  • 二 排查方法
  • 2.1 检查 HTTP 类型 Registry 地址是否加入 insecure-registry
  • 2.2 检查 HTTPS 自签发类型 `Registry CA` 证书是否未添加至节点
  • 2.3 检查私有镜像仓库配置
  • 2.4 检查镜像文件是否损坏
  • 2.5 检查镜像是否拉取超时
  • 2.5.1 现象描述
  • 2.5.2 解决思路
  • 2.6 检查镜像是否存在


一 可能原因

  1. HTTP 类型 Registry 地址未加入 insecure-registry
  2. HTTPS 自签发类型 Registry CA 证书未添加至节点
  3. 私有镜像仓库认证失败
  4. 镜像文件损坏
  5. 镜像拉取超时
  6. 镜像不存在

二 排查方法

2.1 检查 HTTP 类型 Registry 地址是否加入 insecure-registry
  • Dockerd 默认从 HTTPS 类型的 Registry 拉取镜像。当您使用 HTTP 类型的 Registry 时,请确保已将其地址添加到 insecure-registry 参数中,并重启或 reload Dockerd 使其生效。
2.2 检查 HTTPS 自签发类型 Registry CA 证书是否未添加至节点
  1. 当您使用 HTTPS 类型 Registry 且其证书属于自签发证书时,Dockerd 将会校验该证书,只有校验成功才可以正常使用镜像仓库。
  2. 为确保校验成功,需要将 Registry 的 CA 证书放置到以下位置:
/etc/docker/certs.d/<Registry:port>/ca.crt
2.3 检查私有镜像仓库配置

若 Pod 未配置 imagePullSecret、配置的 Secret 不存在或者有误都会造成 Registry 认证失败,使 Pod 一直处于 ImagePullBackOff 状态。

2.4 检查镜像文件是否损坏

若 Push 的镜像文件损坏,下载成功后也不能正常使用,则需要重新 push 镜像文件。

2.5 检查镜像是否拉取超时
2.5.1 现象描述
  1. 当节点上同时启动大量 Pod 时,可能会导致容器镜像下载需要排队。假设下载队列靠前位置已有许多大容量镜像且需较长的下载时间,则会导致排在队列靠后的 Pod 拉取超时。
  2. 默认情况下,kubelet 支持串行下载镜像。如下所示:
--serialize-image-pulls   Pull images one at a time. We recommend *not* changing the default value on nodes that run docker daemon with version < 1.9 or an Aufs storage backend. Issue #10959 has more details. (default true)
2.5.2 解决思路

必要情况下,为避免 Pod 拉取超时,可开启并行下载及控制并发。示例如下:

--Registry-qps int32   If > 0, limit Registry pull QPS to this value.  If 0, unlimited. (default 5)
--Registry-burst int32   Maximum size of a bursty pulls, temporarily allows pulls to burst to this number, while still not exceeding Registry-qps. Only used if --Registry-qps > 0 (default 10)
2.6 检查镜像是否存在
  1. 镜像本身不存在也会导致 Pod 一直处于 ImagePullBackOff 状态,可以通过 kubelet 日志进行确认。如下所示:
PullImage "imroc/test:v0.2" from image service failed: rpc error: code = Unknown desc = Error response from daemon: manifest for imroc/test:v0.2 not found
  1. 处理数据的函数和方法。