Создание нового Kubernetes-проекта в Yandex Cloud
В этой статье описан запуск нового Kubernetes-проекта в Yandex Cloud. Приложение из Yandex Container Registry будет развернуто в кластере Managed Service for Kubernetes и опубликовано в интернете через Ingress-контроллер Yandex Application Load Balancer.
Чтобы запустить приложение:
- Создайте сервисные аккаунты.
- Подготовьте ресурсы Kubernetes.
- Подготовьте ресурсы Container Registry.
- Установите Application Load Balancer.
- Создайте балансировщик нагрузки.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Установите утилиту потоковой обработки JSON-файлов
jq
:sudo apt update && sudo apt install jq
Создайте сеть и подсеть
-
Создайте сеть с именем
yc-auto-network
:yc vpc network create --name yc-auto-network
-
Создайте подсеть в зоне доступности
ru-central1-a
:yc vpc subnet create \ --name yc-auto-subnet-0 \ --network-name yc-auto-network \ --range 192.168.1.0/24 \ --zone ru-central1-a
Зарегистрируйте доменную зону и добавьте сертификат
-
Зарегистрируйте публичную доменную зону и делегируйте домен.
-
Если у вас уже есть сертификат для доменной зоны, добавьте сведения о нем в сервис Yandex Certificate Manager.
Если у вас нет сертификата, создайте новый сертификат от Let's Encrypt®.
-
Получите идентификатор сертификата:
yc certificate-manager certificate list
Результат выполнения команды:
+-----------------+-------+----------------+---------------------+----------+--------+ | ID | NAME | DOMAINS | NOT AFTER | TYPE | STATUS | +-----------------+-------+----------------+---------------------+----------+--------+ | <идентификатор> | <имя> | <доменное имя> | 2022-04-06 17:19:37 | IMPORTED | ISSUED | +-----------------+-------+----------------+---------------------+----------+--------+
Создайте сервисные аккаунты
Для работы кластера Kubernetes и балансировщика нагрузки нужны сервисные аккаунты:
- С ролью editor на каталог, в котором создается кластер Kubernetes. От имени этого сервисного аккаунта будут создаваться ресурсы, необходимые кластеру Kubernetes.
- С ролью container-registry.images.puller на каталог с реестром Docker-образов. От имени этого сервисного аккаунта узлы будут скачивать из реестра необходимые Docker-образы.
- Для работы Ingress-контроллера Application Load Balancer, с ролями:
- alb.editor — для создания необходимых ресурсов.
- vpc.publicAdmin — для управления внешней связностью.
- certificate-manager.certificates.downloader — для работы с сертификатами, зарегистрированными в сервисе Certificate Manager.
- compute.viewer — для использования узлов кластера Kubernetes в целевых группах балансировщика нагрузки.
Сервисный аккаунт для ресурсов
Чтобы создать сервисный аккаунт, от имени которого будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes:
-
Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud 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-образы.
-
Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud 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
Сервисный аккаунт, необходимый для работы Application Load Balancer Ingress-контроллера
-
Запишите в переменную идентификатор каталога из конфигурации вашего профиля Yandex Cloud CLI:
BashPowerShellFOLDER_ID=$(yc config get folder-id)
$FOLDER_ID = yc config get folder-id
-
Создайте сервисный аккаунт:
BashPowerShellyc iam service-account create --name k8s-ic-sa-$FOLDER_ID
yc iam service-account create --name k8s-ic-sa-$FOLDER_ID
-
Запишите в переменную идентификатор сервисного аккаунта:
BashPowerShellIC_SA_ID=$(yc iam service-account get --name k8s-ic-sa-$FOLDER_ID --format json | jq .id -r)
$RES_SA_ID = (yc iam service-account get --name k8s-ic-sa-$FOLDER_ID --format json | ConvertFrom-Json).id
-
Назначьте сервисному аккаунту роли на каталог:
yc resource-manager folder add-access-binding \ --id $FOLDER_ID \ --role alb.editor \ --role vpc.publicAdmin \ --role certificate-manager.certificates.downloader \ --role compute.viewer \ --subject serviceAccount:$IC_SA_ID
-
Создайте для сервисного аккаунта авторизованный ключ и сохраните в файл
sa-key.json
:yc iam key create \ --service-account-id $IC_SA_ID \ --output sa-key.json
Подготовьте ресурсы 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
-
Настройте группы безопасности кластера Kubernetes и группы узлов. Группа безопасности группы узлов должна разрешать входящие TCP-соединения к портам 10501 и 10502 из подсетей балансировщика нагрузки или из его группы безопасности (позже подсети и группу нужно будет указать для создания балансировщика).
-
Убедитесь, что вы можете подключиться к кластеру с помощью
kubectl
:kubectl cluster-info
Подготовьте ресурсы 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 nginx 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/nginx:hello
-
Загрузите Docker-образ в реестр:
docker push cr.yandex/$REGISTRY_ID/nginx:hello
-
-
Проверьте, что Docker-образ загрузился в реестр:
yc container image list
Результат выполнения команды:
+----------------------+---------------------+----------------------------+-------+-----------------+ | ID | CREATED | NAME | TAGS | COMPRESSED SIZE | +----------------------+---------------------+----------------------------+-------+-----------------+ | crpa2mf008mpjig73rp6 | 2019-11-20 11:52:17 | crp71hkgiolp6677hg9i/nginx | hello | 27.5 MB | +----------------------+---------------------+----------------------------+-------+-----------------+
Запустите тестовое приложение
Создайте под с приложением из Docker-образа и убедитесь, что для загрузки Docker-образа не потребовалась дополнительная аутентификация в Container Registry.
-
Запустите под с приложением из Docker-образа:
kubectl run --attach hello-nginx --image cr.yandex/$REGISTRY_ID/nginx:hello
-
Убедитесь, что под перешел в состояние
Running
, и узнайте его полное имя:kubectl get pods
Результат выполнения команды:
NAME READY STATUS RESTARTS AGE hello-nginx-5847fb96b4-54g48 1/1 Running 0 1h
-
Посмотрите логи контейнера, запущенного на этом поде:
kubectl logs hello-nginx-5847fb96b4-54g48
Результат выполнения команды:
Hi, I'm inside
Под загрузил Docker-образ без дополнительной аутентификации на стороне Container Registry.
Установите Application Load Balancer
Чтобы установить Application Load Balancer, воспользуйтесь инструкцией.
Создайте балансировщик нагрузки
- Создайте балансировщик нагрузки для сервисов Kubernetes.
-
Создайте файл
ingress.yaml
с манифестом Ingress-контроллера:--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alb-demo-tls annotations: ingress.alb.yc.io/subnets: <список идентификаторов подсетей> ingress.alb.yc.io/security-groups: <список идентификаторов групп безопасности> ingress.alb.yc.io/external-ipv4-address: <auto или статический IP-адрес> ingress.alb.yc.io/group-name: <имя Ingress-группы> spec: tls: - hosts: - <доменное имя> secretName: yc-certmgr-cert-id-<идентификатор TLS-сертификата> rules: - host: <доменное имя> http: paths: - pathType: Prefix path: "/" backend: service: name: service-hello port: name: http --- apiVersion: v1 kind: Service metadata: name: service-hello spec: selector: run: hello-nginx type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 30080
Где:
ingress.alb.yc.io/subnets
— укажите одну или несколько подсетей, с которыми будет работать Application Load Balancer.ingress.alb.yc.io/security-groups
— укажите одну или несколько групп безопасности для Application Load Balancer. Если параметр не задан, используется группа безопасности по умолчанию. Хотя бы одна из групп безопасности должна разрешать исходящие TCP-соединения к портам 10501 и 10502 в подсети группы узлов или в ее группу безопасности.ingress.alb.yc.io/external-ipv4-address
— чтобы получить новый и предоставить публичный доступ к Application Load Balancer из интернета, укажите заранее полученный IP-адрес, либо установите значениеauto
.ingress.alb.yc.io/group-name
— укажите имя группы. Группа объединяет ресурсы Kubernetes Ingress, обслуживаемые отдельным экземпляром Application Load Balancer.
-
Создайте балансировщик нагрузки:
kubectl apply -f ingress.yaml
-
Дождитесь создания балансировщика нагрузки и получения им публичного IP-адреса, это может занять несколько минут:
kubectl get ingress alb-demo-tls
Ожидаемый результат — непустое значение в поле
ADDRESS
для созданного балансировщика нагрузки:NAME CLASS HOSTS ADDRESS PORTS AGE alb-demo-tls <none> <доменное имя> <IP-адрес> 80, 443 15h
По конфигурации балансировщика нагрузки будет автоматически развернут L7-балансировщик.
-
- Перейдите по ссылке
https://<доменное имя>
и убедитесь, что ваше приложение успешно опубликовано.
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их.
-
yc managed-kubernetes cluster delete --name k8s-demo
-
Удалите сервисные аккаунты.
-
Удалите сервисный аккаунт для ресурсов:
yc iam service-account delete --id $RES_SA_ID
-
Удалите сервисный аккаунт для узлов:
yc iam service-account delete --id $NODE_SA_ID
-
Удалите сервисный аккаунт для балансировщика нагрузки:
yc iam service-account delete --id $IC_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
-
yc container image delete --id $IMAGE_ID
-
yc container registry delete --name yc-auto-cr
-
-
Удалите L7-балансировщик нагрузки.