web-dev-qa-db-fra.com

Créer une image secrète pour un registre de conteneurs Google qui n’expire pas?

J'essaie de faire en sorte que Kubernetes télécharge des images à partir d'un registre de conteneurs Google d'un autre projet. Selon les docs , vous devez créer un secret d’extraction d’image en utilisant:

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

Mais je me demande quels DOCKER_USER et DOCKER_PASSWORD je devrais utiliser pour m'authentifier auprès de Google Container Registry? En regardant les docs GCR , il est indiqué que le mot de passe est le jeton d’accès que vous pouvez obtenir en exécutant:

$ gcloud auth print-access-token

Cela fonctionne réellement ... pendant un moment. Le problème semble être que ce jeton d'accès expire après (ce que je crois être) une heure. J'ai besoin d'un mot de passe (ou de quelque chose) qui n'expire pas lors de la création de mon image secrète. Sinon, le cluster Kubernetes ne peut pas télécharger les nouvelles images après une heure environ. Quelle est la bonne façon de faire cela?

14
Johan

C’est vraiment compliqué, mais après beaucoup de traces et d’erreurs, je pense que ça marche. 

  1. Accédez à la Console de développeur Google> Gestionnaire Api> Informations d'identification, puis cliquez sur "Créer les informations d'identification" et créez une "clé de compte de service".
  2. Sous "compte de service", sélectionnez new et nommez la nouvelle clé "gcr" (laissez le type de clé être json)
  3. Créez la clé et stockez le fichier sur le disque (à partir de là, nous supposons qu'il a été stocké sous ~/secret.json)
  4. Connectez-vous maintenant à GCR à l'aide de Docker à partir de la ligne de commande:

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

    Cela générera une entrée pour " https://eu.gcr.io " dans votre fichier ~/.docker/config.json.

  5. Copiez la structure JSON sous " https://eu.gcr.io " dans un nouveau fichier appelé "~/docker-config.json", supprimez les nouvelles lignes! Par exemple:

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

  6. Base64 encoder ce fichier: 

    $ cat ~/docker-config.json | base64

  7. Cela va imprimer une longue chaîne encodée en base64, copier cette chaîne et la coller dans une définition secrète de type image (appelée ~/pullsecret.yaml):

apiVersion: v1
  kind: Secret
  metadata:
    name: mykey
  data:
    .dockercfg: <paste base64 encoded string here>
  type: kubernetes.io/dockercfg
  1. Maintenant, créez le secret:

    $ kubectl create -f ~/pullsecret.yaml

  2. Maintenant, vous pouvez utiliser ce secret tiré d'un pod, par exemple: 
apiVersion: v1
kind: Pod
metadata: 
  name: foo
  namespace: awesomeapps
spec: 
  containers: 
    - image: "janedoe/awesomeapp:v1"
      name: foo
  imagePullSecrets: 
    - name: mykey

ou l'ajouter à un compte de service .

12
Johan

C'est beaucoup plus facile avec 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 détail important après avoir téléchargé votre_service_account.json à partir de Google est de joignez toutes les lignes du json en une ligne.

7
Gramic

Vous pouvez également accorder au compte de service que votre cluster exécute en tant qu'accès au compartiment GCS:

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

This answer a quelques commandes gsutil pour que cela se produise.

2
mattmoor

Cette réponse garantit que seul un ensemble d'informations d'identification de docker est inclus dans votre secret Kubernetes, et gère le découpage des lignes nouvelles pour vous.

Suivez les mêmes trois premières étapes de la réponse géniale de Johan:

  1. Accédez à la Console de développeur Google> Gestionnaire Api> Informations d'identification, puis cliquez sur "Créer les informations d'identification" et créez une "clé de compte de service".

  2. Sous "compte de service", sélectionnez new et nommez la nouvelle clé "gcr" (laissez le type de clé être json)

  3. Créez la clé et stockez le fichier sur le disque (à partir de là, nous supposons qu'il a été stocké sous ~/secret.json)

Ensuite, exécutez ces commandes pour générer et injecter les informations d’identification Docker requises dans votre 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

Lorsque vous spécifiez des pods qui extraient des images de GCR, incluez le nom secret gcr-key dans votre section spec:

spec:
  imagePullSecrets:
    - name: gcr-key
  containers:
  - image: ...
2
Rich Kuzsma

Aucun secret d'extraction d'image n'est nécessaire, vous pouvez le faire à l'aide d'une configuration IAM

J'ai essayé d'autres réponses mais je n'arrive pas à faire fonctionner l'approche Image Pull Secret.

Cependant, j’ai trouvé que cela pouvait être fait en autorisant l’accès au compte de service par défaut Compute Engine dans le projet où se trouve le cluster Kubernetes. Ce compte de service a été créé automatiquement par GCP.

Comme décrit ici: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry

Vous devez exécuter la commande suivante pour accorder l'accès au compartiment Cloud Storage servant le registre de conteneurs.

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

EMAIL-ADDRESS:

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

À partir des voies officielles , vous pouvez:

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

Remarque: l'e-mail n'est pas utilisé, vous pouvez donc y mettre ce que vous voulez.

Remplacez gcr.io par votre domaine indiqué dans/ Google Container Registry (par exemple eu.gcr.io).

Pour obtenir ce $JSON_KEY:

  1. Allez dans Gestionnaire d’API> Informations d’identification
  2. Cliquez sur "Créer les informations d'identification"> Clé du compte de service :
    • Compte de service: Nouveau compte de service
      • Nom: Tout ce que vous voulez, comme Docker Registry (read-only)
      • Rôle: Stockage (défilement vers le bas)> Visualiseur d'objets de stockage
    • Type de clé:JSON
  3. Télécharger en tant que keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Maintenant, vous pouvez l'utiliser.

Une fois connecté, vous pouvez simplement exécuter docker pull. Vous pouvez également copier le ~/.dockercfg mis à jour pour conserver les paramètres.

1
Wernight