接上次文章的补充:
 
1.检查问题所在
Kubectl describe po pod-name
Failed create pod sandbox: rpc error: code = Unknown desc = failed pulling image ...
Error response from daemon: pull access denied for ...
repository does not exist or may require 'docker login'
这是因为没有正确配置导致pull权限所致
~/.docker/config.json 无效
这是一个坑,因为和docker swarm完全不同的是在yaml和helm 中pull镜像的时候完全不会去参考config.json这个文件
解决方案:
使用 imagePullSecrets(注意:这个也是看namespace的)
kubectl create secret docker-registry regcred \
    --docker-server=harbor.shub.us/\
    --docker-username=<your name> \
    --docker-password=<your pword> \
    --namespace=<your namespace>

有的时候创建了还是不行

即使创建了  secrets  、配置了  imagePullSecrets  ,有时仍然无法  pull  镜像。 比如  Calico  的相关镜像,如果被同步到了本地一个私有Registry中,一般配置时无效的。
这是因为,  Calico  属于系统Network组件,  Namespace  是  kube-system  。 而一般创建的  secrets  ,属于  default  。 通过以下命令可以查看特定  secrets  的详细信息。
# kubectl get secret regcred -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHRwOi8vaGFyYm9yLnR1cmluZy1jaS5oaXNpbGljb24uY29tIjp7IlVzZXJuYW1lIjoiY2hyaXN0b3BoZXIiLCJQYXNzd29yZCI6IlFpZGRZYWZkQmF2YTYjIiwiRW1haWwiOiJ5MDA0NDU0ODBAbm90ZXNtYWlsLmh1YXdlaS5jb20ifX19
kind: Secret
metadata:
  creationTimestamp: "2019-01-10T08:51:03Z"
  name: regcred
<mark>  namespace: default</mark>
  resourceVersion: "100110"
  selfLink: /api/v1/namespaces/default/secrets/regcred
  uid: dc96580b-14b4-11e9-9f81-e435c87f8d90
type: kubernetes.io/dockerconfigjson

 

这边还会出现一个问题,就是每个文件中都要添加这个secret 才能正常的下载镜像,这个其实比较繁琐,利用patch 就可以解决这个问题。
kubectl patch serviceaccount fat -p '{"imagePullSecrets": [{"name": "regcred"}]}'
这个就相当于在fat这个命名空间下所有的pull 操作都会具备这个regcred这个账户的吗。
完全做到和docker login一样。
某些特例的场景例如calico的环境下就必须老老实实的去写imagePullSecrets.
 
 

对k8s系统镜像无效

系统镜像中,  kube-proxy  、  pause  是在所有Slave节点都需要使用的。 如果这些系统镜像被设为私有,则无法下载。 以上方法无效,原因不明。
所以,k8s系统镜像,即使同步到了本地Registry,也不要设为私有。
Logo

开源、云原生的融合云平台

更多推荐