使用Docker Hub的Kubernetes PullImageError与私人图像
我努力让Kubernetes与我的私人hub.docker.comregistry映像一起工作。
我使用kubectl版本: Client Version: version.Info{Major:"1", Minor:"1+", GitVersion:"v1.1.0-alpha.0.1588+e44c8e6661c931", GitCommit:"e44c8e6661c931f7fd434911b0d3bca140e1df3a", GitTreeState:"clean"} Server Version: version.Info{Major:"1", Minor:"1", GitVersion:"v1.1.3", GitCommit:"6a81b50c7e97bbe0ade075de55ab4fa34f049dc2", GitTreeState:"clean"}
和Mac OS X上的Vagrant 1.7.4
Yosemite 10.10.5
我按照这里给出的指示: https : //github.com/kubernetes/kubernetes/blob/release-1.1/docs/user-guide/images.md#pre-pulling-images
简而言之,它说你应该login到registry,然后base64编码生成的.docker/config.json
的内容,并在yaml文档中使用它,如下所示:
apiVersion: v1 kind: Secret metadata: name: myregistrykey data: .dockercfg: eyAiYXV0aHMiOiB7ICJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOiB7ICJhdXRoIjogImFXNTBjbWx1YzJsak9tSTJVVTR5Z...h1YkBpbnRyaW5zaWMud29ybGQiIH0gfSB9Cg== type: kubernetes.io/dockercfg
然后喂给kubectl。 然后我在我的pod定义中使用生成的密钥(这里称为myregistrykey
):
apiVersion: v1 kind: Pod metadata: name: authorities-backend spec: containers: - name: authorities-backend image: intrinsic/authorities-backend:latest imagePullSecrets: - name: myregistrykey
和kubectl create
它。
但是,kubectl不能检索图像:
[root@kubernetes-master intrinsic]# kubectl get pods NAME READY STATUS RESTARTS AGE authorities-backend 0/1 PullImageError 0 7m
docker上的Kubernetes大师拉工作。
我错过了什么?
UPDATE
在上面的pod定义中,我没有指定registry主机,即docker.io。 修复它,它变成: image: docker.io/intrinsic/authorities-backend:latest
然而,问题依然存在。 做kubectl get events -w
得到我: 6s 0s 2 authorities-backend Pod spec.containers{authorities-backend} Failed {kubelet 10.245.1.3} Failed to pull image "docker.io/intrinsic/authorities-backend": image pull failed for docker.io/intrinsic/authorities-backend, this may be because there are no credentials on this request. details: (Error: image intrinsic/authorities-backend:latest not found)
6s 0s 2 authorities-backend Pod spec.containers{authorities-backend} Failed {kubelet 10.245.1.3} Failed to pull image "docker.io/intrinsic/authorities-backend": image pull failed for docker.io/intrinsic/authorities-backend, this may be because there are no credentials on this request. details: (Error: image intrinsic/authorities-backend:latest not found)
我知道秘密已经正确注册,因为我有它在kubectl get secrets
: NAME TYPE DATA AGE default-token-a7s5n kubernetes.io/service-account-token 2 51m myregistrykey kubernetes.io/dockercfg 1 50m
仍然困惑…
憨
该文档是过时的,因为它指的是.dockercfg
而不是.docker/config.json
。 我会更新它。
当您使用新的.docker/config.json
格式时,您需要设置type: kubernetes.io/dockerconfigjson
而不是type: kubernetes.io/.dockercfg
。
支持type: kubernetes.io/dockerconfigjson
是v1.1.0中添加的,所以它被你的服务器支持,但是不被你的客户端(v1.1.0-alpha在v1.1.0之前)支持。
当你使用type: kubernetes.io/dockerconfigjson
,它应该validation你的秘密内容。
使用type: kubernetes.io/dockerconfigjson
,您确实需要保留auths
包装器。
所以,我一直在研究networking上的问题的答案,并最终发现这一点:
https://github.com/kubernetes/kubernetes/issues/7954#issuecomment-115241561
在线的最后,jjw27钉了它。 kubernetes文档提到.dockercfg.json
文件只是说它的内容需要base64编码。 这个文件实际上有两个问题:
- 它看起来像变成了另一个文件,即
.docker/config.json
- 在这个文件中的authentication信息是由一个额外的
auths
对象包装,你必须摆脱。
引用jjw27
不工作:
{ "auths": { "hub.example.com:1024": { "auth": "asdf=", "email": "example@example.com" } } }
工作:
{ "hub.example.com:1024": { "auth": "asdf=", "email": "example@example.com" } }
谷歌,请更新这个文件!
给Kubernetes开发人员的消息#2:另外,不抱怨格式不正确的base64编码的秘密是非常误导。 请validation用户input,并在出现错误时提出投诉。