Развертывание веб-приложения в отказоустойчивой конфигурации в Yandex Cloud
В данном руководстве приведен пример решения задачи по развертыванию веб-приложения в отказоустойчивой конфигурации в инфраструктуре Yandex Cloud. В основе инфраструктуры, обеспечивающей работу веб-приложения, лежит группа масштабируемых управляемых сервисов экосистемы Yandex Cloud: Yandex Managed Service for Kubernetes, Yandex Managed Service for PostgreSQL и Yandex Application Load Balancer.
Кроме указанных основных сервисов, для запуска и проверки веб-приложения используются вспомогательные сервисы: Yandex Container Registry, Yandex Certificate Manager, Yandex Cloud DNS, Yandex Compute Cloud, Yandex Identity and Access Management, Yandex Key Management Service и Yandex Virtual Private Cloud.
Системная архитектура
Инфраструктура решения спроектирована с учетом рекомендаций по построению отказоустойчивой инфраструктуры и рекомендаций по планированию топологии кластеров PostgreSQL.
Сеть
В инфраструктуре решения создается одна облачная сеть Virtual Private Cloud net-todo-app.
Подсети
В сети net-todo-app создается шесть подсетей:
- Подсети
net-todo-app-k8s1,net-todo-app-k8s2иnet-todo-app-k8s3для узлов кластера Kubernetes — по одной подсети в каждой зоне доступности. - Подсети
net-todo-app-db1,net-todo-app-db2иnet-todo-app-db3для узлов кластера PostgreSQL — по одной подсети в каждой зоне доступности.
Группы безопасности
Сетевой доступ к ресурсам инфраструктуры разграничен с помощью следующих групп безопасности:
-
db-todo-appразрешает входящий трафик к узлам кластера PostgreSQL только с узлов кластера Kubernetes на TCP-порт6432. -
k8s-cluster-todo-appразрешает:-
Входящий трафик к кластеру Kubernetes на TCP-порты
443и6443с узлов кластера. -
Группа безопасности также разрешает входящий трафик к кластеру на TCP-порты
443и6443из интернета. Это подходит для тестовой среды.Важно
В производственной среде ограничьте доступ к кластеру Kubernetes внутренними или отдельными публичными IP-адресами.
-
-
k8s-nodes-todo-appразрешает:-
Входящий трафик от других узлов кластера, а также от CIDR кластера и CIDR сервисов.
-
Входящий трафик от кластера Kubernetes на TCP-порты
10250и10256для работыkubectl exec/kubectl logsи для проверок состоянияkubeproxy. -
Входящий трафик от ресурсных единиц Application Load Balancer на TCP-порт
10501для проверок доступности узлов кластера. -
Входящий трафик от любых адресов в интернете на порты в диапазоне
30000-32767для публикации сервисов, запущенных в кластере.Важно
Если доступ к сервисам Kubernetes в обход L7-балансировщика не предполагается, ограничьте доступ к этому диапазону, сохранив его только для ресурсных единиц Application Load Balancer.
-
Входящий трафик от системы проверок состояний Yandex Network Load Balancer. Если использование инструментов Network Load Balancer не предполагается, удалите это правило из группы безопасности.
-
Входящий трафик от кластера Kubernetes на TCP-порт
4443для работы сборщика метрик.
-
-
k8s-alb-todo-appразрешает:- Входящий трафик из интернета на TCP-порты
80и443, обеспечивающий доступ пользователей к веб-приложению. - Входящий трафик на весь диапазон TCP-портов для проверки состояния балансировщика.
- Входящий трафик из интернета на TCP-порты
Кроме этого, все группы безопасности разрешают входящий ICMP-трафик.
Адреса ресурсов
В создаваемой инфраструктуре используются два публичных IP-адреса:
- IP-адрес L7-балансировщика
primary-address-todo-app. - IP-адрес кластера Kubernetes (не учитывается в общей квоте публичных IP-адресов).
Узлы кластеров Kubernetes и PostgreSQL используют внутренние адреса.
PostgreSQL
База данных веб-приложения размещается в управляемом кластере Managed Service for PostgreSQL main-todo-app.
Кластер создан в максимально отказоустойчивой конфигурации с рабочими узлами в трех зонах доступности в соответствии с рекомендациями по планированию топологии кластеров PostgreSQL.
Узлы кластера PostgreSQL не имеют публичных IP-адресов, доступ к базе данных возможен по внутренним IP-адресам и только с узлов кластера Kubernetes или через пользовательский интерфейс Yandex WebSQL.
В кластере созданы база данных todo и пользователь todo, которые используются веб-приложением.
Kubernetes
Для запуска компонентов приложения используется управляемый кластер Managed Service for Kubernetes main-todo-app.
В соответствии с рекомендациями по построению отказоустойчивой инфраструктуры кластер создан в конфигурации:
- Высокодоступный кластер Managed Service for Kubernetes c мастерами в трех зонах доступности.
- В кластере включен сервис NodeLocal DNS Cache для кэширования запросов DNS.
В кластере Kubernetes развернут вспомогательный сервис Application Load Balancer Ingress-контроллер для управления конфигурацией L7-балансировщика с помощью объектов Ingress.
Чтобы управлять вспомогательными сервисами Kubernetes с помощью манифестов Terraform, для кластера включен публичный доступ к API. Доступ к API ограничен с помощью групп безопасности.
Узлам кластера Kubernetes необходим доступ в интернет, в том числе для скачивания Docker-образов из реестра Yandex Container Registry. Доступ в интернет для узлов кластера реализован с помощью NAT-шлюза net-todo-app-egress-nat и привязки к подсетям кластера Kubernetes таблицы маршрутизации net-todo-app-default-route-table. Доступ в интернет не ограничивается.
L7-балансировщик
За балансировку нагрузки на веб-приложение в создаваемой инфраструктуре отвечает управляемый сервис Application Load Balancer. L7-балансировщик Application Load Balancer создается сервисом Managed Service for Kubernetes динамически с помощью объектов Ingress. Ingress-контроллер Application Load Balancer отслеживает изменения объектов Ingress и выполняет соответствующие модификации настроек балансировщика, в том числе его создание и удаление. Ingress входит в Helm-чарт
Application Load Balancer интегрирован с сервисом Yandex Certificate Manager, который выполняет автоматическое получение сертификатов Let's Encrypt
Возможности расширения и модификации
Все компоненты инфраструктуры могут масштабироваться как горизонтально, так и вертикально:
- Для кластера Managed Service for Kubernetes доступно автоматическое масштабирование за счет добавления новых узлов.
- Кластер Managed Service for PostgreSQL поддерживает автоматическое расширение хранилища в зависимости от заполнения, при этом добавление дополнительных узлов кластера выполняется вручную.
- Application Load Balancer поддерживает автоматическое и ручное масштабирование в зависимости от нагрузки.
- Инфраструктуру можно быстро расширить за счет использования других управляемых сервисов, таких как Yandex Managed Service for Valkey™, Yandex Managed Service for Apache Kafka®, Yandex Object Storage и др.
В дополнение к уже имеющимся в решении возможностям вы можете подключить к нему дополнительные компоненты:
- К L7-балансировщику вы можете подключить профиль безопасности Yandex Smart Web Security, который обеспечивает защиту от ботов, DDoS- и веб-атак, а также выполняет функции WAF и ARL.
- Если вам потребуется ограничить доступ в интернет или использовать для доступа фиксированный IP-адрес, вы можете легко модифицировать инфраструктуру и организовать подключение к интернету с помощью NAT-instance или другого сетевого продукта Yandex Cloud Marketplace.
Тестовое приложение
Тестовое веб-приложение todo
Оба компонента собраны и упакованы в образ контейнера на базе образа distrolessgcr.io/distroless/base-debian12, который обеспечивает максимальную компактность и безопасность.
Бэкенд написан на языке Go
Фронтенд написан на React
Docker-образы и Helm-чарт
Планируемый расход ресурсов Yandex Cloud
| Квота | Количество |
|---|---|
| Application Load Balancer | |
| L7-балансировщики | 1 |
| HTTP-роутеры | 2 |
| Группы бэкендов | 2 |
| Целевые группы | 2 |
| Certificate Manager | |
| TLS-сертификаты | 1 |
| Cloud DNS | |
| Зоны DNS | 1 |
| Ресурсные записи | 4 |
| Compute Cloud | |
| Группы виртуальных машин | 3 |
| Виртуальные машины | 3 |
| Диски | 3 |
| Общее количество vCPU виртуальных машин | 12 |
| Общий объем RAM виртуальных машин | 24 ГБ |
| Общий объем нереплицируемых SSD-дисков | 279 ГБ |
| Identity and Access Management | |
| Сервисные аккаунты | 3 |
| Авторизованные ключи | 1 |
| Key Management Service | |
| Симметричные ключи | 1 |
| Managed Service for PostgreSQL | |
| Кластеры PostgreSQL | 1 |
| Общее количество vCPU хостов баз данных | 6 |
| Общий объем RAM хостов баз данных | 24 ГБ |
| Общий объем хранилищ хостов баз данных | 99 ГБ |
| Managed Service for Kubernetes | |
| Кластеры Kubernetes | 1 |
| Группы узлов | 3 |
| Узлы | 3 |
| Общее количество vCPU узлов кластера | 12 |
| Общий объем RAM узлов кластера | 24 ГБ |
| Общий объем дисков узлов кластера | 279 ГБ |
| Общее количество vCPU всех мастеров кластера | 6 |
| Общий объем RAM всех мастеров кластера | 24 ГБ |
| Virtual Private Cloud | |
| Облачные сети | 1 |
| Подсети | 8 |
| Публичные IP-адреса | 1 |
| Статические публичные IP-адреса | 1 |
| Группы безопасности | 4 |
| Шлюзы | 1 |
| NAT-шлюзы | 1 |
| Таблицы маршрутизации | 1 |
| Статические маршруты | 1 |
Прежде чем приступать к созданию инфраструктуры, убедитесь, что в вашем облаке имеется достаточно свободных квот на ресурсы.
Для создания инфраструктуры используется Terraform-провайдер Yandex Cloud. Исходный код руководства доступен на GitHub
Чтобы развернуть веб-приложение в отказоустойчивой среде Yandex Cloud:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для веб-приложения входят:
- плата за вычислительные ресурсы и диски ВМ, на базе которых развертывается кластер Kubernetes (см. тарифы Compute Cloud);
- плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Yandex Application Load Balancer);
- плата за использование мастера управляющего кластера Managed Service for Kubernetes и исходящий трафик (см. тарифы Yandex Managed Service for Kubernetes);
- плата за использование публичных IP-адресов и NAT-шлюза (см. тарифы Yandex Virtual Private Cloud);
- плата за постоянно запущенный кластер Managed Service for PostgreSQL (см. тарифы Managed Service for PostgreSQL);
- плата за использование публичной DNS-зоны и публичные DNS-запросы (см. тарифы Yandex Cloud DNS);
- плата за запись и хранение логов в лог-группе (см. тарифы Yandex Cloud Logging).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-mk8s-ha-todo-application.git -
Перейдите в директорию с репозиторием:
cd yc-mk8s-ha-todo-application -
В файле
terraform.tfvarsзадайте пользовательские параметры:folder_id— идентификатор каталога.target_host— имя вашего домена. Домен должен быть делегирован сервису Yandex Cloud DNS.
-
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
В результате в заданном каталоге будет развернута необходимая инфраструктура. Процесс развертывания может занять до 40 минут.
Примечание
После успешного создания инфраструктуры подождите 5-7 минут, прежде чем тестировать веб-приложение. Это время требуется Ingress-контроллеру, чтобы создать и запустить L7-балансировщик.
Проверьте работу веб-приложения
В адресной строке браузера введите имя вашего домена, которое вы указали в файле terraform.tfvars.
В результате откроется веб-приложение Todo app, развернутое в отказоустойчивой инфраструктуре Yandex Cloud.
Как удалить созданные ресурсы
Чтобы перестать платить за ресурсы и удалить созданную инфраструктуру:
-
В командной строке перейдите в папку, где расположен конфигурационный файл Terraform.
-
Выполните команду:
terraform destroy -
Введите слово
yesи нажмите Enter.
Дождитесь завершения процесса удаления ресурсов. Проконтролировать удаление всех ресурсов вы можете в консоли управления