k8s随笔-下载镜像提示未登录问题

部署的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

问题解决。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~