Kubernetes imagePullSecrets不起作用; 得到“图像未find”

我在AWS上运行了一个现成的Kubernetes集群,并安装了kube-up脚本。 我想运行在私人Docker Hub存储库中的一些容器。 但是我不断收到“找不到”的错误:

  > kubectl get pod NAME READY STATUS RESTARTS AGE maestro-kubetest-d37hr 0/1 Error: image csats/maestro:latest not found 0 22m 

我创build了一个包含.dockercfg文件的秘密。 我已经通过运行在这里发布的脚本确认它的工作原理:

  > kubectl get secrets docker-hub-csatsinternal -o yaml | grep dockercfg: | cut -f 2 -d : | base64 -D > ~/.dockercfg > docker pull csats/maestro latest: Pulling from csats/maestro 

我已经确认我没有使用.dockercfg脚本的新格式 ,我的看起来像这样:

 > cat ~/.dockercfg {"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"eng@csats.com"}} 

我试过在Debian上运行Base64编码,而不是在OS X上运行 。 (它可能会产生相同的string。)

这是我的复制控制器的YAML:

 --- kind: "ReplicationController" apiVersion: "v1" metadata: name: "maestro-kubetest" spec: replicas: 1 selector: app: "maestro" ecosystem: "kubetest" version: "1" template: metadata: labels: app: "maestro" ecosystem: "kubetest" version: "1" spec: imagePullSecrets: - name: "docker-hub-csatsinternal" containers: - name: "maestro" image: "csats/maestro" imagePullPolicy: "Always" restartPolicy: "Always" dnsPolicy: "ClusterFirst" 

kubectl version

 Client Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"} Server Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"} 

有任何想法吗?

Docker在~/.docker/生成一个config.json文件:

 { "auths": { "index.docker.io/v1/": { "auth": "ZmFrZXBhc3N3b3JkMTIK", "email": "email@company.com" } } } 

你真正想要的是:

 {"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "email@company.com"}} 

注意3件事情:

  • 1)没有auths包装
  • 2)在URL前面有https://
  • 3)这是一条线

然后你base64编码并用作.dockercfg名称的数据

 apiVersion: v1 kind: Secret metadata: name: registry data: .dockercfg: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== type: kubernetes.io/dockercfg 

再次注意.dockercfg行是一行 (base64倾向于生成一个多行string)

你可能会看到“image not found”的另一个可能的原因是你的秘密的命名空间与容器的命名空间不匹配。

例如,如果您的部署yaml看起来像

 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mydeployment namespace: kube-system 

那么你必须确保Secret yaml使用一个匹配的命名空间:

 apiVersion: v1 kind: Secret metadata: name: mysecret namespace: kube-system data: .dockerconfigjson: **** type: kubernetes.io/dockerconfigjson 

如果不为秘密指定一个名称空间,它将以默认名称空间结束,并且不会被使用。 没有警告信息。 我只是在这个问题上花了几个小时,所以我想我会在这里分享它,希望我可以节省时间。

我一直在遇到同样的问题。 我注意到的是,在示例中( https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod).dockercfg具有以下格式:

 { "https://index.docker.io/v1/": { "auth": "ZmFrZXBhc3N3b3JkMTIK", "email": "jdoe@example.com" } } 

而我的机器中的docker生成的看起来像这样:

 { "auths": { "https://index.docker.io/v1/": { "auth": "ZmFrZXBhc3N3b3JkMTIK", "email": "email@company.com" } } } 

通过检查源代码,我发现实际上有一个testing用例( https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go#L280

我向你确认,如果你只是采取和编码“身份validation”,如在例子中,它会为你工作。

应该更新文档。 我将在github上提出一张票。