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?
C’est vraiment compliqué, mais après beaucoup de traces et d’erreurs, je pense que ça marche.
~/secret.json
)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
.
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]"}}
Base64 encoder ce fichier:
$ cat ~/docker-config.json | base64
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
Maintenant, créez le secret:
$ kubectl create -f ~/pullsecret.yaml
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 .
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.
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.
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:
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".
Sous "compte de service", sélectionnez new et nommez la nouvelle clé "gcr" (laissez le type de clé être json)
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: ...
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
À 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
:
Docker Registry (read-only)
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
Une fois connecté, vous pouvez simplement exécuter docker pull
. Vous pouvez également copier le ~/.dockercfg
mis à jour pour conserver les paramètres.