J'ai construit un cluster kubernetes à 4 nœuds exécutant des pods multi-conteneurs fonctionnant tous sur CoreOS. Les images proviennent de référentiels publics et privés. Pour le moment, je dois me connecter à chaque nœud et retirer manuellement les images chaque fois que je les mets à jour. Je voudrais pouvoir les retirer automatiquement.
Lorsque je crée le pod, j'obtiens le message d'erreur Erreur:
image <user/image>:latest not found
Si je me connecte et que j'exécute docker pull, l'image sera tirée. J'ai essayé ceci en utilisant docker.io et quay.io.
Kubernetes prend en charge un type spécial de secret que vous pouvez créer qui sera utilisé pour récupérer des images pour vos pods. Plus de détails ici .
Pour ajouter à ce que @rob a dit, depuis Docker 1.7, l'utilisation de .dockercfg est obsolète et ils utilisent maintenant un fichier ~/.docker/config.json. Il existe un support pour ce type de secret dans kube 1.1, mais vous devez le créer en utilisant différentes clés/configuration de type dans le yaml:
Tout d'abord, base64 code votre ~/.docker/config.json
:
cat ~/.docker/config.json | base64 -w0
Notez que l'encodage base64 doit apparaître sur une seule ligne, donc avec -w0 nous désactivons le wrapping.
Ensuite, créez un fichier 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
Ensuite, dans le yaml de votre pod, vous devez référencer registrypullsecret
ou créer un contrôleur de réplication:
apiVersion: v1
kind: Pod
metadata:
name: my-private-pod
spec:
containers:
- name: private
image: yourusername/privateimage:version
imagePullSecrets:
- name: registrypullsecret
Si vous devez extraire une image d'un référentiel Docker Hub privé, vous pouvez utiliser ce qui suit.
Créez votre clé secrète
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
"myregistrykey" secret créé.
Ajoutez ensuite la clé nouvellement créée à votre compte de service Kubernetes.
Récupérer le compte de service actuel
kubectl get serviceaccounts default -o yaml > ./sa.yaml
Modifiez sa.yaml et ajoutez ImagePullSecret après les secrets
imagePullSecrets:
- name: myregistrykey
Mettre à jour le compte de service
kubectl replace serviceaccount default -f ./sa.yaml
Je peux confirmer que imagePullSecrets ne fonctionne pas avec le déploiement, mais vous pouvez
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
Ajouter
imagePullSecrets:
- name: myregistrykey
À la fin après Secrets
, enregistrez et quittez. Et ses œuvres. Testé avec Kubernetes 1.6.7
Pour centos7, le fichier de configuration du docker se trouve sous /root/.dockercfg
Copiez et collez le résultat dans le YAML secret basé sur l'ancien format:
apiVersion: v1
kind: Secret
metadata:
name: docker-secret
type: kubernetes.io/dockercfg
data:
.dockercfg: <YOUR_BASE64_JSON_HERE>
Et cela a fonctionné pour moi, j'espère que cela pourrait aussi aider.
Le moyen le plus simple de créer le secret avec les mêmes informations d'identification que votre configuration de docker est:
kubectl create secret generic myregistry --from-file=.dockerconfigjson=$HOME/.docker/config.json
Cela code déjà les données en base64.
Si vous pouvez télécharger les images avec docker, kubernetes devrait également pouvoir les télécharger. Mais il est nécessaire d'ajouter ceci à vos objets kubernetes:
spec:
template:
spec:
imagePullSecrets:
- name: myregistry
containers:
# ...
Où myregistry
est le nom donné dans la commande précédente.