2015-12-15 14 views
7

Non riesco a far funzionare Kubernetes con la mia immagine privata del registro hub.docker.com.Kubernetes PullImageError using Docker Hub con un'immagine privata

Sto usando la versione 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"}

e Vagrant 1.7.4 su Mac OS X Yosemite 10.10.5

Ho seguito le istruzioni qui riportate: https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/user-guide/images.md#pre-pulling-images

In poche parole, si dice che si dovrebbe effettuare l'accesso al il registro quindi base64 codifica il contenuto dello .docker/config.json risultante e lo utilizza in un documento yaml come segue:

apiVersion: v1 
kind: Secret 
metadata: 
    name: myregistrykey 
data: 
    .dockercfg: eyAiYXV0aHMiOiB7ICJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOiB7ICJhdXRoIjogImFXNTBjbWx1YzJsak9tSTJVVTR5Z...h1YkBpbnRyaW5zaWMud29ybGQiIH0gfSB9Cg== 
type: kubernetes.io/dockercfg 

Quindi invia questo a kubectl. Ho quindi utilizzato la chiave risultante (qui chiamato myregistrykey) nella mia definizione pod:

apiVersion: v1 
kind: Pod 
metadata: 
    name: authorities-backend 
spec: 
    containers: 
    - name: authorities-backend 
     image: intrinsic/authorities-backend:latest 
    imagePullSecrets: 
    - name: myregistrykey 

e kubectl create d esso.

Tuttavia, kubectl continua a non riuscire a recuperare l'immagine:

[[email protected] intrinsic]# kubectl get pods 
NAME     READY  STATUS   RESTARTS AGE 
authorities-backend 0/1  PullImageError 0   7m 

finestra mobile tirare sul master kubernetes funzionato comunque.

Cosa mi manca?

UPDATE

Nella definizione pod sopra, aveva omesso di specificare l'host Registro di sistema, vale a dire docker.io. Risolvendolo, diventa: image: docker.io/intrinsic/authorities-backend:latest Tuttavia, il problema persiste. Facendo kubectl get events -w mi fa: 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) So che il segreto è stato correttamente registrato, come ce l'ho sotto kubectl get secrets: NAME TYPE DATA AGE default-token-a7s5n kubernetes.io/service-account-token 2 51m myregistrykey kubernetes.io/dockercfg 1 50m

Ancora confuso ...

Candide

risposta

5

La documentazione non è aggiornata, in quanto fa riferimento a .dockercfg anziché a .docker/config.json. Lo aggiornerò.

Quando si utilizza il nuovo formato .docker/config.json, è necessario impostare type: kubernetes.io/dockerconfigjson anziché type: kubernetes.io/.dockercfg.

Il supporto per type: kubernetes.io/dockerconfigjson è stato aggiunto in v1.1.0 quindi è supportato dal server, ma non è supportato dal client (che è v1.1.0-alpha che precede la v1.1.0).

Quando si utilizza type: kubernetes.io/dockerconfigjson, è necessario convalidare i contenuti segreti.

Con type: kubernetes.io/dockerconfigjson, si desidera mantenere il wrapper auths.

+0

https://github.com/kubernetes/kubernetes/pull/18777 corregge la documentazione. La tua recensione sarebbe gradita. –

+0

In realtà, a causa di una svista, Kubernetes non sta attualmente validando 'type: kubernetes.io/dockerconfigjson'. Ho scritto https://github.com/kubernetes/kubernetes/pull/18790 per risolvere questo problema. –

+0

Grazie per questo Eric - la documentazione funziona alla grande. Piccola lamentela: non posso realmente eseguire 'nodes = $ (kubectl get nodes -o jsonpath = '{range.items [*]. Metadata} {. Name} {end}')' (ottenendo 'error: output format" jsonpath = {range.items [*]. metadata} {. nome} {end} "non riconosciuto") probabilmente a causa della mia ignoranza su come farlo. Sarebbe bello se fosse un po 'più esplicito. – candide

5

Così , Ho continuato a cercare sul web una risposta al mio problema e alla fine ho trovato questo:

https://github.com/kubernetes/kubernetes/issues/7954#issuecomment-115241561

Alla fine del thread, jjw27 l'ha inchiodato. Lo kubernetes documentation menziona il file .dockercfg.json solo per dire che il suo contenuto deve essere codificato in base64. In realtà ci sono due problemi con questo file:

  1. sembra che trasformato in un altro file in realtà, vale a dire .docker/config.json
  2. informazioni di autenticazione in questo file è avvolto da un ulteriore auths oggetti, che si deve sbarazzarsi di.

Citando jjw27

non ha funzionato:

{ 
    "auths": { 
    "hub.example.com:1024": { 
     "auth": "asdf=", 
     "email": "[email protected]" 
    } 
    } 
} 

funzionato:

{ 
    "hub.example.com:1024": { 
    "auth": "asdf=", 
    "email": "[email protected]" 
    } 
} 

Google, si prega di aggiornare questo documento !!

Messaggio a Kubernetes devs # 2: Inoltre, non lamentarsi di un segreto con codifica Base64 malformata è molto fuorviante. Convalidare l'input dell'utente e lamentarsi se contiene errori.