web-dev-qa-db-ja.com

Kubernetes imagePullSecretsが機能していません。 「画像が見つかりません」を取得

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

私は 。dockercfgスクリプトの新しい形式 を使用していないことを確認しました。私のものは次のようになります。

> cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"[email protected]"}}

私は試しました OS Xの代わりにDebianでBase64エンコードを実行 、そこでは運がありません。 (予想通り、同じ文字列が生成されます。)

これが私のレプリケーションコントローラの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"}

何か案は?

15
iameli

Dockerはconfig.json~/.docker/ファイルを生成します。

{
    "auths": {
        "index.docker.io/v1/": {
            "auth": "ZmFrZXBhc3N3b3JkMTIK",
            "email": "[email protected]"
        }
    }
}

あなたが実際に欲しいのは:

{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "[email protected]"}}

3つのことに注意してください。

  • 1)authsラッピングはありません
  • 2)URLの前にhttps://があります
  • 3)それは1行

次にbase64エンコードし、.dockercfg名のデータとして使用します

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

.dockercfg行は1行であることに再度注意してください(base64は複数行の文字列を生成する傾向があります)

15
MrE

「画像が見つかりません」と表示されるもう1つの理由として、シークレットの名前空間がコンテナの名前空間と一致していないことが考えられます。

たとえば、Deployment 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

シークレットの名前空間を指定しないと、デフォルトの名前空間になり、使用されません。警告メッセージはありません。私はこの問題に何時間も費やしたので、誰か他の人の時間を節約できることを願ってここで共有したいと思いました。

11
amarillion

このエラーが表示されるもう1つの理由は、クラスターバージョンとは異なるkubectlバージョンを使用しているためです(例:1.8.xクラスターに対してkubectl 1.9.xを使用)。

kubectl create secret docker-registryコマンドによって生成されるシークレットの形式は、バージョン間で変更されました。

1.8.xクラスターは、次の形式のシークレットを想定しています。

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

しかし、1.9.x kubectlによって生成されたシークレットは次の形式です。

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

したがって、シークレットの.dockercfgデータの値を再確認し、それがkubernetesクラスターバージョンで想定されている形式と一致していることを確認してください。

4
eschnou

同じ問題が発生しています。私が気付いたのは、例( https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod ).dockercfgの形式が次のとおりであることです。 :

{ 
   "https://index.docker.io/v1/": { 
     "auth": "ZmFrZXBhc3N3b3JkMTIK", 
     "email": "[email protected]" 
   } 
}

私のマシンのドッカーによって生成されたものは次のようになりますが:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "ZmFrZXBhc3N3b3JkMTIK",
            "email": "[email protected]"
        }
    }
}

ソースコードを確認したところ、実際にこのユースケースのテストがあることがわかりました( https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go# L28

例のように「auths」を取得してエンコードするだけで問題なく動作することを確認しました。

おそらくドキュメントを更新する必要があります。 githubでチケットを上げます。

3
leonfs