已集成仍报错:如何授权Kubernetes集群拉取DigitalOcean Registry镜像?
解决DigitalOcean Kubernetes集群无法拉取DigitalOcean Registry镜像的问题
问题重现
拉取镜像时触发401未授权错误:
Failed to pull image "registry.digitalocean.com/XXXX/php:1.1.39": rpc error: code = Unknown desc = failed to pull and unpack image "registry.digitalocean.com/XXXXXXX/php:1.1.39": failed to resolve reference "registry.digitalocean.com/XXXXXXX/php:1.1.39": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized
已完成DigitalOcean Registry与Kubernetes集群的控制台集成(双方均显示集成成功),镜像地址确认无误,但集群仍无拉取权限;本地通过Helm登录Registry的操作无效。
解决方案
方案1:修复自动集成的权限关联
DigitalOcean Registry与K8s集群集成后,会自动在kube-system命名空间创建格式为do-registry-<registry-id>的拉取Secret,但可能未自动关联到你的应用ServiceAccount或Deployment:
- 查看集群中的Registry专属Secret:
kubectl get secrets -n kube-system | grep registry
- 选择以下任一方式关联权限:
- 直接将Secret关联到应用使用的ServiceAccount:
注:你的Deployment中使用的ServiceAccount名称可通过模板kubectl patch serviceaccount <你的应用ServiceAccount名称> \ -p '{"imagePullSecrets": [{"name": "<找到的Registry Secret名称>"}]}' \ -n <你的应用命名空间>{{ include "api-platform.serviceAccountName" . }}获取,通常为<release-name>-api-platform- 通过Helm values配置注入到Deployment(见方案2的values配置步骤)
方案2:手动创建imagePullSecret并通过Helm配置
如果自动集成的Secret无法正常工作,可手动创建权限更明确的拉取凭证:
- 在DigitalOcean控制台的Registry设置页面,创建一个仅包含拉取权限的访问令牌。
- 在K8s中创建imagePullSecret:
kubectl create secret docker-registry do-registry-pull-secret \ --docker-server=registry.digitalocean.com \ --docker-username=<你的DigitalOcean账户用户名> \ --docker-password=<刚创建的访问令牌> \ --docker-email=<你的账户邮箱> \ -n <你的应用命名空间>
- 在Helm的
values.yaml中添加以下配置:
imagePullSecrets: - name: do-registry-pull-secret
你的Deployment模板已包含imagePullSecrets注入逻辑,Helm会自动将该配置添加到Pod的Spec中。
问题层面说明
核心是Kubernetes层面的镜像拉取权限配置:K8s需要通过imagePullSecrets完成私有Registry的身份验证。Helm仅作为配置管理工具,负责将imagePullSecrets配置注入到Deployment资源中,简化多环境配置复用。一键集成未生效是因为K8s的ServiceAccount或Pod未正确关联到自动创建的Secret,与Helm本身无关。
内容的提问来源于stack exchange,提问作者Brettins
相关产品推荐
相关产品推荐

