kubernetes部署应用时从harbor拉取镜像失败:repository does not exist or may require ‘docker login‘

问题描述:

kubernetes部署应用时,pod启动失败,通过kubectl describe pod查看失败原因类似下面的错误:

Failed to pull image "xxxx/oneapi-2/authtenantserver:15": rpc error: code = Unknown desc = Error response from daemon: pull access denied for xxxx/oneapi-2/authtenantserver, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

排查方法及解决思路:

1.根据错误描述,先去harbor上看要拉取的镜像是否存在,如果不存在则可能是由于镜像不存在导致的。

2.如果harbor上已经存在镜像,则在pod所在的服务器上用docker pull命令尝试看看能否拉取到本地,如果不能拉取,说明没有权限,需要执行docker login。

3.执行docker login后,再次在服务器上执行docker pull看是否可以正常拉取镜像。

4.如果本地可以正常拉取了,则在kubernetes上重新部署看看是否可以正常拉取镜像了。

5.如果kubernetes还是报上面的错误,则需要将docker login后生成的/root/.docker/config.json文件复制到/var/lib/kubelet/config.json。然后在kubernetes上重新部署即可正常拉取镜像。

注意:上面排查过程中重新部署时要确保pod部署在原来的节点上。

说明:通过上面的过程找到拉取镜像失败的真正原因,如果是因为步鄹5导致的,那在kubernetes上重启pod,这时让pod部署到集群其他节点上,检查kubernetes集群的其他节点是否也存在同样的问题,如果存在的话,则kubernetes集群的所有节点都需要执行步鄹5。