Ответ 1
Kubernetes поддерживает специальный тип секрета, который вы можете создать, который будет использоваться для извлечения изображений для ваших модулей. Подробнее здесь.
Я построил 4 node кластер kubernetes, на котором запущены контейнеры с несколькими контейнерами, работающие на CoreOS. Изображения поступают из публичных и частных репозиториев. Сейчас я должен войти в каждый node и вручную вытаскивать изображения каждый раз, когда я их обновляю. Я хотел бы иметь возможность автоматически вытаскивать их.
Когда я создаю pod, я получаю сообщение об ошибке. Ошибка:
image <user/image>:latest not found
Если я войду в систему и запустил докер, он потянет изображение. Я пробовал это с помощью docker.io и quay.io.
Kubernetes поддерживает специальный тип секрета, который вы можете создать, который будет использоваться для извлечения изображений для ваших модулей. Подробнее здесь.
Чтобы добавить к тому, что сказал @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
Если вам нужно вытащить изображение из частного репозитория 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
Я могу подтвердить, что 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
Для centos7 файл конфигурации docker находится в каталоге /root/.dockercfg
Скопируйте и вставьте результат в секретный YAML на основе старого формата:
apiVersion: v1
kind: Secret
metadata:
name: docker-secret
type: kubernetes.io/dockercfg
data:
.dockercfg: <YOUR_BASE64_JSON_HERE>
И это сработало для меня, надеюсь, что это тоже поможет.
Самый простой способ создать секрет с теми же учетными данными, что и в вашей конфигурации докера:
kubectl create secret generic myregistry --from-file=.dockerconfigjson=$HOME/.docker/config.json
Это уже кодирует данные в base64.
Если вы можете загружать изображения с помощью докера, тогда kubernetes также сможет их скачать. Но необходимо добавить это к вашим объектам kubernetes:
spec:
template:
spec:
imagePullSecrets:
- name: myregistry
containers:
# ...
Где myregistry
- это имя, данное в предыдущей команде.