2015-09-22 11 views
14

Ho creato un cluster di 4 nodi kubernetes con pod multi-contenitore in esecuzione su CoreOS. Le immagini provengono da archivi pubblici e privati. In questo momento devo accedere a ciascun nodo e tirare manualmente verso il basso le immagini ogni volta che le aggiorno. Mi piacerebbe essere in grado di tirarli automaticamente.Estrazione di immagini dal registro privato in Kubernetes

  1. Ho provato a fare funzionare login finestra mobile su ciascun server e mettendo il file .dockercfg in/root e/core
  2. Ho anche fatto sopra con la .docker/config.json
  3. ho aggiunto segreto al master del kube e aggiunto imagePullSecrets:
    • nome: docker.io al file di configurazione del pod.

Quando creo il baccello ottengo il messaggio di errore Error:

image <user/image>:latest not found 

Se entro e corro finestra mobile tirarlo tirerà l'immagine. Ho provato questo usando docker.io e quay.io.

risposta

3

Kubernetes supporta un tipo speciale di segreto che è possibile creare e che verrà utilizzato per recuperare le immagini per i pod. Maggiori dettagli qui: http://kubernetes.io/v1.0/docs/user-guide/images.html#specifying-imagepullsecrets-on-a-pod

+0

Hai avuto bisogno di creare un account di servizio? Ho fatto questi passaggi nella guida per l'utente, ma ancora non tira l'immagine. È un log per vedere cosa sta succedendo? – KSB

+0

È necessario montare il segreto nel pod per poterlo utilizzare. – Rob

+1

NOTA CHE: 1) l'url deve essere https: // 2) il tutto deve essere su 1 riga 3) dopo la codifica base64 deve ancora essere su 1 riga – MrE

33

Per aggiungere a ciò che @rob ha detto, come da docker 1.7, l'uso di .dockercfg è stato deprecato e ora usano un file ~/.docker/config.json. V'è il supporto per questo tipo di segreto nel Kube 1.1, ma è necessario creare utilizzando diverse chiavi/configurazione di tipo nella YAML:

In primo luogo, base64 codificare il ~/.docker/config.json:

cat ~/.docker/config.json | base64 -w0 

Nota che la codifica Base64 dovrebbe apparire su una singola riga quindi con -w0 disabilitiamo il wrapping.

Successivamente, creare un file YAML: my-secret.yaml

apiVersion: v1 
kind: Secret 
metadata: 
    name: registrypullsecret 
data: 
    .dockerconfigjson: <base-64-encoded-json-here> 
type: kubernetes.io/dockerconfigjson 

-

$ kubectl create -f my-secret.yaml && kubectl get secrets 

NAME     TYPE         DATA 
default-token-olob7 kubernetes.io/service-account-token 2 
registrypullsecret kubernetes.io/dockerconfigjson  1 

Poi, in YAML del pod è necessario fare riferimento registrypullsecret o creare un controller di replica:

apiVersion: v1 
kind: Pod 
metadata: 
    name: my-private-pod 
spec: 
    containers: 
    - name: private 
     image: yourusername/privateimage:version 
    imagePullSecrets: 
    - name: registrypullsecret 
+1

Grazie per la risposta dettagliata. Ho anche scoperto che avevo bisogno di aggiornare la versione di k8 che stavo usando. Una volta aggiornato, tutto ha funzionato come documento. – KSB

+1

Questa dovrebbe essere la risposta accettata ora. Inoltre, come da commento di @MrE sulla risposta precedente, assicurati di avere https: // sul tuo repository privato in config.json prima di codificarlo. Senza di esso, non riuscivo a tirare i miei contenitori. –

+4

La configurazione della finestra mobile codificata in base64 deve essere su un'unica riga. Probabilmente è meglio usare il comando base64 con il flag "-w 0". –

3

Per centos7, il file di configurazione della finestra mobile è in/ro ot/.dockercfg

  1. echo $ (cat /root/.dockercfg) | Base64 -w 0
  2. Copia e incolla risultato a YAML segreto in base al vecchio formato:

    apiVersion: v1 
    kind: Secret 
    metadata: 
        name: docker-secret 
        type: kubernetes.io/dockercfg 
    data: 
        .dockercfg: <YOUR_BASE64_JSON_HERE> 
    

E ha funzionato per me, la speranza che potrebbe anche aiutare.

7

Se è necessario estrarre un'immagine da un repository Docker Dock privato, è possibile utilizzare quanto segue.

Creare la chiave segreta

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 

segreto "myregistrykey" creato.

Quindi aggiungere la chiave appena creata all'account del servizio Kubernetes.

Recuperare l'account del servizio corrente

kubectl get serviceaccounts default -o yaml > ./sa.yaml 

Modifica sa.yaml e aggiungere l'ImagePullSecret dopo Segreti

imagePullSecrets: 
- name: myregistrykey 

Aggiornare l'account di servizio

kubectl replace serviceaccount default -f ./sa.yaml 
+0

Questa è la risposta più aggiornata, maggiori dettagli https://kubernetes.io/docs/user-guide/service-accounts/#adding-imagepullsecrets-to-a-service-account –

2

Posso confermare che imagePullSecrets che non funziona con la distribuzione, ma si può

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 
kubectl edit serviceaccounts default 

Aggiungere

imagePullSecrets: 
- name: myregistrykey 

Per l'e dopo Secrets, salvare e uscire. E i suoi lavori. Testato con Kubernetes 1.6.7

Problemi correlati