Подтвердить что ты не робот

Вытягивание изображений из частного реестра в Кубернете

Я построил 4 node кластер kubernetes, на котором запущены контейнеры с несколькими контейнерами, работающие на CoreOS. Изображения поступают из публичных и частных репозиториев. Сейчас я должен войти в каждый node и вручную вытаскивать изображения каждый раз, когда я их обновляю. Я хотел бы иметь возможность автоматически вытаскивать их.

  • Я попытался запустить вход в docker на каждом сервере и поместил файл .dockercfg в /root и/core
  • Я также сделал это с помощью .docker/config.json
  • Я добавил секрет к мастеру куба и добавил imagePullSecrets:
    • имя: docker.io в файл конфигурации Pod.

Когда я создаю pod, я получаю сообщение об ошибке. Ошибка:

image <user/image>:latest not found

Если я войду в систему и запустил докер, он потянет изображение. Я пробовал это с помощью docker.io и quay.io.

4b9b3361

Ответ 1

Kubernetes поддерживает специальный тип секрета, который вы можете создать, который будет использоваться для извлечения изображений для ваших модулей. Подробнее здесь.

Ответ 2

Чтобы добавить к тому, что сказал @rob, начиная с docker 1.7, использование .dockercfg устарело, и теперь они используют файл ~/.docker/config.json. Существует поддержка этого типа секрета в kube 1.1, но вы должны создать его, используя различные настройки ключей/типов в yaml:

Во-первых, base64 кодирует ваш ~/.docker/config.json:

cat ~/.docker/config.json | base64 -w0   

Обратите внимание, что кодировка base64 должна отображаться в одной строке, поэтому с помощью -w0 мы отключаем перенос.

Затем создайте файл 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

Затем в вашем pod yaml вам нужно сослаться на registrypullsecret или создать контроллер репликации:

apiVersion: v1
kind: Pod
metadata:
  name: my-private-pod
spec:
  containers:
    - name: private
      image: yourusername/privateimage:version
  imagePullSecrets:
    - name: registrypullsecret

Ответ 3

Если вам нужно вытащить изображение из частного репозитория Docker Hub, вы можете использовать следующее.

Создать секретный ключ

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

секретный "myregistrykey" создан.

Затем добавьте вновь созданный ключ в свою учетную запись службы Kubernetes.

Получить текущую учетную запись службы

kubectl get serviceaccounts default -o yaml > ./sa.yaml

Измените sa.yaml и добавьте ImagePullSecret после секретов

imagePullSecrets:
- name: myregistrykey

Обновить учетную запись службы

kubectl replace serviceaccount default -f ./sa.yaml

Ответ 4

Я могу подтвердить, что imagePullSecrets не работает с развертыванием, но вы можете

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

добавлять

imagePullSecrets:
- name: myregistrykey

До конца после Secrets сохраните и выйдите. И его работы. Протестировано с Kubernetes 1.6.7

Ответ 5

Для centos7 файл конфигурации docker находится в каталоге /root/.dockercfg

  • echo $(cat/root/.dockercfg) | base64 -w 0
  • Скопируйте и вставьте результат в секретный YAML на основе старого формата:

    apiVersion:  v1
    kind: Secret
    metadata:
      name: docker-secret
      type: kubernetes.io/dockercfg
    data:
      .dockercfg: <YOUR_BASE64_JSON_HERE> 
    

И это сработало для меня, надеюсь, что это тоже поможет.

Ответ 6

Самый простой способ создать секрет с теми же учетными данными, что и в вашей конфигурации докера:

kubectl create secret generic myregistry --from-file=.dockerconfigjson=$HOME/.docker/config.json

Это уже кодирует данные в base64.

Если вы можете загружать изображения с помощью докера, тогда kubernetes также сможет их скачать. Но необходимо добавить это к вашим объектам kubernetes:

spec:
  template:
    spec:
      imagePullSecrets:
      - name: myregistry
      containers:
      # ...

Где myregistry - это имя, данное в предыдущей команде.