TKE集群pod镜像拉取失败定位思路

时间:2022-07-24
本文章向大家介绍TKE集群pod镜像拉取失败定位思路,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一般我们在部署服务的时候会遇到一些镜像拉取失败的问题,这里简单讲述下如何定位解决这类镜像拉取失败的问题,大致的定位思路如下

常见的镜像拉取报错:

  • imagePullBackoff
  • imagelnspectError
  • ErrImagePull
  • ErrImageNeverPull
  • RegistryUnavailable
  • InvalidImageName

1. 节点上是否可以拉取镜像

如果pod运行拉取镜像失败,可以先确认下节点是否可以拉取镜像成功,因为pod运行也是调用节点docker拉取镜像到节点上,然后运行,如果节点拉取镜像失败,pod肯定会启动失败。

节点拉取镜像失败可以看下是拉取内网仓库还是外网镜像,如果是外网确定下节点是否能访问互联网,如果是内网看下能否登陆内网仓库地址。

TCR仓库有访问白名单,确认下节点是否在配置的仓库白名单内。

2. 仓库秘钥是否创建

节点可以拉取镜像,但是在运行pod却拉取镜像失败,这里大部分原因是pod没有配置仓库的登录秘钥。

如果是拉取ccr上的私有镜像,这里可以看下集群中命名空间的qcloudregistrykey秘钥是否有下发,没有下发则点击下发。

如果是拉取TCR或者其他的镜像仓库,这里需要自己先新建secret,这里填写secret名称,所要下发的命名空间,仓库地址,登录的账号和用户名,创建成功后再按照上一步在负载中配置创建的secret即可。

3. 仓库秘钥是否在yaml中有配置

这里我们需要在yaml中通过imagePullSecrets来指定拉取镜像的秘钥,这里可以直接修改yaml或者在控制台进行配置

4. 仓库的秘钥对应的账号密码是否正确

如果上述步骤排查都没问题,节点拉取镜像没问题,仓库秘钥也有在yaml中配置。

  • 这里首先检查下对应命名空间下有没有secret,有可能ns是新建的秘钥没有下发,确认下镜像仓库的拉取秘钥在你部署服务的命名空间存在。
  • 查看镜像的secret,然后解码下,检查下镜像仓库地址,用户名和密码是否正确。这里我们以qcloudregistrykey为例
[root@VM_1_4_centos ~]# kubectl get secret -n default qcloudregistrykey -o yaml
apiVersion: v1
data:
  .dockercfg: eyJjY3IuY2NzLnRlbmNlbnR5dW4uY29tjoie0FwcGxpY2F0aW9uVG9rZW46Nzg3Yjg2NDlkMjI4MDc2ZGNhNmVjYmE0NDcxNWNjNWZ9IiwiZW1haWwiOiIyMTU5OTczNDE3QHFxLmNvbSIsImF1dGgiOiJNakUxT1RrM016UXhOenA3UVhCd2JHbGpZWFJwYjI1VWIydGxiam8zT0RkaU9EWTBPV1F5TWpnd056WmtZMkUyWldOaVlUUTBOekUxWTJNMVpuMD0ifX0=
kind: Secret
metadata:
  creationTimestamp: "2020-06-02T03:22:49Z"
  labels:
    qcloud-app: qcloudregistrykey
  name: qcloudregistrykey
  namespace: default
  resourceVersion: "8573245592"
  selfLink: /api/v1/namespaces/default/secrets/qcloudregistrykey
  uid: 55de0f5d-a480-11ea-8fe7-0a5ffefb2e9f
type: kubernetes.io/dockercfg
[root@VM_1_4_centos ~]# echo "eyJjY3IuY2NzLnRlJuYW1lIjoiMjE1OTk3MzQxNyIsInBhc3N3b3JkIjoie0FwcGxpY2F0aW9uVG9rZW46Nzg3Yjg2NDlkMjI4MDc2ZGNhNmVjYmE0NDcxNWNjNWZ9IiwiZW1haWwiOiIyMTU5OTczNDE3QHFxLmNvbSIsImF1dGgiOiJNakUxT1RrM016UXhOenA3UVhCd2JHbGpZWFJwYjI1VWIydGxiam8zT0RkaU9EWTBPV1F5TWpnd056WmtZMkUyWldOaVlUUTBOekUxWTJNMVpuMD0ifX0=" 
| base64 -d
{"ccr.ccs.tencentyun.com":{"username":"2597","password":"{ApplicationToken:787b8649d228076dca6ecba44715cc5f}","email":"21417@qq.com","auth":"MjE1OTk3MzQxNzp7QXBwbGljYXRpb25Ub2tlbE2ZWNiYTQ0NzE1Y2M1Zn0="}}
  • 如果配置没问题,那么有可能是你使用的访问仓库账号密码是临时的,TCR会提供临时的访问凭证和永久访问凭证,这里需要永久的访问凭证登录信息。

常见问题

1. mac登录ccr镜像仓库报错

sudo docker login --username=xxxx ccr.ccs.tencentyun.com
Password:
Sorry, try again.
Password:
Sorry, try again.
Password:
sudo: 3 incorrect password attempts

解决方案:客户用了sudo了 所以显示的Password是要输入你的系统密码。。。 输入之后 还会显示Password然后再输入仓库密码,这边登录命令去掉sudo

2. 上传镜像到CCR失败报tag达到了上限

ccr上的镜像tag有限制一般是100个,如果达到了上限需要删除旧镜像tag或者提交工单帮忙提升下配额

3. 拉取某个镜像仓库的镜像没权限

需要在CAM中给子账号赋予对应镜像仓库的pull权限

4. docker拉取镜像失败报错域名解析失败

Failed to pull image "ccr.ccs.tencentyun.com/mtp-light/light-web:light_base_container": rpc error: code = Unknown desc = Error response from daemon: Get https://ccr.ccs.tencentyun.com/v2/: dial tcp: lookup ccr.ccs.tencentyun.com on 183.60.82.98:53: write udp 10.155.0.6:38639->183.60.82.98:53: write: operation not permitted Failed to pull image "ccr.ccs.tencentyun.com/mtp-light/light-web:light_base_container": rpc error: code = Unknown desc = Error response from daemon: Get https://ccr.ccs.tencentyun.com/v2/: dial tcp: lookup ccr.ccs.tencentyun.com on 183.60.82.98:53: no such host

解析域名发现报错

查看message日志

调整conntrack参数