秋栈博客

七月

kubernetes镜像拉取凭证问题

2023-03-13

kubernetes镜像拉取凭证问题

 

POD的错误日志

Failed to pull image "registry.cn-hangzhou.aliyuncs.com/xxx": rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry.cn-hangzhou.aliyuncs.com/xxx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

排查原因

查看pod的资源清单
kubectl get pod  -o yaml
这里可以看到这个pod的spec.serviceAccountName字段未设置,所以Kubernetes自动给他分配了ServiceAccount中的default,default中未附加imagePullSecrets从而导致应用的镜像拉取失败。

创建ImagePullSecrets

Pod 只能引用位于自身所在名字空间中的Secret,因此需要针对每个namespace需要重复执行以下过程。
Kubernetes 支持在 Pod 中设置容器镜像仓库的密钥。 imagePullSecrets 必须全部与 Pod 位于同一个名字空间中。 引用的 Secret 必须是 kubernetes.io/dockercfgkubernetes.io/dockerconfigjson 类型。
kubectl create secret docker-registry docker-secret \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>

基于现有的Docker凭证创建Secret

kubectl create secret generic docker-secret \
--from-file=.dockerconfigjson= \
--type=kubernetes.io/dockerconfigjson

将Secret添加到ServiceAccount

kubectl get secrets -n your-namespace
kubectl patch serviceaccount default -n your-namespace -p '{"imagePullSecrets": [{"name": "docker-secret"}]}'
或手动编辑资源文件
$ kubectl edit serviceaccount/default

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2021-07-07T22:02:39Z
  name: default
  namespace: default
  resourceVersion: "243024" #删除这一行
  uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
#添加如下参数
imagePullSecrets:
  - name: docker-secret

验证ServiceAccount

$ kubectl describe sa default
Name:                default
Namespace:           your-namespace
Labels:              
Annotations:         
Image pull secrets:  docker-secret
Mountable secrets:   default-token-xbfb4
Tokens:              default-token-xbfb4
Events:              

验证imagePullSecrets

kubectl run nginx --image=nginx --restart=Never -n your-namespace
kubectl get pod nginx -o=jsonpath='{.spec.imagePullSecrets[0].name}{"\n"}' -n your-namespace

更推荐的解决方案

以上这种方式需要在所有应用所在的的namespace中设置,并且在凭据更改的时候那么所有应用会失效,此举麻烦且危险。在后续版本中不建议使用。
  • 0