Отримання образів з приватного реєстру
Ця сторінка показує, як створити Pod, що використовує Secret для отримання образу з приватного реєстру або сховища контейнерних образів. Існує багато приватних реєстрів, які використовуються. У цьому завданні використовується Docker Hub як приклад реєстру.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Для виконання цієї вправи вам потрібно мати інструмент командного рядка
docker, а також ідентифікатор Docker, та пароль до якого ви знаєте.Якщо ви використовуєте інший приватний контейнерний реєстр, вам потрібен інструмент командного рядка для цього реєстру та будь-яка інформація для входу в реєстр.
Увійдіть до Docker Hub
На вашому компʼютері вам необхідно автентифікуватися в реєстрі, щоб отримати приватний образ.
Використовуйте інструмент docker, щоб увійти до Docker Hub. Докладніше про це дивіться у розділі log in на сторінці Docker ID accounts.
docker login
Коли буде запитано, введіть свій ідентифікатор Docker, а потім обрані вами облікові дані (токен доступу чи пароль до вашого Docker ID).
Процес входу створює або оновлює файл config.json, який містить токен авторизації. Ознайомтеся з тим, як Kubernetes інтерпретує цей файл.
Перегляньте файл config.json:
cat ~/.docker/config.json
Вивід містить секцію, подібну до цієї:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
Примітка:
Якщо ви використовуєте сховище облікових даних Docker, ви не побачите цей записauth, а замість нього буде запис credsStore з назвою сховища як значення. У цьому випадку ви можете створити Secret безпосередньо. Дивіться Створення Secret, за допомогою вводу облікових даних в командному рядку.Створення Secret на основі наявних облікових даних
Кластер Kubernetes використовує Secret типу kubernetes.io/dockerconfigjson для автентифікації в контейнерному реєстрі для отримання приватного образу.
Якщо ви вже виконали команду docker login, ви можете скопіювати ці облікові дані в Kubernetes:
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<шлях/до/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
Якщо вам потрібно більше контролю (наприклад, встановити простір імен чи мітку для нового Secret), то ви можете налаштувати Secret перед збереженням його. Переконайтеся, що:
- встановлено назву елемента даних як
.dockerconfigjson - файл конфігурації Docker закодовано у base64, а потім вставлено цей рядок без розривів як значення для поля
data[".dockerconfigjson"] - встановлено
typeякkubernetes.io/dockerconfigjson
Приклад:
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
Якщо ви отримали повідомлення про помилку error: no objects passed to create, це може означати, що закодований у base64 рядок є недійсним. Якщо ви отримали повідомлення про помилку, подібне до Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ..., це означає, що закодований у base64 рядок у даних успішно декодувався, але не може бути розпізнаний як файл .docker/config.json.
Створення Secret, за допомогою вводу облікових даних в командному рядку
Створіть цей Secret, назвавши його regcred:
kubectl create secret docker-registry regcred \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-pword> \
--docker-email=<your-email>
де:
<your-registry-server>— це повна доменна назва вашого приватного реєстру Docker. Використовуйтеhttps://index.docker.io/v1/для DockerHub.<your-name>— це ваше імʼя користувача Docker.<your-pword>— це ваш пароль Docker.<your-email>— це ваша електронна адреса Docker.
Ви успішно встановили ваші облікові дані Docker у кластері як Secret під назвою regcred.
Примітка:
Ввід секретів у командному рядку може зберігатися в історії вашої оболонки в незахищеному вигляді, і ці секрети також можуть бути видимими для інших користувачів на вашому компʼютері протягом часу, коли виконуєтьсяkubectl.Перегляд Secret regcred
Щоб зрозуміти вміст Secret regcred, який ви створили, спочатку перегляньте Secret у форматі YAML:
kubectl get secret regcred --output=yaml
Вивід подібний до такого:
apiVersion: v1
kind: Secret
metadata:
...
name: regcred
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson
Значення поля .dockerconfigjson — це представлення в base64 ваших облікових даних Docker.
Щоб зрозуміти, що знаходиться у полі .dockerconfigjson, конвертуйте дані Secret в читабельний формат:
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
Вивід подібний до такого:
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}
Щоб зрозуміти, що знаходиться у полі auth, конвертуйте дані, закодовані в base64, у читабельний формат:
echo "c3R...zE2" | base64 --decode
Вивід, імʼя користувача та пароль, зʼєднані через :, подібний до такого:
janedoe:xxxxxxxxxxx
Зверніть увагу, що дані Secret містять токен авторизації, аналогічний вашому локальному файлу ~/.docker/config.json.
Ви успішно встановили ваші облікові дані Docker як Secret з назвою regcred у кластері.
Створення Pod, який використовує ваш Secret
Нижче подано опис для прикладу Pod, який потребує доступу до ваших облікових даних Docker у regcred:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
Завантажте вищезазначений файл на свій компʼютер:
curl -L -o my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
У файлі my-private-reg-pod.yaml замініть <your-private-image> на шлях до образу у приватному реєстрі, наприклад:
your.private.registry.example.com/janedoe/jdoe-private:v1
Для отримання образу з приватного реєстру Kubernetes потрібні облікові дані. Поле imagePullSecrets у файлі конфігурації вказує, що Kubernetes повинен отримати облікові дані з Secret з назвою regcred.
Створіть Pod, який використовує ваш Secret, і перевірте, що Pod працює:
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
Примітка:
Щоб використовувати Secret для отримання образів для Pod (або Deployment, або іншого обʼєкта, який має шаблон Pod, який ви використовуєте), вам потрібно переконатися, що відповідний Secret існує в правильному просторі імен. Простір імен для використання — той самий, де ви визначили Pod.Також, якщо запуск Podʼа не вдається і ви отримуєте статус ImagePullBackOff, перегляньте події Pod:
kubectl describe pod private-reg
Якщо ви побачите подію з причиною, встановленою на FailedToRetrieveImagePullSecret, Kubernetes не може знайти Secret із назвою (regcred, у цьому прикладі).
Переконайтеся, що вказаний вами Secret існує і що його назва вірно вказана.
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
Використання образів з кількох реєстрів
Pod може складатись з кількох контейнерів, образи для яких можуть бути з різних реєстрів. Ви можете використовувати кілька imagePullSecrets з одним Podʼом, і кожен може містити кілька облікових даних.
Для витягування образів з реєстрів буде спробувано кожний обліковий запис, який відповідає реєстру. Якщо жоден обліковий запис не відповідає реєстру, витягування образу буде відбуватись без авторизації або з використанням конфігурації, специфічної для виконавчого середовища.
Що далі
- Дізнайтеся більше про Secret
- або перегляньте посилання на API для Secret
- Дізнайтеся більше про використання приватного реєстру.
- Дізнайтеся більше про додавання Secrets для отримання образів до службового облікового запису.
- Подивіться kubectl create secret docker-registry.
- Подивіться поле
imagePullSecretsу визначеннях контейнерів Pod