Создание нового Kubernetes-проекта в Yandex Cloud
В этой статье описан запуск нового Kubernetes-проекта в Yandex Cloud. Приложение из Yandex Container Registry будет развернуто в кластере Managed Service for Kubernetes и опубликовано в интернете через Ingress-контроллер Yandex Application Load Balancer.
Если вам нужно создать кластер Managed Service for Kubernetes без доступа в интернет, обратитесь к разделу Создание и настройка кластера Managed Service for Kubernetes без доступа в интернет.
Чтобы запустить приложение:
- Создайте сервисные аккаунты.
- Создайте группы безопасности.
- Подготовьте ресурсы Kubernetes.
- Подключитесь к кластеру Managed Service for 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® и добавьте его в Certificate Manager.
-
Получите идентификатор сертификата:
yc certificate-manager certificate list
Результат:
+-----------------+-------+----------------+---------------------+----------+--------+ | ID | NAME | DOMAINS | NOT AFTER | TYPE | STATUS | +-----------------+-------+----------------+---------------------+----------+--------+ | <идентификатор> | <имя> | <доменное_имя> | 2022-04-06 17:19:37 | IMPORTED | ISSUED | +-----------------+-------+----------------+---------------------+----------+--------+
Создайте сервисные аккаунты
Для работы кластера Managed Service for Kubernetes и балансировщика нагрузки нужны сервисные аккаунты:
- Сервисный аккаунт с ролями
k8s.clusters.agent
иvpc.publicAdmin
на каталог, в котором создается кластер Managed Service for Kubernetes. От имени этого сервисного аккаунта будут создаваться ресурсы, необходимые кластеру Managed Service for Kubernetes. - Сервисный аккаунт с ролью container-registry.images.puller на каталог с реестром Docker-образов. От имени этого сервисного аккаунта узлы будут скачивать из реестра необходимые Docker-образы.
- Для работы Ingress-контроллера Application Load Balancer, с ролями:
- alb.editor — для создания необходимых ресурсов.
- vpc.publicAdmin — для управления внешней связностью.
- certificate-manager.certificates.downloader — для работы с сертификатами, зарегистрированными в сервисе Certificate Manager.
- compute.viewer — для использования узлов кластера Managed Service for 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
Создайте группы безопасности
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
Подготовьте ресурсы 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
Подключитесь к кластеру Managed Service for Kubernetes
Установите kubectl
Подготовьте ресурсы 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 | +----------------------+---------------------+----------------------------+-------+-----------------+ | crpa2mf008mp******** | 2019-11-20 11:52:17 | crp71hkgiolp********/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-5847fb96**-***** 1/1 Running 0 1h
-
Посмотрите логи контейнера, запущенного на этом поде:
kubectl logs hello-nginx-5847fb96**-*****
Результат:
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: <способ_назначения_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 в подсети группы узлов или в ее группу безопасности. -
ingress.alb.yc.io/external-ipv4-address
— чтобы получить новый и предоставить публичный доступ к Application Load Balancer из интернета, укажите заранее полученный IP-адрес, либо установите значениеauto
.Если вы указали значение
auto
, то при удалении Ingress-контроллера IP-адрес также будет удален из облака. Чтобы избежать этого, используйте имеющийся зарезервированный адрес. -
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://<доменное_имя>
и убедитесь, что ваше приложение успешно опубликовано.Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Удалите кластер Managed Service for Kubernetes:
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-балансировщик нагрузки.