Kubernetes imagePullSecrets不工作;得到"未找到图像"

时间:2015-09-10 19:40:13

标签: docker kubernetes dockerhub

我在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

我创建了一个包含.dockercfg文件的秘密。我已通过运行已发布的here脚本

确认其有效
 > 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

我已经确认我没有使用the new format of .dockercfg script,我的看起来像这样:

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

我试过running the Base64 encode on Debian instead of OS X,那里没有运气。 (它产生的字符串与预期的相同。)

这里是我的复制控制器的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"}

有什么想法吗?

4 个答案:

答案 0 :(得分:15)

Docker在config.json中生成~/.docker/个文件 它看起来像:

{
    "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)前面有https:// 网址
  • 3)一行

然后您 base64 对其进行编码并将其用作.dockercfg名称的数据

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

再次注意.dockercfg行是一行(base64往往会生成一个多行字符串)

答案 1 :(得分:10)

您可能会看到"图片未找到的另一个可能原因"如果你的秘密的命名空间与容器的命名空间不匹配。

例如,如果您的部署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

如果您没有为您的机密指定命名空间,它将最终进入默认命名空间并且不会被使用。没有警告信息。我只是在这个问题上花了好几个小时,所以我想我会在这里分享它,希望我可以节省别人的时间。

答案 2 :(得分:4)

您可能会看到此错误的另一个原因是使用了与群集版本不同的kubectl版本(例如,对于1.8.x群集使用kubectl 1.9.x)。

kubectl create secret docker-registry 命令生成的机密格式在版本之间发生了变化。

1.8.x群集需要使用以下格式的秘密:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section>
  <div class="container">
    <div class="row"></div>
    <div class="row">
      <div class="col-sm-3">
        <div class="myDiv">
          <span></span>
          <span></span>
        </div>
      </div>
      <div class="col-sm-3">
        <div class="myDiv">
          <span>b-1</span>
          <span>b-2</span>
        </div>
      </div>
    </div>
    <div class="row"></div>
  </div>
</section>

<section>
  <div class="container">
    <div class="row">
      <div class="col-sm-12">
        <input type="button" value="ss" id="t">
      </div>
    </div>
  </div>
</section>

但1.9.x kubectl生成的秘密具有以下格式:

{  
   "https://registry.gitlab.com":{  
      "username":"...",
      "password":"...",
      "email":"...",
      "auth":"..."
   }
}

因此,请仔细检查您的密码的.dockercfg数据的值,并验证它是否与您的kubernetes群集版本所期望的格式匹配。

答案 3 :(得分:3)

我一直遇到同样的问题。我注意到的是在示例中(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"
        }
    }
}

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

我确认你,如果你只是采取并编码“auths”,如例子所示,它将适合你。

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