2015-09-22 3 views
14

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

  1. Я попытался запустить Docker входа на каждом сервере и положить .dockercfg файл в/корень и/ядро ​​
  2. Я также сделал выше с .docker/config.json
  3. я добавил секрет к мастеру куба и добавленному изображениюPullSecrets:
    • имя: docker.io в файл конфигурации Pod.

Когда я создаю стручок я получаю сообщение об ошибке сообщение об ошибке:

image <user/image>:latest not found 

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

ответ

3

Kubernetes поддерживает специальный секрет, который вы можете создать, который будет использоваться для извлечения изображений для ваших стручков. Подробнее здесь: http://kubernetes.io/v1.0/docs/user-guide/images.html#specifying-imagepullsecrets-on-a-pod

+0

Вам нужно было создать учетную запись службы? Я сделал эти шаги в руководстве пользователя, но он по-прежнему не тянет изображение. Есть ли журнал, чтобы узнать, что происходит? – KSB

+0

Вам нужно установить этот секрет в стручок, чтобы он использовался. – Rob

+1

ПРИМЕЧАНИЕ: 1) url должен быть https: // 2) все должно быть на 1 строке 3) после кодировки base64 оно все равно должно быть на 1 строке – MrE

33

Чтобы добавить к тому, что сказал @rob, с docker 1.7, использование .dockercfg устарело, и теперь они используют файл ~/.docker/config.json. Существует поддержка этого типа секрета в Кубэ 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 

Затем в YAML на яйце Вам необходимо ссылаться registrypullsecret или создать контроллер репликации:

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

Спасибо за подробный ответ. Я также обнаружил, что мне нужно обновить версию k8, которую я использовал. Как только я обновился, все работало как документ. – KSB

+1

Это должен быть принятый ответ. Кроме того, согласно комментарию @MrE по предыдущему ответу, убедитесь, что у вас есть https: // в вашем приватном репозитории в вашем config.json перед его кодировкой. Без этого я не смог вытащить свои контейнеры. –

+4

Конфигурация докеры с кодировкой base64 должна быть в одной строке. Вероятно, лучше всего использовать команду base64 с флагом «-w 0». –

3

Для файла centos7 файл конфигурации докера находится под/ro ot/.dockercfg

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

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

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

7

Если вам нужно вытащить изображение из частного репозитория 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 

Edit sa.yaml и добавьте ImagePullSecret после Тайн

imagePullSecrets: 
- name: myregistrykey 

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

kubectl replace serviceaccount default -f ./sa.yaml 
+0

Это самый актуальный ответ, подробнее https://kubernetes.io/docs/user-guide/service-accounts/#adding-imagepullsecrets-to-a-service-account –

2

Я могу подтвердить, что 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

Смежные вопросы