Проверка состояния приложений в кластере Yandex Managed Service for Kubernetes с помощью L7-балансировщика Yandex Application Load Balancer
Вы можете автоматически проверять работоспособность приложений, которые развернуты в кластере Managed Service for Kubernetes с помощью Ingress-контроллера Application Load Balancer.
Совет
Вместо Ingress-контроллера Application Load Balancer рекомендуется использовать новый контроллер Yandex Cloud Gwin.
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 и настроить к нему доступ и проверки состояния через L7-балансировщик Application Load Balancer:
- Подготовьте облако к работе.
- Создайте Docker-образ.
- Разверните тестовое приложение.
- Подготовьте адрес для L7-балансировщика.
- Создайте ресурсы Ingress и HttpBackendGroup.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за DNS-зону и DNS-запросы (см. тарифы Cloud DNS).
- Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
- Плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer).
- Плата за публичные IP-адреса для узлов кластера и L7-балансировщика (см. тарифы Virtual Private Cloud).
- Плата за использование хранилища Container Registry.
Подготовьте облако к работе
Подготовьте инфраструктуру
-
Создайте группы безопасности для кластера 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), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду
yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров--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.yandexcloud.kz/<идентификатор_реестра>/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— одна или несколько подсетей, в которых будет расположен L7-балансировщик Application Load Balancer.ingress.alb.yc.io/security-groups— одна или несколько групп безопасности для балансировщика. Если параметр не задан, используется группа безопасности по умолчанию. Хотя бы одна из групп безопасности должна разрешать исходящее TCP-соединение к порту10501в подсети группы узлов Managed Service for Kubernetes или в ее группу безопасности.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-адреса, это может занять несколько минут.
Чтобы отслеживать создание балансировщика и убедиться в отсутствии ошибок, откройте логи пода, в котором запущен процесс создания:
-
В консоли управления
перейдите на страницу каталога и выберите сервис Managed Service for Kubernetes. -
Нажмите на имя нужного кластера и на панели слева выберите Рабочая нагрузка.
-
Выберите под
yc-alb-ingress-controller-*(неyc-alb-ingress-controller-hc-*), в котором запущен процесс создания ресурсов. -
На странице пода перейдите на вкладку Логи.
В режиме реального времени записываются и отображаются логи о создании балансировщика. Если возникла ошибка во время создания, она появится в логах.
-
Проверьте результат
-
Убедитесь, что балансировщик создан. Для этого выполните команду и проверьте, что в поле
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.