Настройка клиентского кластера k8s с помощью реестра контейнеров Digital Ocean.
Требования
- Кластер Kubernetes (доступ к кластеру через kubectl)
- Частный реестр docker (я использую Digital Ocean для демонстрации)
- Образ докера
Доступ к публичным образам в публичном реестре docker, таком как Dockerhub, является стандартным поведением кластера kubernetes, если вы не хотите интегрировать свой собственный частный реестр для доступа к частным образам docker по очевидным причинам безопасности. Поставщики облачных услуг, такие как AWS, Digital Ocean, обеспечивают простую интеграцию собственного реестра docker в управляемый kubernetes.
Но настройка пустого кластера kubernetes для доступа к частному реестру включает в себя несколько шагов, в том числе обновление deployment/pod yaml. Для примера я использую реестр докеров Digital Ocean. Но шаги одинаковы для большинства провайдеров.
Если у вас нет кластера для демонстрации. Посмотрите на Kind. Kind поможет вам запустить кластер kubernetes локально за считанные минуты. Или же вы можете использовать Katacoda или Play with kubernetes.
Шаг 1
Dockerconfig.json
Сначала нам нужно настроить кластер для аутентификации в частном реестре. Кластер Kubernetes использует секрет типа kubernetes.io/dockerconfigjson
для аутентификации в реестре контейнеров, чтобы получить приватный образ. Мы можем сделать это двумя методами. Первый метод – это использование файла config.json, а второй метод требует вашего имени пользователя, пароля и электронной почты.
В реестре контейнеров Digital Ocean вы можете загрузить файл конфигурации, доступный только для чтения, по кнопке Home Actions реестра контейнеров. Этот же файл можно найти в ~/.docker/config.json
при входе в реестр docker на локальной машине.
Использование config.json
kubectl create secret generic registry-credential
--from-file=.dockerconfigjson=<path/to/.docker/config.json>
--type=kubernetes.io/dockerconfigjson
или
Использование учетных данных docker
kubectl create secret docker-registry registry-credential --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
Проверить созданный секрет
kubectl get secret registry-credential --output=yaml
Вывод выглядит примерно так:
apiVersion: v1
kind: Secret
metadata:
...
name: registry-credential
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4...
type: kubernetes.io/dockerconfigjson
Значение поля .dockerconfigjson
представляет собой base64 представление ваших учетных данных Docker. Чтобы преобразовать данные в читабельный формат, выполните следующую команду.
kubectl get secret registry-credential --output="jsonpath={.data..dockerconfigjson}" | base64 --decode
Шаг 2
Редактирование капсулы
После создания секрета мы можем обновить конфигурацию pod, чтобы использовать созданный секрет для извлечения изображений. Обновите spec-сессию вашего pod следующим образом.
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: registry-credential
Чтобы извлечь образ из частного реестра, Kubernetes нужны учетные данные. Поле imagePullSecrets
в конфигурационном файле указывает, что Kubernetes должен получить учетные данные из Secret с именем registry-credential
.
Создайте Pod, использующий ваш Secret, и убедитесь, что Pod запущен.
kubectl apply -f pod.yaml
kubectl get pod <pod-name>
Если вы не хотите добавлять imagePullSecrets
в конфигурацию стручка или вам нужно установить разные реестры для каждого пространства имен по умолчанию, перейдите к шагу 3.
Шаг 3
Добавление секретов извлечения изображений в учетную запись сервиса
Если вы хотите получить предварительное представление об учетных записях служб, просмотрите этот документ
Чтобы добавить наш новый секрет в пространство имен, мы должны изменить учетную запись сервиса и добавить наше новое имя секрета в массив imagePullSecret внутри учетной записи сервиса.
Мы можем загрузить манифест учетной записи службы следующим образом
kubectl get serviceaccounts default -o yaml > ./service-account.yaml
затем обновите его следующим образом:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: registry-credential
Наконец, замените служебную учетную запись на обновленный файл манифеста
kubectl replace serviceaccount default -f ./service-account.yaml
Теперь, когда новый Pod создается в текущем пространстве имен и использует стандартный ServiceAccount, у нового Pod автоматически устанавливается поле spec.imagePullSecrets
.
Ссылки:
Извлечение изображения из частного реестра
Добавить секрет извлечения изображения в учетную запись службы
Добавить секрет извлечения изображения в учетную запись службы