web-dev-qa-db-fra.com

Extraire des images du registre privé dans Kubernetes

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.

  1. J'ai essayé d'exécuter la connexion Docker sur chaque serveur et de placer le fichier .dockercfg dans/root et/core
  2. J'ai également fait ce qui précède avec le .docker/config.json
  3. J'ai ajouté un secret au maître kube et ajouté imagePullSecrets:
    • nom: docker.io dans le fichier de configuration du pod.

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.

24
KSB

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 .

7
Rob

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
53
Chief

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
16
Bcf Ant

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

7
delfer

Pour centos7, le fichier de configuration du docker se trouve sous /root/.dockercfg

  1. echo $ (cat /root/.dockercfg) | base64 -w 0
  2. 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.

3
Jane

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:
      # ...

myregistry est le nom donné dans la commande précédente.

0
MagMax