Интеграция с Container Registry
Yandex Container Registry — сервис для хранения и распространения Docker-образов. Интеграция с ним позволяет Managed Service for Kubernetes запускать поды с приложениями из Docker-образов, которые хранятся в реестре Container Registry. Для взаимодействия с Container Registry настраивается Docker Credential helper. Он позволяет работать с приватными реестрами с помощью сервисного аккаунта.
Чтобы интегрировать Managed Service for Kubernetes с Container Registry:
- Создайте сервисные аккаунты.
- Создайте группы безопасности.
- Подготовьте необходимые ресурсы Kubernetes.
- Подготовьте необходимые ресурсы Container Registry.
- Подключитесь к кластеру Managed Service for Kubernetes.
- Запустите тестовое приложение.
- Удалите созданные ресурсы.
Перед началом работы
Перейдите в консоль
-
В консоли управления
в списке слева выберите нужное облако. -
Справа сверху нажмите кнопку
Создать каталог. -
Введите имя каталога. Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
(Опционально) Введите описание каталога.
-
Выберите опцию Создать сеть по умолчанию. Будет создана сеть с подсетями в каждой зоне доступности. Также в этой сети будет создана группа безопасности по умолчанию, внутри которой весь сетевой трафик разрешен.
-
Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
-
Посмотрите описание команды создания каталога:
yc resource-manager folder create --help
-
Создайте новый каталог:
-
с именем и без описания:
yc resource-manager folder create \ --name new-folder
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
с именем и описанием:
yc resource-manager folder create \ --name new-folder \ --description "my first folder with description"
-
Создайте сервисные аккаунты
Создайте сервисные аккаунты:
- Сервисный аккаунт для ресурсов с ролями
k8s.clusters.agent
иvpc.publicAdmin
на каталог, в котором создается кластер Managed Service for Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes. - Сервисный аккаунт для узлов Managed Service for Kubernetes с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы Managed Service for Kubernetes будут скачивать из реестра необходимые Docker-образы.
Создайте сервисный аккаунт для ресурсов
Чтобы создать сервисный аккаунт, от имени которого будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes.
-
Запишите в переменную идентификатор каталога из конфигурации вашего профиля CLI:
BashPowerShellFOLDER_ID=$(yc config get folder-id)
$FOLDER_ID = yc config get folder-id
-
Создайте сервисный аккаунт:
BashPowerShellyc iam service-account create --name k8s-res-sa-$FOLDER_ID
yc iam service-account create --name k8s-res-sa-$FOLDER_ID
-
Запишите в переменную идентификатор сервисного аккаунта:
BashPowerShellRES_SA_ID=$(yc iam service-account get --name k8s-res-sa-${FOLDER_ID} --format json | jq .id -r)
$RES_SA_ID = (yc iam service-account get --name k8s-res-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
-
Назначьте сервисному аккаунту роль k8s.clusters.agent на каталог:
yc resource-manager folder add-access-binding \ --id $FOLDER_ID \ --role k8s.clusters.agent \ --subject serviceAccount:$RES_SA_ID
-
Назначьте сервисному аккаунту роль vpc.publicAdmin на каталог:
yc resource-manager folder add-access-binding \ --id $FOLDER_ID \ --role vpc.publicAdmin \ --subject serviceAccount:$RES_SA_ID
Создайте сервисный аккаунт для узлов кластера
Чтобы создать сервисный аккаунт, от имени которого узлы Managed Service for Kubernetes будут скачивать из реестра необходимые Docker-образы.
-
Запишите в переменную идентификатор каталога из конфигурации вашего профиля CLI:
BashPowerShellFOLDER_ID=$(yc config get folder-id)
$FOLDER_ID = yc config get folder-id
-
Создайте сервисный аккаунт:
BashPowerShellyc iam service-account create --name k8s-node-sa-$FOLDER_ID
yc iam service-account create --name k8s-node-sa-$FOLDER_ID
-
Запишите в переменную идентификатор сервисного аккаунта:
BashPowerShellNODE_SA_ID=$(yc iam service-account get --name k8s-node-sa-${FOLDER_ID} --format json | jq .id -r)
$NODE_SA_ID = (yc iam service-account get --name k8s-node-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
-
Назначьте сервисному аккаунту роль container-registry.images.puller на каталог:
yc resource-manager folder add-access-binding \ --id $FOLDER_ID \ --role container-registry.images.puller \ --subject serviceAccount:$NODE_SA_ID
Создайте группы безопасности
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
Подготовьте ресурсы Kubernetes
Создайте кластер Managed Service for Kubernetes
Создайте кластер Managed Service for Kubernetes и укажите ранее созданные сервисные аккаунты во флагах --service-account-id
и --node-service-account-id
и группы безопасности во флаге --security-group-ids
.
Выполните команду:
yc managed-kubernetes cluster create \
--name k8s-demo \
--network-name yc-auto-network \
--zone ru-central1-a \
--subnet-name yc-auto-subnet-0 \
--public-ip \
--service-account-id $RES_SA_ID \
--node-service-account-id $NODE_SA_ID \
--security-group-ids <идентификаторы_групп_безопасности>
Выполните команду:
yc managed-kubernetes cluster create `
--name k8s-demo `
--network-name yc-auto-network `
--zone ru-central1-a `
--subnet-name yc-auto-subnet-0 `
--public-ip `
--service-account-id $RES_SA_ID `
--node-service-account-id $NODE_SA_ID `
--security-group-ids <идентификаторы_групп_безопасности>
Создайте группу узлов Managed Service for Kubernetes
-
Проверьте, что создание кластера Managed Service for Kubernetes успешно завершено.
- В консоли управления
выберите каталог, в котором был создан кластер Managed Service for Kubernetes. - В списке сервисов выберите Managed Service for Kubernetes.
- Проверьте, что кластер Managed Service for Kubernetes успешно создан:
- В столбце Статус должно быть указано
Running
. - В столбце Состояние должно быть указано
Healthy
.
- В столбце Статус должно быть указано
- В консоли управления
-
Создайте группу узлов Managed Service for Kubernetes и укажите ранее созданные группы безопасности во флаге
--network-interface security-group-ids
:BashPowerShellyc managed-kubernetes node-group create \ --name k8s-demo-ng \ --cluster-name k8s-demo \ --platform standard-v3 \ --cores 2 \ --memory 4 \ --core-fraction 50 \ --disk-type network-ssd \ --fixed-size 2 \ --network-interface subnets=yc-auto-subnet-0,ipv4-address=nat,security-group-ids=[<идентификаторы_групп_безопасности>] \ --async
yc managed-kubernetes node-group create ` --name k8s-demo-ng ` --cluster-name k8s-demo ` --platform standard-v3 ` --cores 2 ` --memory 4 ` --core-fraction 50 ` --disk-type network-ssd ` --fixed-size 2 ` --network-interface subnets=yc-auto-subnet-0,ipv4-address=nat,security-group-ids=[<идентификаторы_групп_безопасности>] ` --async
Подготовьте ресурсы Container Registry
Создайте реестр
Создайте реестр контейнеров:
yc container registry create --name yc-auto-cr
Сконфигурируйте Docker Credential helper
Для упрощения аутентификации в Container Registry сконфигурируйте Docker Credential helper. Он позволяет работать с приватными реестрами Yandex Cloud, не выполняя команду docker login
.
Для настройки Credential helper выполните команду:
yc container registry configure-docker
Подготовьте Docker-образ
Соберите Docker-образ и загрузите его в реестр.
-
Создайте Dockerfile
hello.dockerfile
и сохраните в него следующие строки:FROM ubuntu:latest CMD echo "Hi, I'm inside"
-
Соберите Docker-образ.
-
Получите идентификатор реестра, созданного ранее, и запишите его в переменную:
BashPowerShellREGISTRY_ID=$(yc container registry get --name yc-auto-cr --format json | jq .id -r)
$REGISTRY_ID = (yc container registry get --name yc-auto-cr --format json | ConvertFrom-Json).id
-
Соберите Docker-образ:
docker build . -f hello.dockerfile -t cr.yandex/$REGISTRY_ID/ubuntu:hello
-
Загрузите Docker-образ в реестр:
docker push cr.yandex/${REGISTRY_ID}/ubuntu:hello
-
-
Проверьте, что Docker-образ загрузился в реестр:
yc container image list
Результат:
+----------------------+---------------------+-----------------------------+-------+-----------------+ | ID | CREATED | NAME | TAGS | COMPRESSED SIZE | +----------------------+---------------------+-----------------------------+-------+-----------------+ | crpa2mf008mp******** | 2019-11-20 11:52:17 | crp71hkgiolp********/ubuntu | hello | 27.5 MB | +----------------------+---------------------+-----------------------------+-------+-----------------+
Подключитесь к кластеру Managed Service for Kubernetes
Установите kubectl
Запустите тестовое приложение
Запустите под с приложением из Docker-образа и убедитесь, что для загрузки Docker-образа не потребовалась дополнительная аутентификация в Container Registry.
-
Запустите под с приложением из Docker-образа:
kubectl run --attach hello-ubuntu --image cr.yandex/${REGISTRY_ID}/ubuntu:hello
-
Найдите запущенный под и посмотрите его полное имя:
kubectl get po
Результат:
NAME READY STATUS RESTARTS AGE hello-ubuntu-5847fb9***-***** 0/1 Completed 3 61s
-
Посмотрите логи контейнера, запущенного на этом поде:
kubectl logs hello-ubuntu-5847fb9***-*****
Результат:
Hi, I'm inside
Под загрузил Docker-образ без дополнительной аутентификации на стороне Container Registry.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Удалите кластер Managed Service for Kubernetes:
yc managed-kubernetes cluster delete --name k8s-demo
-
Удалите сервисные аккаунты:
Важно
Не удаляйте сервисный аккаунт до удаления кластера Managed Service for Kubernetes.
-
Удалите сервисный аккаунт для ресурсов:
yc iam service-account delete --id $RES_SA_ID
-
Удалите сервисный аккаунт для узлов Managed Service for Kubernetes:
yc iam service-account delete --id $NODE_SA_ID
-
-
Удалите ресурсы Container Registry.
-
Узнайте имя Docker-образа, загруженного в реестр:
BashPowerShellIMAGE_ID=$(yc container image list --format json | jq .[0].id -r)
$IMAGE_ID = (yc container image list --format json | ConvertFrom-Json).id
-
Удалите Docker-образ:
yc container image delete --id $IMAGE_ID
-
Удалите реестр:
yc container registry delete --name yc-auto-cr
-