Реализация отказоустойчивых сценариев для сетевых виртуальных машин
В Yandex Cloud можно развернуть облачную инфраструктуру с использованием виртуальных машин (далее сетевых ВМ), выполняющих функции межсетевого экранирования, сетевой безопасности и маршрутизации трафика. С помощью статической маршрутизации трафик из подсетей направляется на сетевые ВМ.
Для обеспечения высокой доступности можно развернуть несколько сетевых ВМ в разных зонах доступности и настроить автоматическое переключение исходящего из подсетей трафика с одной сетевой ВМ на другую с помощью модуля route-switcher
В этом практическом руководстве показан пример использования модуля route-switcher для обеспечения отказоустойчивости NAT-инстанса — сетевой ВМ с преднастроенными правилами маршрутизации и трансляции IP-адресов. NAT-инстансы используются для организации доступа в интернет виртуальных машин и других облачных ресурсов, размещенных в Yandex Cloud.
В примере на схеме NAT-инстанс NAT-A
является основным для исходящего в интернет трафика, а NAT-B
— резервным.
Описание элементов схемы
Название элемента | Описание |
---|---|
NAT-A, NAT-B | NAT-инстансы, обеспечивающие доступ облачных ресурсов в интернет с помощью трансляции внутренних IP-адресов ресурсов в публичные IP-адреса NAT-инстансов |
VPC: demo | Сеть Virtual Private Cloud |
private-a | Подсеть в зоне ru-central1-a для размещения ресурсов, которым требуется доступ в интернет |
public-a, public-b | Подсети в зонах ru-central1-a и ru-central1-b , в которых располагаются NAT-инстансы |
public ip a, public ip b | Публичные IP-адреса NAT-инстансов |
NLB | Внутренний сетевой балансировщик для работы модуля route-switcher, осуществляет проверку доступности NAT-инстансов с помощью проверок состояния на порт TCP 22 |
В случае отказа NAT-A
модуль route-switcher переключит исходящий трафик на NAT-B
, изменив в таблице маршрутизации для подсети значение Next hop
на внутренний IP-адрес NAT-B
. После чего доступ в интернет будет обеспечен через NAT-B
.
После восстановления NAT-A
модуль route-switcher перенаправит исходящий трафик через NAT-A
, поменяв в таблице маршрутизации значение Next hop
на внутренний IP-адрес ВМ NAT-A
.
С помощью данного практического руководства вы создадите тестовую инфраструктуру, демонстрирующую работу модуля route-switcher. Решение включает следующие основные элементы:
- nat-a — основной NAT-инстанс;
- nat-b — резервный NAT-инстанс;
- test-vm — ВМ внутреннего периметра инфраструктуры, для которой организуется доступ в интернет через NAT-инстанс;
- route-switcher-lb-... — сетевой балансировщик для работы модуля route-switcher и проверки доступности NAT-инстансов;
- route-switcher-... — облачная функция, обеспечивающая переключение исходящего трафика в случае отказа основного NAT-инстанса.
Чтобы развернуть тестовую инфраструктуру и проверить работу модуля route-switcher:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Разверните ресурсы.
- Включите работу модуля route-switcher.
- Протестируйте работоспособность и отказоустойчивость решения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за постоянно работающие ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование Network Load Balancer (см. тарифы Yandex Network Load Balancer);
- плата за использование публичных IP-адресов и исходящий трафик (см. тарифы Yandex Virtual Private Cloud);
- плата за использование функции (см. тарифы Yandex Cloud Functions);
Настройте профиль CLI
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его и авторизуйтесь от имени пользователя.
-
Создайте сервисный аккаунт:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
sa-terraform
. - Нажмите кнопку Создать.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Выполните команду для создания сервисного аккаунта, указав имя
sa-terraform
:yc iam service-account create --name sa-terraform
Где
name
— имя сервисного аккаунта.Результат:
id: ajehr0to1g8b******** folder_id: b1gv87ssvu49******** created_at: "2023-06-20T09:03:11.665153755Z" name: sa-terraform
Чтобы создать сервисный аккаунт, воспользуйтесь вызовом gRPC API ServiceAccountService/Create или методом create для ресурса
ServiceAccount
REST API. - В консоли управления
-
Назначьте сервисному аккаунту роль администратора на каталог:
Консоль управленияCLIAPI- На стартовой странице
консоли управления выберите каталог. - Перейдите на вкладку Права доступа.
- Найдите аккаунт
sa-terraform
в списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль
admin
.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role admin \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Чтобы назначить сервисному аккаунту роль на каталог, воспользуйтесь методом REST API setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
- На стартовой странице
-
Настройте профиль CLI для выполнения операций от имени сервисного аккаунта:
CLI-
Создайте авторизованный ключ для сервисного аккаунта и запишите его в файл:
yc iam key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --folder-id <id_каталога_с_сервисным_аккаунтом> \ --output key.json
Где:
service-account-id
— идентификатор сервисного аккаунта.folder-id
— идентификатор каталога, в котором создан сервисный аккаунт.output
— имя файла с авторизованным ключом.
Результат:
id: aje8nn871qo4******** service_account_id: ajehr0to1g8b******** created_at: "2023-06-20T09:16:43.479156798Z" key_algorithm: RSA_2048
-
Создайте профиль CLI для выполнения операций от имени сервисного аккаунта:
yc config profile create sa-terraform
Результат:
Profile 'sa-terraform' created and activated
-
Задайте конфигурацию профиля:
yc config set service-account-key key.json
Где:
service-account-key
— файл с авторизованным ключом сервисного аккаунта. -
Добавьте аутентификационные данные в переменные окружения:
export YC_TOKEN=$(yc iam create-token)
-
Подготовьте среду для развертывания ресурсов
-
Установите Git
с помощью команды:sudo apt install git
-
Клонируйте репозиторий
yandex-cloud-examples/yc-route-switcher
из GitHub и перейдите в папку сценария:git clone https://github.com/yandex-cloud-examples/yc-route-switcher.git cd yc-route-switcher/examples
-
Откройте файл
terraform.tfvars
, например, с помощью редактораnano
:nano terraform.tfvars
-
Отредактируйте:
-
Строку, содержащую идентификатор каталога:
folder_id = "<идентификатор_каталога>"
-
Строку, содержащую список разрешенных публичных IP-адресов для доступа к ВМ
test-vm
:trusted_ip_for_mgmt = ["<внешний_IP_рабочей_станции>/32"]
Где:
<внешний_IP_рабочей_станции>
— публичный IP-адрес вашей рабочей станции.Чтобы узнать внешний IP рабочей станции, выполните:
curl 2ip.ru
Результат:
192.240.24.87
-
Разверните ресурсы
-
Выполните инициализацию Terraform:
terraform init
-
Проверьте конфигурацию Terraform-файлов:
terraform validate
-
Проверьте список создаваемых облачных ресурсов:
terraform plan
-
Создайте ресурсы:
terraform apply
-
Дождитесь окончания развертывания ресурсов и сохраните итоговую выдачу команды:
Outputs: nat-a_public_ip_address = "***.***.129.139" nat-b_public_ip_address = "***.***.105.234" path_for_private_ssh_key = "./pt_key.pem" test_vm_password = <sensitive> vm_username = "admin"
Включите работу модуля route-switcher
-
Убедитесь, что NAT-инстансы перешли в рабочее состояние и доступны внутри сети:
Консоль управления- В консоли управления
выберите нужный в каталог. - Выберите сервис Network Load Balancer и перейдите на страницу сетевого балансировщика
route-switcher-lb-...
. - Раскройте целевую группу и убедитесь, что состояния целевых ресурсов имеет статус
Healthy
.
- В консоли управления
-
Откройте файл
route-switcher.tf
, например, с помощью редактораnano
:nano route-switcher.tf
-
Измените значение параметра
start_module
модуляroute-switcher
наtrue
. -
Запустите модуль, выполнив команду:
terraform apply
В течение 5 минут после развертывания ресурсов модуль route-switcher начнет работу по обеспечению отказоустойчивости исходящего трафика в интернет через NAT-инстанс.
Протестируйте работоспособность и отказоустойчивость решения
Тестирование работоспособности системы
-
Подключитесь к серийной консоли ВМ
test-vm
:Консоль управления- В консоли управления
выберите нужный в каталог. - Выберите сервис Compute Cloud.
- В списке ВМ выберите
test-vm
. - Перейдите на вкладку Серийная консоль.
- Дождитесь полной загрузки операционной системы.
- В консоли управления
-
Введите логин
admin
и пароль.
Чтобы узнать пароль, на рабочей станции в папке с terraform-сценарием выполните команду:terraform output test_vm_password
-
Убедитесь, что доступ в интернет ВМ
test-vm
получает через публичный IP-адрес NAT-инстансаnat-a
. Для этого в серийной консоли выполните команду:curl ifconfig.co
Сравните IP-адрес со значением
nat-a_public_ip_address
из итоговой выдачи. -
Запустите исходящий трафик с помощью команды
ping
на тестовой ВМ к ресурсу в интернете:ping ya.ru
Убедитесь, что пакеты возвращаются:
PING ya.ru (77.88.55.242) 56(84) bytes of data. 64 bytes from ya.ru (77.88.55.242): icmp_seq=1 ttl=56 time=4.67 ms 64 bytes from ya.ru (77.88.55.242): icmp_seq=2 ttl=56 time=3.83 ms 64 bytes from ya.ru (77.88.55.242): icmp_seq=3 ttl=56 time=3.80 ms 64 bytes from ya.ru (77.88.55.242): icmp_seq=4 ttl=56 time=3.78 ms
-
Убедитесь, что значение
Next hop
в таблице маршрутизации для сетиdemo
соответствует внутреннему IP-адресу ВМnat-a
.
Тестирование отказоустойчивости системы
-
Отключите основной NAT-инстанс, эмулируя отказ системы:
Консоль управленияCLIAPI- В консоли управления
выберите нужный в каталог. - Выберите сервис Compute Cloud.
- Выберите ВМ
nat-a
в списке, нажмите значок и выберите Остановить. - В открывшемся окне нажмите кнопку Остановить.
-
Посмотрите описание команды CLI для остановки ВМ:
yc compute instance stop --help
-
Остановите ВМ:
yc compute instance stop nat-a
Воспользуйтесь методом REST API stop для ресурса Instance или вызовом gRPC API InstanceService/Stop.
- В консоли управления
-
Наблюдайте за пропаданием пакетов, отправляемых
ping
.
После отключения основного NAT-инстанса может наблюдаться пропадание трафика в среднем в течение 1 минуты, после чего трафик должен восстановиться. -
Убедитесь, что доступ в интернет теперь осуществляется через публичный IP-адрес NAT-инстанса
nat-b
. Для этого в серийной консоли остановитеping
и выполните команду:curl ifconfig.co
Сравните IP-адрес со значением
nat-b_public_ip_address
из итоговой выдачи. -
Убедитесь, что route-switcher изменил значение
Next hop
в таблице маршрутизации для сетиdemo
, и теперь оно соответствует внутреннему IP-адресу ВМnat-b
. -
Запустите исходящий трафик с помощью команды
ping
на тестовой ВМ. -
Запустите основной NAT-инстанс, эмулируя восстановление системы:
Консоль управленияCLIAPI- В консоли управления
выберите нужный в каталог. - Выберите сервис Compute Cloud.
- Выберите ВМ
nat-a
в списке, нажмите значок и выберите Остановить. - В открывшемся окне нажмите кнопку Запустить.
-
Посмотрите описание команды CLI для остановки ВМ:
yc compute instance start --help
-
Остановите ВМ:
yc compute instance start nat-a
Воспользуйтесь методом REST API start для ресурса Instance или вызовом gRPC API InstanceService/Start.
- В консоли управления
-
Наблюдайте за выдачей утилиты
ping
. В процессе восстановления NAT-A может не наблюдаться потери отправляемых пакетов. -
Убедитесь, что доступ в интернет опять осуществляется через публичный IP-адрес NAT-инстанса
nat-a
. Для этого в серийной консоли остановитеping
и выполните команду:curl ifconfig.co
Сравните IP-адрес со значением
nat-a_public_ip_address
из итоговой выдачи. -
Убедитесь, что route-switcher изменил значение
Next hop
в таблице маршрутизации для сетиdemo
, и оно опять соответствует внутреннему IP-адресу ВМnat-a
.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы выполните команду:
terraform destroy
Важно
Terraform удалит все ресурсы без возможности восстановления: сети, подсети, виртуальные машины, балансировщик и т.д.