12

Sto cercando di convincere Kubernetes a scaricare immagini da un registro dei contenitori di Google da un altro progetto. Secondo il docs è necessario creare un segreto di un'immagine di tiro con:Creazione dell'immagine pull secret per il registro contenitore google che non scade?

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

ma mi chiedo che cosa DOCKER_USER e DOCKER_PASSWORD dovrei usare per l'autenticazione con Google Contenitore di registrazione? Guardando il GCR docs si dice che la password è il token di accesso che si può ottenere eseguendo:

$ gcloud auth print-access-token 

questo funziona davvero ... per un po '. Il problema sembra essere che questo token di accesso scade dopo (ciò che credo sia) un'ora. Ho bisogno di una password (o qualcosa) che non scada quando creo la mia immagine pull secret. Altrimenti il ​​cluster Kubernetes non può scaricare le nuove immagini dopo circa un'ora. Qual è il modo corretto per farlo?

risposta

9

Questo è davvero difficile ma dopo un sacco di tracce ed errori penso di averlo funzionato.

  1. Vai agli Google Developer Console> Manager API> Credenziali e fare clic su "Crea credenziali" e creare una "chiave di account di servizio"
  2. "account di servizio"
  3. Sotto selezionare nuovo e il nome del nuovo "GCR" chiave (lasciare che il tipo di chiave sia jSON)
  4. Creare la chiave e memorizzare il file sul disco (da qui in poi si suppone che sia stato conservato in ~/secret.json)
  5. Ora accedere per GCR utilizzando Docker da riga di comando:

    $ docker login -e [email protected] -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io

    Ciò genererà una voce per "https://eu.gcr.io" nel file ~/.docker/config.json.

  6. Copia la struttura JSON sotto "https://eu.gcr.io" in un nuovo file chiamato "~/docker-config.json", rimuovi newlines!Per esempio:

    {"https://eu.gcr.io": { "auth": "<key>","email": "[email protected]"}}

  7. Base64 codificare questo file:

    $ cat ~/docker-config.json | base64

  8. Questo stamperà un lungo base64 stringa codificata, copiare questa stringa e incollarlo in un'immagine tirare definizione segreta (chiamato ~/pullsecret.yaml):

apiVersion: v1 
    kind: Secret 
    metadata: 
    name: mykey 
    data: 
    .dockercfg: <paste base64 encoded string here> 
    type: kubernetes.io/dockercfg 
  1. Creare ora il segreto:

    $ kubectl create -f ~/pullsecret.yaml

  2. Ora è possibile utilizzare questo segreto tirare da un baccello, ad esempio:
apiVersion: v1 
kind: Pod 
metadata: 
    name: foo 
    namespace: awesomeapps 
spec: 
    containers: 
    - image: "janedoe/awesomeapp:v1" 
     name: foo 
    imagePullSecrets: 
    - name: mykey 

o aggiungerlo a service account.

+0

Grazie per la condivisione! Mi sono avvicinato molto ma ho commesso l'errore di provare ad usare il mio attuale '~/.docker/config' che aveva già le credenziali gcr.io, ma credo che fossero legati all'account di servizio sbagliato ... o qualcosa del genere. Ad ogni modo, un paio di note: durante la creazione del nuovo account di servizio (passaggio 2) ho dovuto scegliere un ruolo, quindi ho scelto Project> Viewer, che sembra aver funzionato. Inoltre, con il comando 'base64', puoi rimuovere' cat' e aggiungere '-w 0' per evitare newline:' base64 -w 0 ~/docker-config.json' –

+1

Inoltre, sembra che abbiano [ha cambiato il nome del tipo Secret da 'dockercfg' a' dockerconfigjson'] (http://kubernetes.io/docs/user-guide/images/), che è quello che ho usato. Sono su K8s 1.4.0. –

+0

A un altro commento ... nel passaggio 5, hai lasciato fuori il '{" auths di livello superiore: 'chiave json. Anche rimuovere le newline da quel file non è realmente necessario, ma vuoi restringere la configurazione del docker per avere solo le auth che vuoi copiare nel segreto di Kubernetes. –

2

È inoltre possibile concedere all'account di servizio cluster viene eseguito come l'accesso al secchio GCS:

eu.artifacts.{project-id}.appspot.com 

This risposta ha un paio di gsutil comandi per realizzare questo obiettivo.

+0

Sì, anche il blog di Google Cloud menziona questo: https://medium.com/google-cloud/using-single-docker-repository-with-multiple-gke-projects-1672689f780c – Sander

4

E 'molto più facile con kubectl

kubectl create secret docker-registry mydockercfg \ 
    --docker-server "https://eu.gcr.io" \ 
    --docker-username _json_key \ 
    --docker-email [email protected] \ 
    --docker-password=$(cat your_service_account.json) 

Un dettaglio importante dopo aver scaricato your_service_account.json da parte di Google è quello di unire tutte le linee nel JSON in una riga.

1

Dal official ways, è possibile:

$ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io 

Nota: L'e-mail non viene utilizzato, in modo da poter mettere quello che vuoi in esso.

Modificare gcr.io in qualsiasi dominio mostrato nel proprio Google Container Registry (ad esempio eu.gcr.io).

per ottenere che $JSON_KEY:

  1. Vai API Manager > Credentials
  2. Fare clic su "Create credenziali"> conto Servizio tasto:
    • account di servizio: conto Nuovo servizio
      • Nome : Tutto quello che vuoi, come Docker Registry (read-only)
      • Ruolo: Storage (scorrere verso il basso)>bagagli Object Viewer
    • Tipo chiave: JSON
  3. Scarica come keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Ora è possibile utilizzarlo.

Una volta effettuato l'accesso, è possibile eseguire solo docker pull. È inoltre possibile copiare il ~/.dockercfg aggiornato per conservare le impostazioni.

1

Questa risposta garantisce che solo un set di credenziali di finestra mobile viene incluso nel segreto di Kubernetes e gestisce la funzione di ridimensionamento delle nuove linee.

Seguire gli stessi primi tre passi dalla grande risposta di Johan:

  1. Vai agli Google Developer Console> Manager API> Credenziali e fare clic su "Create credenziali" e creare una "chiave di account di servizio"

  2. "account di servizio"

    sotto selezionare nuovo e un nome al nuovo "GCR" chiave (lasciare che il tipo di chiave sia jSON)

  3. Creare la chiave e memorizzare il file sul disco (da qui in poi si suppone che era stato archiviato sotto ~/secret.json)

successivo, eseguire questi comandi per generare ed iniettare le credenziali finestra mobile richiesti nel cluster:

export GCR_KEY_JSON=$(cat ~/secret.json | tr -d '\n') 
mv ~/.docker/config.json ~/.docker/config-orig.json 
cat >~/.docker/config.json <<EOL 
{ 
    "auths": { 
    "gcr.io": {} 
    } 
} 
EOL 
docker login -e [email protected] -u _json_key -p "$GCR_KEY_JSON" https://gcr.io 
export DOCKER_CONFIG_JSON_NO_NEWLINES=$(cat ~/.docker/config.json | tr -d '\n') 
mv ~/.docker/config-orig.json ~/.docker/config.json 
cat >secrets.yaml <<EOL 
apiVersion: v1 
kind: Secret 
metadata: 
    name: gcr-key 
data: 
    .dockerconfigjson: $(echo -n ${DOCKER_CONFIG_JSON_NO_NEWLINES} | base64 | tr -d '\n') 
type: kubernetes.io/dockerconfigjson 

EOL 
kubectl create -f secrets.yaml 

Quando si specifica Pods che tirano le immagini da GCR, includere il nome segreto gcr-key nella vostra spec sezione:

spec: 
    imagePullSecrets: 
    - name: gcr-key 
    containers: 
    - image: ... 
0

Non è necessario alcun segreto immagine di tiro, può essere fatto da un configur IAM azione

Ho provato altre risposte ma non riesco a far funzionare l'approccio Image Pull Secret.

Tuttavia, ho scoperto che ciò può essere fatto concedendo l'accesso all'account del servizio di calcolo Compute Engine nel progetto in cui si trova il cluster Kubernetes. Questo account di servizio è stato creato automaticamente da GCP.

come descritto di seguito: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry

È necessario eseguire il seguente comando per concedere l'accesso al secchio Cloud Storage al servizio del Registro Container

gsutil iam ch serviceAccount:[EMAIL-ADDRESS]:objectViewer gs://[BUCKET_NAME] 

BUCKET_NAME:

artifacts.[PROJECT-ID].appspot.com for images pushed to gcr.io/[PROJECT-ID], or 
[REGION].artifacts.[PROJECT-ID].appspot.com, where [REGION] is: 
us for registry us.gcr.io 
eu for registry eu.gcr.io 
asia for registry asia.gcr.io 

INDIRIZZO E-MAIL:

The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run