部署的K8S 1.13集群遇到了拉取镜像报错的问题,记录如下。
问题现象
容器启动失败,报错:
Warning Failed 81s (x4 over 2m42s) kubelet, node11 Failed to pull image “registry-team.smzdm.com/php/zhongce_v2:a6fe143087064bd8706d3b8e3dcedc0820e5fe72-1552293874”: rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry-team.smzdm.com/php/zhongce_v2, repository does not exist or may require ‘docker login’
我们已经在宿主机完成了docker login,并且分发了/root/.docker/config.json到所有机器,但仍旧报错。
原理分析
关于docker登录问题,官方说明:https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry。
有2个解决方案:
- 第一种:在宿主机docker login产生config.json即可。
- 第二种:配置type: kubernetes.io/dockerconfigjson的secret,并且在应用的YAML里明确指定imagePullSecrets选项。
为什么我们的第一种方案不好用呢?
解决方案
参考链接:https://github.com/kubernetes/kubernetes/issues/45487#issuecomment-464516064
因为kubelet进程通过systemctl拉起时,没有得到HOME=/root的环境变量,导致kubelet没办法取到/root/.docker/config.json中的认证密钥。
我们需要这样修改,并重启服务:
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- Add
User=root
- systemctl daemon-reload
- systemctl restart kubelet
问题解决。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
