Проверка состояния приложений в кластере Yandex Managed Service for Kubernetes с помощью Ingress-контроллера Yandex Application Load Balancer
Вы можете автоматически проверять работоспособность приложений, которые развернуты в кластере Managed Service for Kubernetes с помощью Ingress-контроллера Application Load Balancer.
Ingress-контроллер, установленный в кластер, разворачивает L7-балансировщик со всеми необходимыми ресурсами Application Load Balancer, основываясь на конфигурации созданных вами ресурсов Ingress и HttpBackendGroup.
L7-балансировщик автоматически проверяет работоспособность приложения в кластере. В зависимости от результатов проверки L7-балансировщик открывает или закрывает внешний трафик к бэкенду (ресурсу Service). Подробнее см. в Проверки состояния.
По умолчанию Ingress-контроллер Application Load Balancer принимает от L7-балансировщика запросы для проверок состояния приложения на TCP-порт 10501
и проверяет работоспособность подов kube-proxy
С помощью этого руководства вы настроите собственные проверки состояния приложения в параметрах ресурса HttpBackendGroup и откроете для этих проверок отдельный порт на узлах кластера в параметрах ресурса Service типа NodePort
.
Результат проверок состояния приложения можно будет посмотреть в консоли управления
Примечание
Настроить проверки состояния приложения также можно с помощью аннотации ingress.alb.yc.io/health-checks ресурса Service.
Чтобы развернуть приложение в кластере Managed Service for Kubernetes и настроить к нему доступ и проверки состояния через Application Load Balancer:
- Подготовьте облако к работе.
- Создайте Docker-образ.
- Разверните тестовое приложение.
- Подготовьте адрес для L7-балансировщика.
- Создайте ресурсы Ingress и HttpBackendGroup.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Подготовьте инфраструктуру
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Приложение будет доступно на узлах кластера Managed Service for Kubernetes на порте
30080
. Проверка состояния приложения будет доступна на порте30081
. Убедитесь, что эти порты открыты для L7-балансировщика в группе безопасности группы узлов. Вы также можете сделать эти порты доступными из интернета.Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes. При создании укажите группы безопасности, подготовленные ранее.
Если вы планируете работать с кластером в пределах сети Yandex Cloud, выделять кластеру публичный IP-адрес не нужно. Для подключений извне предоставьте кластеру публичный адрес.
-
Создайте группу узлов. Выделите ей публичный адрес, чтобы предоставить доступ в интернет и возможность скачивать Docker-образы и компоненты. Укажите группы безопасности, подготовленные ранее.
-
Создайте реестр Yandex Container Registry.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации k8s-custom-health-checks.tf
.В этом файле описаны:
- сеть;
- подсеть;
- группы безопасности, необходимые для кластера и группы узлов Managed Service for Kubernetes, а также для балансировщика Application Load Balancer;
- сервисный аккаунт, необходимый для работы кластера Kubernetes;
- кластер Kubernetes;
- группа узлов Kubernetes;
- реестр Yandex Container Registry.
-
Укажите в файле
k8s-custom-health-checks.tf
:folder_id
— идентификатор облачного каталога, такой же, как в настройках провайдера.k8s_version
— версия Kubernetes. Доступные версии перечислены в разделе Релизные каналы.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Установите Ingress-контроллер Application Load Balancer
Установите приложение ALB Ingress Controller согласно инструкции в отдельном пространстве имен yc-alb
. Далее в этом пространстве имен будут созданы все нужные ресурсы Kubernetes.
Установите дополнительные зависимости
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Установите kubectl
и настройте его на работу с созданным кластером.Если для кластера не предоставлен публичный адрес и
kubectl
настроен через внутренний адрес кластера, выполняйте командыkubectl
на ВМ Yandex Cloud, находящейся в одной сети с кластером. -
Аутентифицируйтесь в Yandex Container Registry с помощью Docker Credential helper.
Создайте Docker-образ
Исходные файлы для создания Docker-образа размещены в репозитории yc-mk8s-alb-ingress-health-checks
Docker-образ будет создан из файла app/Dockerfile
и будет содержать код тестового приложения из файла app/healthchecktest.go
. Из полученного Docker-образа вы развернете приложение в кластере Managed Service for Kubernetes.
Приложение будет отвечать на HTTP-запросы следующим образом в зависимости от порта пода:
80
— возвращать в теле ответа path-параметры запроса, например/test-path
. Это основная функциональность приложения, которая будет доступна через L7-балансировщик.8080
— возвращать в теле ответа сообщениеOK
. Эта функциональность будет использоваться для проверки состояния приложения.
Успешное выполнение запроса будет сопровождаться HTTP-кодом 200 OK
.
Чтобы создать Docker-образ:
-
Склонируйте репозиторий
yc-mk8s-alb-ingress-health-checks
:git clone git@github.com:yandex-cloud-examples/yc-mk8s-alb-ingress-health-checks.git
-
В терминале перейдите в корень директории с репозиторием.
-
Получите идентификатор реестра Container Registry. Его можно запросить вместе со списком реестров в каталоге.
-
В переменную окружения добавьте название Docker-образа, который будет создан:
export TEST_IMG=cr.yandex/<идентификатор_реестра>/example-app1:latest
-
Соберите Docker-образ:
docker build -t ${TEST_IMG} -f ./app/Dockerfile .
В команде указан путь для корневой директории репозитория.
-
Загрузите Docker-образ в реестр:
docker push ${TEST_IMG}
Если не получается загрузить образ, выполните следующие действия:
- Убедитесь, что вы аутентифицировались в Container Registry с помощью Docker Credential helper.
- Настройте доступ к реестру — предоставьте разрешение PUSH на загрузку Docker-образов для IP-адреса вашего компьютера.
Разверните тестовое приложение
Соберите тестовое приложение из созданного Docker-образа и конфигурационного файла app/testapp.yaml
Файл содержит описание Kubernetes-ресурсов: Deployment
и Service
типа NodePort
.
Ресурс Service
содержит описание портов, через которые приложение будет доступно на узлах кластера:
spec.ports.name: http
— порт для доступа к основной функциональности приложения.80
на поде и30080
на узле.spec.ports.name: health
— порт для проверок состояния приложения.8080
на поде и30081
на узле.
Чтобы собрать тестовое приложение:
-
Укажите значение переменной окружения
TEST_IMG
в полеspec.template.spec.containers.image
в файлеapp/testapp.yaml
. Получите это значение с помощью команды:printenv TEST_IMG
-
Создайте приложение из файла
app/testapp.yaml
:kubectl apply -f ./app/testapp.yaml --namespace=yc-alb
В команде указан путь для корневой директории репозитория.
-
Убедитесь, что поды с приложением запустились:
kubectl get po --namespace=yc-alb
Результат:
NAME READY STATUS RESTARTS AGE alb-demo-1-54b95979b4-*** 1/1 Running 0 71s alb-demo-1-54b95979b4-*** 1/1 Running 0 71s yc-alb-ingress-controller-*** 1/1 Running 0 11m yc-alb-ingress-controller-hc-*** 1/1 Running 0 11m
-
Протестируйте функциональность приложения, указав в запросе IP-адрес узла кластера Managed Service for Kubernetes. Вы можете узнать IP-адрес узла в консоли управления
.-
Основная функциональность:
curl --include http://<IP-адрес_узла>:30080/test-path
Результат:
HTTP/1.1 200 OK Date: Thu, 18 Jul 2024 11:55:52 GMT Content-Length: 10 Content-Type: text/plain; charset=utf-8 /test-path%
-
Проверка состояния приложения:
curl --include http://<IP-адрес_узла>:30081
Результат:
HTTP/1.1 200 OK Date: Thu, 18 Jul 2024 12:00:57 GMT Content-Length: 2 Content-Type: text/plain; charset=utf-8 OK%
-
Подготовьте адрес для L7-балансировщика
По полученному адресу приложение будет доступно из интернета.
Чтобы подготовить адрес для балансировщика:
-
Зарезервируйте статический публичный IP-адрес для балансировщика Application Load Balancer.
-
Зарегистрируйте публичную доменную зону и делегируйте домен.
-
Чтобы привязать адрес к домену, создайте A-запись для делегированного домена. В качестве значения записи укажите зарезервированный IP-адрес.
-
Убедитесь, что A-запись добавилась:
host <домен>
Результат:
<домен> has address <IP-адрес>
-
Расположите файл конфигурации address-for-k8s-health-checks.tf
в той же рабочей директории, где находится файлk8s-custom-health-checks.tf
.В файле
address-for-k8s-health-checks.tf
описаны:- статический публичный IP-адрес;
- публичная DNS-зона;
- A-запись для этой зоны, чтобы привязать зарезервированный IP-адрес к делегированному домену.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Убедитесь, что A-запись добавилась:
host <домен>
Результат:
<домен> has address <IP-адрес>
Создайте ресурсы Ingress и HttpBackendGroup
На основании ресурсов Ingress и HttpBackendGroup Ingress-контроллер развернет L7-балансировщик со всеми необходимыми ресурсами Application Load Balancer.
Конфигурационные файлы ingress.yaml
и httpbackendgroup.yaml
для указанных ресурсов расположены в репозитории yc-mk8s-alb-ingress-health-checks
Настройки пользовательских проверок состояния приложения задаются в ресурсе HttpBackendGroup
в параметре spec.backends.healthChecks
.
Чтобы создать ресурсы:
-
В файле
ingress.yaml
укажите следующие значения для аннотаций:ingress.alb.yc.io/subnets
— список идентификаторов подсетей, в которых размещается кластер Managed Service for Kubernetes.ingress.alb.yc.io/security-groups
— список идентификаторов групп безопасности для Application Load Balancer.ingress.alb.yc.io/external-ipv4-address
— зарезервированный статический публичный IP-адрес.
-
В этом же файле
ingress.yaml
укажите делегированный домен в параметреspec.rules.host
. -
Чтобы создать ресурсы
Ingress
иHttpBackendGroup
, выполните следующую команду из корня директории с репозиторием:kubectl apply -f ingress.yaml --namespace=yc-alb && kubectl apply -f httpbackendgroup.yaml --namespace=yc-alb
-
Дождитесь создания ресурсов, развертывания балансировщика и назначения ему публичного IP-адреса, это может занять несколько минут.
Чтобы отслеживать создание ресурса
Ingress
и убедиться в отсутствии ошибок, откройте логи пода, в котором запущен процесс создания:-
В консоли управления
перейдите на страницу каталога и выберите сервис Managed Service for Kubernetes. -
Нажмите на имя нужного кластера и на панели слева выберите Рабочая нагрузка.
-
Выберите под
yc-alb-ingress-controller-*
(неyc-alb-ingress-controller-hc-*
), в котором запущен процесс создания ресурсов. -
На странице пода перейдите на вкладку Логи.
В режиме реального времени записываются и отображаются логи о создании ресурсов. Если возникла ошибка во время создания, она появится в логах.
-
Проверьте результат
-
Убедитесь, что ресурс
Ingress
создан. Для этого выполните команду и проверьте, что в полеADDRESS
в выводе команды появилось значение:kubectl get ingress alb-demo --namespace=yc-alb
Результат:
NAME CLASS HOSTS ADDRESS PORTS AGE alb-demo <none> <домен> <IP-адрес> 80 15h
-
Проверьте доступность развернутого приложения через L7-балансировщик:
curl --include http://<домен>/test-path
Результат:
HTTP/1.1 200 OK date: Thu, 18 Jul 2024 12:23:51 GMT content-length: 10 content-type: text/plain; charset=utf-8 server: ycalb /test-path%
Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
-
Проверьте, что работают проверки состояния приложения:
Консоль управления- В консоли управления
перейдите на страницу каталога и выберите сервис Application Load Balancer. - Нажмите на имя нужного балансировщика и на панели слева выберите Проверки состояния.
- Проверьте состояние целевых ресурсов. Если они в статусе
HEALTHY
, значит, приложение доступно и работает.
- В консоли управления
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них:
- L7-балансировщик Application Load Balancer.
- HTTP-роутер Application Load Balancer.
- Группу бэкендов Application Load Balancer.
- Целевую группу Application Load Balancer.
- Группу узлов Managed Service for Kubernetes.
- Кластер Managed Service for Kubernetes.
- Реестр Container Registry.
- Публичную доменную зону Cloud DNS.
- Группы безопасности Virtual Private Cloud.
- Статический публичный IP-адрес Virtual Private Cloud.