如何解决Kubernetes部署过程中出现的ErrImagePull镜像拉取错误
问题原因
你遇到的报错是Docker Hub的匿名用户拉取速率限制触发导致的:Docker Hub对未认证的匿名用户限制每6小时最多拉取100次镜像,已认证的免费用户限制每6小时200次。你本地手动pull镜像正常,是因为本地Docker客户端已经登录过Docker Hub账号,走的是认证用户的配额;而Kubernetes集群节点默认用匿名身份拉取公共镜像,配额耗尽就会触发该报错,报错原文如下:
rpc error: code = Unknown desc = Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
解决方案
方案1:为K8s工作负载配置Docker Hub认证密钥(最推荐)
- 首先在集群中创建Docker Registry认证类型的Secret,替换命令中的占位符为你自己的Docker Hub账号信息:
kubectl create secret docker-registry dockerhub-auth \ --docker-server=docker.io \ --docker-username=<你的Docker Hub用户名> \ --docker-password=<你的Docker Hub密码> \ --docker-email=<你的Docker Hub绑定邮箱>
- 在Deployment/StatefulSet等工作负载的YAML配置中添加
imagePullSecrets字段,关联刚才创建的认证密钥即可:
spec: template: spec: imagePullSecrets: - name: dockerhub-auth # 和上面创建的Secret名称一致 containers: - name: 你的容器名称 image: 你使用的镜像地址 # 其余原有配置保持不变
配置完成后重新部署工作负载,就会走认证用户的拉取配额,规避匿名用户的速率限制。
方案2:集群节点全局配置Docker认证
如果集群所有节点都需要频繁拉取Docker Hub镜像,可以直接在每个节点上登录Docker Hub账号,该配置对节点上所有拉取镜像的操作全局生效:
- 登录每台K8s工作节点,执行命令,按提示输入用户名密码即可:
docker login docker.io
方案3:私有镜像仓库缓存镜像
把需要用到的Docker Hub公共镜像提前同步到你内部私有的镜像仓库,K8s直接拉取私有仓库的镜像,完全规避Docker Hub的速率限制。
内容的提问来源于stack exchange,提问作者Bazinga_
相关产品推荐
相关产品推荐

