kubernetes镜像拉取凭证问题
7
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这里可以看到这个pod的spec.serviceAccountName字段未设置,所以Kubernetes自动给他分配了ServiceAccount中的default,default中未附加-o yaml
imagePullSecrets
从而导致应用的镜像拉取失败。
创建ImagePullSecrets
Pod 只能引用位于自身所在名字空间中的Secret,因此需要针对每个namespace需要重复执行以下过程。Kubernetes 支持在 Pod 中设置容器镜像仓库的密钥。
imagePullSecrets
必须全部与 Pod 位于同一个名字空间中。 引用的 Secret 必须是 kubernetes.io/dockercfg
或 kubernetes.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
-
分享