2015-09-10 7 views
8

Ho un cluster Kubernetes disponibile in esecuzione su AWS, installato con lo script kube-up. Vorrei eseguire alcuni contenitori che si trovano in un repository Docker Dock privato. Ma continuo a ricevere un errore "non trovato":Kubernetes imagePullSecrets non funziona; ottenere "immagine non trovata"

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

Ho creato un segreto che contiene un file .dockercfg. Ho confermato che funziona eseguendo lo script pubblicato 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 

Ho confermato non sto usando the new format of .dockercfg script, miniera assomiglia a questo:

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

Ho provato running the Base64 encode on Debian instead of OS X, no fortuna lì. (Produce la stessa stringa, come ci si potrebbe aspettare.)

Ecco il YAML per il mio controller di replica:

--- 
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"} 

Tutte le idee?

+1

Nel tuo esempio si sta tirando due immagini diverse - Hai provato tirando maestro? – Clayton

+0

Buona cattura - esegue nuovamente il comando con l'immagine corretta. Stesso risultato – iameli

+0

Sto vivendo lo stesso problema .. hai trovato la soluzione? – leonfs

risposta

11

Docker genera un file config.json in ~/.docker/ Assomiglia:

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

quello che realmente vuole è:

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

nota 3 cose:

  • 1) c'è no auths avvolgimento
  • 2) v'è https:// davanti alla URL
  • 3) è una linea

allora si Base64 codificare questo e utilizzare come dati per il .dockercfg nome

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

Nota nuovamente la linea .dockercfg è una linea (base64 tende a generare una linea multipla stringa)

+1

Mi hai trovato alla soluzione: il mio problema era che il mio segreto era 'type: Opaque' invece di' type: kubernetes.io/dockercfg'. Saluti. – iameli

3

Ho riscontrato lo stesso problema. Quello che ho notato è che nell'esempio (https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod) .dockercfg ha il seguente formato:

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

mentre quello generato dalla finestra mobile nella mia macchina simile a questa:

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

Controllando a il codice sorgente, ho trovato che c'è effettivamente un test per questo caso d'uso (https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go#L280)

Confermo che se si prende e si codifica "auth", come nell'esempio, funzionerà per voi.

Probabilmente la documentazione deve essere aggiornata. Io solleverò un ticket su GitHub.

+0

Hmm - non ha risolto il mio problema. Credo di aver provato entrambi i formati in origine. – iameli

6

Un'altra possibile ragione per cui si potrebbe vedere "immagine non trovata" è se lo spazio dei nomi del tuo segreto non corrisponde lo spazio dei nomi del contenitore.

Ad esempio, se il yaml distribuzione si presenta come

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

Quindi è necessario assicurarsi che il segreto yaml utilizza uno spazio dei nomi corrispondenti:

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

Se non si specifica uno spazio dei nomi per la vostra segreto, finirà nello spazio dei nomi predefinito e non verrà utilizzato. Non c'è un messaggio di avviso. Ho passato ore su questo argomento, quindi ho pensato di condividerlo qui con la speranza di poter salvare qualcun altro il tempo.

+0

Ho esattamente lo stesso problema qui. L'unica differenza è che in realtà DESIDERO che il segreto si trovi nello spazio dei nomi predefinito perché non voglio crearlo per tutti gli spazi dei nomi. C'è un modo per fare riferimento a un segreto lo spazio dei nomi predefinito mentre l'ingresso viene creato all'interno di uno spazio dei nomi? – Randy

3

Un altro motivo si potrebbe vedere questo errore è dovuto all'utilizzo di una versione kubectl diversa rispetto alla versione di cluster (ad esempio utilizzando kubectl 1.9.x contro un cluster 1.8.x).

Il formato del segreto generato dal comando kubectl per creare la finestra mobile docker è stato modificato tra le versioni.

Un cluster 1.8.x si aspettano un segreto con il formato:

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

Ma il segreto generato dal kubectl 1.9.x ha questo formato:

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

Quindi, doppio controllo il valore dei dati .dockercfg del tuo segreto e verifica che corrisponda al formato previsto dalla versione del cluster di Kubernetes.

+0

Grazie mille, questo ha davvero risolto il mio problema. Mi sono divertito con minikube su windows, e mentre cioccolatoso installa la versione 1.9 di kubectl-cli per impostazione predefinita, minikube per Windows è ancora 1.8. Eseguire sempre la versione di kubectl e ricontrollare le versioni corrispondenti. – schrom

+0

Questa dovrebbe essere la risposta accettata. La risposta di MrE è sulla strada giusta, ma non menziona ** perché ** il formato è diverso. Grazie mille eschnou, hai finalmente risolto il problema che mi ha fatto sbattere la testa contro il muro per 2 giorni. – PeterH