Интеграция с Container Registry
Для интеграции Kubernetes и Yandex Container Registry создайте следующие ресурсы: сервисные аккаунты для управления ресурсами и доступами к ним, кластер Kubernetes, группу узлов, а также реестр и Docker-образ. Для упрощения аутентификации настройте Docker Credential helper и убедитесь, что под с приложением из Container Registry запускается без дополнительной аутентификации, используя сервисный аккаунт.
- Создайте сервисные аккаунты.
- Подготовьте необходимые ресурсы Kubernetes.
- Подготовьте необходимые ресурсы Container Registry.
- Подключитесь к кластеру Kubernetes.
- Запустите тестовое приложение.
- Удалите созданные ресурсы.
Перед началом работы
Перейдите в консоль Yandex Cloud и выберите каталог, в котором будете выполнять операции. Если такого каталога нет, создайте его:
-
В консоли управления выберите облако и нажмите кнопку
Создать каталог.
-
Введите имя каталога. Требования к имени:
- Длина — от 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"
-
Создайте сервисные аккаунты
Создайте сервисные аккаунты:
- Сервисный аккаунт для ресурсов с ролью editor на каталог, в котором создается кластер Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Kubernetes.
- Сервисный аккаунт для узлов с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.
Создайте сервисный аккаунт для ресурсов
Чтобы создать сервисный аккаунт, от имени которого будут создаваться ресурсы, необходимые кластеру 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
-
Назначьте сервисному аккаунту роль editor на каталог:
yc resource-manager folder add-access-binding \ --id $FOLDER_ID \ --role editor \ --subject serviceAccount:$RES_SA_ID
Создайте сервисный аккаунт для узлов
Чтобы создать сервисный аккаунт, от имени которого узлы будут скачивать из реестра необходимые 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
Подготовьте ресурсы Kubernetes
Создайте кластер Kubernetes
Создайте кластер Kubernetes и укажите ранее созданные сервисные аккаунты в параметрах --service-account-id
и --node-service-account-id
.
Выполните команду:
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
Выполните команду:
> 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
Создайте группу узлов
-
Проверьте, что создание кластера Kubernetes успешно завершено.
- В консоли управления выберите каталог, в котором был создан кластер Kubernetes.
- В списке сервисов выберите Managed Service for Kubernetes.
- Проверьте, что кластер Kubernetes успешно создан:
- В столбце Статус должно быть указано
Running
. - В столбце Состояние должно быть указано
Healthy
.
- В столбце Статус должно быть указано
-
Создайте группу узлов:
BashPowerShellyc managed-kubernetes node-group create \ --name k8s-demo-ng \ --cluster-name k8s-demo \ --platform standard-v3 \ --public-ip \ --cores 2 \ --memory 4 \ --core-fraction 50 \ --disk-type network-ssd \ --fixed-size 2 \ --location subnet-name=yc-auto-subnet-0,zone=ru-central1-a \ --async
> yc managed-kubernetes node-group create ` --name k8s-demo-ng ` --cluster-name k8s-demo ` --platform standard-v3 ` --public-ip ` --cores 2 ` --memory 4 ` --core-fraction 50 ` --disk-type network-ssd ` --fixed-size 2 ` --location subnet-name=yc-auto-subnet-0,zone=ru-central1-a ` --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 | +----------------------+---------------------+-----------------------------+-------+-----------------+ | crpa2mf008mpjig73rp6 | 2019-11-20 11:52:17 | crp71hkgiolp6677hg9i/ubuntu | hello | 27.5 MB | +----------------------+---------------------+-----------------------------+-------+-----------------+
Подключитесь к кластеру Kubernetes
Чтобы работать с кластером Kubernetes с помощью kubectl:
-
Настройте группы безопасности кластера.
Важно
Настройки групп безопасности могут препятствовать подключению к кластеру.
-
Добавьте учетные данные кластера Kubernetes в конфигурационный файл kubectl:
-
Выполните команду:
yc managed-kubernetes cluster get-credentials --external --name k8s-demo
-
Проверьте конфигурацию kubectl:
kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED ...
- По умолчанию учетные данные добавляются в директорию
$HOME/.kube/config
. - Если необходимо изменить расположение конфигураций, используйте флаг
--kubeconfig <путь к файлу>
.
-
Запустите тестовое приложение
Запустите под с приложением из 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-5847fb96b4-54g48 0/1 Completed 3 61s
-
Посмотрите логи контейнера, запущенного на этом поде:
kubectl logs hello-ubuntu-5847fb96b4-54g48
Результат:
Hi, I'm inside
Под загрузил Docker-образ без дополнительной аутентификации на стороне Container Registry.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, во избежание списания средств за них:
-
Удалите кластер Kubernetes:
yc managed-kubernetes cluster delete --name k8s-demo
-
Удалите сервисные аккаунты:
Важно
Не удаляйте сервисный аккаунт до удаления кластера Kubernetes.
-
Удалите сервисный аккаунт для ресурсов:
yc iam service-account delete --id $RES_SA_ID
-
Удалите сервисный аккаунт для узлов:
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
-