Отримання образів з приватного реєстру
Ця сторінка показує, як створити 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
, у цьому прикладі). Якщо ви вказали, що Pod потребує облікових даних для отримання образів, kubelet перевіряє, чи може він отримати доступ до цього Secret, перед тим як спробувати отримати образ.
Переконайтеся, що вказаний вами Secret існує і що його назва вірно вказана.
Events:
... Reason ... Message
------ -------
... FailedToRetrieveImagePullSecret ... Unable to retrieve some image pull secrets (<regcred>); attempting to pull the image may not succeed.
Що далі
- Дізнайтеся більше про Secret
- або перегляньте посилання на API для Secret
- Дізнайтеся більше про використання приватного реєстру.
- Дізнайтеся більше про додавання Secrets для отримання образів до службового облікового запису.
- Подивіться kubectl create secret docker-registry.
- Подивіться поле
imagePullSecrets
у визначеннях контейнерів Pod
Елементи на цій сторінці відносяться до сторонніх продуктів чи проєктів, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Ознайомтесь з настановами на вебсайті CNCF для отримання докладної інформації.
Ознайомтесь з посібником з контенту перед тим, як пропонувати додавання посилання на стороні компоненти.