Kubernetes PullImageError using Docker Hub with a private image
Kubernetes PullImageError using Docker Hub with a private image
我正在努力让 Kubernetes 与我的私有 hub.docker.com 注册表映像一起工作。
我使用的 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"}
和 Vagrant 1.7.4
在 Mac OS X Yosemite 10.10.5
我按照此处给出的说明进行操作:https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/user-guide/images.md#pre-pulling-images
简而言之,它说您应该登录注册表,然后对结果 .docker/config.json
的内容进行 base64 编码,并在 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 master 上拉动但是工作。
我错过了什么?
更新
在上面的 pod 定义中,我省略了指定注册表主机,即 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)
我知道秘密已经正确注册,因为我在 kubectl get secrets
下有它:
NAME TYPE DATA AGE
default-token-a7s5n kubernetes.io/service-account-token 2 51m
myregistrykey kubernetes.io/dockercfg 1 50m
还是一头雾水...
老实人
所以,我一直在网上搜索我的问题的答案,最终找到了这个:
https://github.com/kubernetes/kubernetes/issues/7954#issuecomment-115241561
在线程的最后,jjw27 钉了钉子。 kubernetes documentation 提到 .dockercfg.json
文件只是说它的内容需要进行 base64 编码。这个文件实际上有两个问题:
- 看起来它实际上变成了另一个文件,即
.docker/config.json
- 此文件中的身份验证信息由一个额外的
auths
对象包装,您必须将其删除。
引用 jjw27
没有成功:
{
"auths": {
"hub.example.com:1024": {
"auth": "asdf=",
"email": "example@example.com"
}
}
}
工作:
{
"hub.example.com:1024": {
"auth": "asdf=",
"email": "example@example.com"
}
}
Google,请更新此文档!!
给 Kubernetes 开发者的消息 #2:另外,不抱怨格式错误的 base64 编码的秘密是非常误导的。请验证用户输入,如果有错误请投诉。
文档已过时,因为它引用 .dockercfg
而不是 .docker/config.json
。我会更新的。
当您使用新的 .docker/config.json
格式时,您需要设置 type: kubernetes.io/dockerconfigjson
而不是 type: kubernetes.io/.dockercfg
。
在 v1.1.0 中添加了对 type: kubernetes.io/dockerconfigjson
的支持,因此您的服务器支持它,但您的客户端(即 v1.1.0-alpha,早于 v1.1.0)不支持。
当您使用 type: kubernetes.io/dockerconfigjson
时,它应该会验证您的秘密内容。
对于 type: kubernetes.io/dockerconfigjson
,您确实希望保留 auths
包装器。
我正在努力让 Kubernetes 与我的私有 hub.docker.com 注册表映像一起工作。
我使用的 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"}
和 Vagrant 1.7.4
在 Mac OS X Yosemite 10.10.5
我按照此处给出的说明进行操作:https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/user-guide/images.md#pre-pulling-images
简而言之,它说您应该登录注册表,然后对结果 .docker/config.json
的内容进行 base64 编码,并在 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 master 上拉动但是工作。
我错过了什么?
更新
在上面的 pod 定义中,我省略了指定注册表主机,即 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)
我知道秘密已经正确注册,因为我在 kubectl get secrets
下有它:
NAME TYPE DATA AGE
default-token-a7s5n kubernetes.io/service-account-token 2 51m
myregistrykey kubernetes.io/dockercfg 1 50m
还是一头雾水...
老实人
所以,我一直在网上搜索我的问题的答案,最终找到了这个:
https://github.com/kubernetes/kubernetes/issues/7954#issuecomment-115241561
在线程的最后,jjw27 钉了钉子。 kubernetes documentation 提到 .dockercfg.json
文件只是说它的内容需要进行 base64 编码。这个文件实际上有两个问题:
- 看起来它实际上变成了另一个文件,即
.docker/config.json
- 此文件中的身份验证信息由一个额外的
auths
对象包装,您必须将其删除。
引用 jjw27
没有成功:
{
"auths": {
"hub.example.com:1024": {
"auth": "asdf=",
"email": "example@example.com"
}
}
}
工作:
{
"hub.example.com:1024": {
"auth": "asdf=",
"email": "example@example.com"
}
}
Google,请更新此文档!!
给 Kubernetes 开发者的消息 #2:另外,不抱怨格式错误的 base64 编码的秘密是非常误导的。请验证用户输入,如果有错误请投诉。
文档已过时,因为它引用 .dockercfg
而不是 .docker/config.json
。我会更新的。
当您使用新的 .docker/config.json
格式时,您需要设置 type: kubernetes.io/dockerconfigjson
而不是 type: kubernetes.io/.dockercfg
。
在 v1.1.0 中添加了对 type: kubernetes.io/dockerconfigjson
的支持,因此您的服务器支持它,但您的客户端(即 v1.1.0-alpha,早于 v1.1.0)不支持。
当您使用 type: kubernetes.io/dockerconfigjson
时,它应该会验证您的秘密内容。
对于 type: kubernetes.io/dockerconfigjson
,您确实希望保留 auths
包装器。