An open API service indexing awesome lists of open source software.

https://github.com/yandex-cloud-examples/yc-mk8s-ha-todo-application

Пример развертывания отказоустойчивого окружения для простого прилложения `Заметки`.
https://github.com/yandex-cloud-examples/yc-mk8s-ha-todo-application

alb alb-ingress cert-manager kubernetes mdb mk8s postgresql terraform yandex-cloud

Last synced: 5 months ago
JSON representation

Пример развертывания отказоустойчивого окружения для простого прилложения `Заметки`.

Awesome Lists containing this project

README

          

# Отказоуйстойчивое размещение приложения в Yandex Cloud

Этот репозиторий содержит демонстрационную сценарий для статьи [Развертывание веб-приложения в отказоустойчивой конфигурации в Yandex Cloud](https://yandex.cloud/ru/docs/architecture/app-in-k8s). В статье рассматривается вопрос создания отказоустойчивой инфраструктуры и развертывания в ней простого приложения todo ('Заметки') в отказоустойчивой конфигурации.

## Создание инфраструктуры и развертывание приложения

Все операции по развертыванию инфраструктуры и приложения выполняются с помощью манифестов terraform и helm чартов.

> [Terraform](https://www.terraform.io/) позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией [Business Source License](https://github.com/hashicorp/terraform/blob/main/LICENSE).

> Подробную информацию о ресурсах провайдера смотрите в документации на сайте [Terraform](https://www.terraform.io/docs/providers/yandex/index.html) или в [зеркале](https://terraform-provider.yandexcloud.net/).

> При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

### Планируемый расход ресурсов

Для развертывания инфраструктуры необходимы следующие квоты:

Application Load Balancer:
- Количество балансировщиков: 1
- Количество HTTP-роутеров: 2
- Количество групп бэкендов: 2
- Количество целевых групп: 2

Certificate Manager:
- Количество сертификатов: 1

Cloud DNS:
- Количество зон: 1
- Общее количество записей: 4

Compute Cloud:
- Количество групп виртуальных машин: 3
- Количество дисков: 3
- Количество vCPU виртуальных машин: 12
- Общий объём RAM виртуальных машин: 24GB
- Количество виртуальных машин: 3
- Общий объём нереплицируемых SSD-дисков: 279

Identity and Access Management:
- Количество сервисных аккаунтов: 3
- Количество авторизованных ключей: 1

Key Management Service:
- Количество симметричных ключей: 1

Managed Databases:
- Количество кластеров: 1
- Объём виртуальной памяти: 24
- Количество vCPU: 6
- Объём SSD-хранилищ: 99

Managed Service for Kubernetes:
- Количество кластеров Kubernetes: 1
- Количество групп узлов: 3
- Количество узлов: 3
- Суммарное количество vCPU для всех узлов: 12
- Суммарный объём RAM: 24
- Суммарный объём дисков: 279
- Суммарное количество vCPU для всех мастеров: 6
- Суммарный объём RAM для всех мастеров: 24

Virtual Private Cloud:
- Количество таблиц маршрутизации: 1
- Количество подсетей: 8
- Количество групп безопасности: 4
- Количество статических маршрутов: 1
- Количество NAT-шлюзов: 1
- Количество шлюзов: 1
- Количество облачных сетей: 1
- Количество статических публичных IP-адресов: 1
- Количество всех публичных IP-адресов: 1

Квоты подобраны таким образом, чтобы расход ресурсов при создании инфраструктуры укладывался в квоты пустого облака, поэтому рекомендуется применять этот манифест в специально созданном для этой цели облаке. Если планируется использование в уже существующем облаке, необходимо убедиться, что имеющиеся квоты достаточны для размещения ресурсов, иначе создание инфраструктуры завершится с ошибкой.

> ВНИМАНИЕ! Для для создания инфраструктуры используются платные ресурсы! Примерная стоимость 1 часа эксплуатация такой инфраструктуры составляет около 100 рублей (по состоянию на 01.07.2025).

| Сервис | Стоимость 1ч |
| :----------------------------- | -----------: |
| VPC | 0,87 ₽ |
| Compute Cloud | 26,59 ₽ |
| Monitoring | 0,00 ₽ |
| Managed Service for Kubernetes | 26,71 ₽ |
| Cloud DNS | 0,07 ₽ |
| Managed Service for PostgreSQL | 28,41 ₽ |
| Yandex Cloud Logging | 0,00 ₽ |
| Lockbox Service | 0,00 ₽ |
| Key Management Service | 0,34 ₽ |
| Application Load Balancer | 12,76 ₽ |
| Итого | 95,75 ₽ |

### Подготовка
Для выполнения сценария создания инфраструктуры с помощью Terraform необходимо выполнить следующие шаги:

1. [Установите Terraform](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#install-terraform), [получите данные для аутентификации](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#get-credentials) и укажите источник для установки провайдера Yandex Cloud (раздел [Настройте провайдер](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-provider), шаг 1).

1. Клонируйте этот репозиторий
```bash
git clone git@github.com:yandex-cloud-examples/yc-mk8s-ha-todo-application.git
```
и перейдите в созданный каталог с исходным кодом
```bash
cd yc-mk8s-ha-todo-application
```

1. В файле `terraform.tfvars` задайте пользовательские параметры:
* `folder_id` — [идентификатор каталога](https://cloud.yandex.ru/docs/resource-manager/operations/folder/get-id).
* `target_host` — доменное имя, на котором будет доступно развернутое приложение: допускается использование доменных имен уровней 2 и выше. Для успешного выполнения манифеста необходимо, чтобы доменное имя предыдущего уровня было [делегировано](https://yandex.cloud/ru/docs/troubleshooting/dns/how-to/delegate-public-zone) в [сервис Yandex Cloud DNS](https://yandex.cloud/ru/docs/dns/concepts/). Например, если для публикации приложения планируется домен todo.yc.example.com, в Yandex Cloud должна быть делегирована зона yc.example.com; если todo.example.com, то делегировать нужно example.com.

Пример файла `terrraform.tfvars`
```bash
folder_id = "b1g7on4b4nbec0rap1d42"
target_host = "todo.yc.example.com"
```

### Создание ресурсов

1. В терминале перейдите в каталог с исходным кодом репозитория

1. Проверьте корректность конфигурационного файла с помощью команды:

```bash
terraform validate
```

Если конфигурация является корректной, появится сообщение:

```text
Success! The configuration is valid.
```

1. Выполните команду:

```bash
terraform plan
```

В терминале будет выведен список запланированных на создание ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

1. Выполните команду создания новой конфигурации:

```bash
terraform apply
```

1. Подтвердите создание: введите в терминале слово `yes` и нажмите **Enter**.

1. Дождитесь завершения работы `terraform`. Об успешном завершении говорит отсутствие сообщений об ошибках и финальное уведомление:

```
Apply complete! Resources: 85 added, 0 changed, 0 destroyed.

Outputs:

cluster_id = "cat....."
db_database = "todo"
db_master_fqdn = "c-c9q......rw.mdb.yandexcloud.net"
db_password =
db_user = "todo"
```
1. После создания инфраструктуры необходимо дождаться перехода ssl сертификата в состояние `issued` и создания Application Load Balancer - это может занять до 40 минут.
1. Проверьте работоспособность приложение: в браузере откройте сайт по адресу, который был указан в параметре `target_host`, например https://todo.yc.example.com.

### Освобождение ресурсов

1. В терминале перейдите в каталог с исходным кодом репозитория.
1. Выполните команду удаления созданных раннее ресурсов:

```bash
terraform destroy
```
1. Подтвердите удаление: введите в терминале слово `yes` и нажмите **Enter**.
1. Дождитесь завершения работы `terraform`. Об успешном завершении говорит отсутствие сообщений об ошибках и финальное уведомление:

```
Destroy complete! Resources: 85 destroyed.
```
1. В случае появления ошибок, подождите 5 минут и повторите пп 2 и 3.

После успешного удаления ресурсов в каталоге могут оставаться объекты ALB: HTTP-роутеры, Группы бэкендов и Целевые группы. Эти объекты не тарифицируются, их можно удалить вручную (удалять необходимо в перечисленном порядке).