Kubernetes|Kubernetes 访问 docker 仓库失败 no basic auth credentials

一般我们push 镜像 获取pull镜像,需要docker login ,用账号密码登录仓库,同理Kubernetes 部署pod,拉取镜像也需要登录。
首先需要创建一个带有docker 仓库账号密码信息的secret,在部署的yml或json文件中,带上这个secret即可。




在pod上指定ImagePullSecrets
注意: Google Kubernetes Engine,GCE及其他自动创建node的云平台上,推荐使用本方法。
Kubernetes支持在pod中指定仓库密钥。
使用Docker Config创建Secret 运行以下命令,将大写字母代替为合适的值

$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL secret "myregistrykey" created.

如果需要接入多个仓库,可以为每个仓库创建一个secret。 当为pod拉取镜像时,kubelet会将imagePullSecrets合入一个独立虚拟的.docker/config.json
Pod只能引用和它相同namespace的ImagePullSecrets, 所以需要为每一个namespace做配置




通过kubectl创建secret 由于某种原因在一个.docker/config.json中需要多个项或者需要非上述命令给出的secret,可以create a secret using json or yaml。
请保证:
  • 设置data项的名称为.dockerconfigjson
  • 使用base64对docker文件编码,并将字符准确黏贴到data[".dockerconfigjson"]
    cat .docker/config.json| base64
  • 设置typekubernetes.io/dockerconfigjson
示例:
apiVersion: v1 kind: Secret metadata: name: myregistrykey namespace: awesomeapps data: .dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg== type: kubernetes.io/dockerconfigjson

如果收到错误消息error: no objects passed to create,可能是 base64 编码后的字符串非法。 如果收到错误消息类似Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ..., 说明数据已经解码成功,但是不满足.docker/config.json文件的语法。
在pod中引用imagePullSecrets



现在,在创建pod时,可以在pod定义中增加imagePullSecrets小节来引用secret
apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - name: foo image: janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey

对每一个使用私有仓库的pod,都需要做以上操作。
【Kubernetes|Kubernetes 访问 docker 仓库失败 no basic auth credentials】也可以在serviceAccount 资源中设置imagePullSecrets自动设置imagePullSecrets
imagePullSecrets可以和每个node上的.docker/config.json一起使用,他们将共同生效。本方法在Google Kubernetes Engine 也能正常工作。

    推荐阅读