From 2675495eefca6a4b8445617dbdeb2d0a1872d4b6 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Mon, 28 Sep 2026 09:18:36 +0300 Subject: [PATCH] =?UTF-8?q?docs(pipeline):=20=D1=86=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20vApp=20->=20=D0=92=D0=9C=20=E2=80=94=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20(?= =?UTF-8?q?=D0=BA=D0=B2=D0=BE=D1=82=D0=B0=20CPU=20vDC,=204-=D0=B9=20IP,=20?= =?UTF-8?q?SSH-=D0=BA=D0=BB=D1=8E=D1=87),=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D1=8B=20=D0=92=D0=9C=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=8B,=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF,=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=206=20=D1=81=20=D1=87=D0=B5?= =?UTF-8?q?=D0=BA-=D0=BB=D0=B8=D1=81=D1=82=D0=BE=D0=BC,=20destroy=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20vApp/=D0=92=D0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/curated/pipeline/vdc_edge_ip_snat.md | 105 +++++++++++++++++++--- 1 file changed, 92 insertions(+), 13 deletions(-) diff --git a/docs/curated/pipeline/vdc_edge_ip_snat.md b/docs/curated/pipeline/vdc_edge_ip_snat.md index 74026b7..59697d7 100644 --- a/docs/curated/pipeline/vdc_edge_ip_snat.md +++ b/docs/curated/pipeline/vdc_edge_ip_snat.md @@ -1,4 +1,4 @@ -# Как развернуть vDC, Edge, внешние IP, SNAT и кластер Штурвал +# Как развернуть цепочку: vDC → Edge → внешние IP → SNAT → vApp → ВМ → Штурвал Пошаговая инструкция. Готовые файлы примера — в репозитории `tf_examples`, папка `fullpipe_chain`. @@ -8,11 +8,13 @@ - сетевой шлюз периметра (Edge) с балансировщиком AVI; - внешние IP на организации; - SNAT на шлюзе; +- виртуальный каталог (vApp) и виртуальная машина (ВМ) внутри него — с доступом по SSH; - Kubernetes-кластер Штурвал (сервис 150) на этой сети. **Организацию создайте заранее в ЛК** — Terraform её не создаёт и не удаляет. Кластер Штурвал создаётся десятки минут, поэтому провайдер ждёт его до часу -(`operation_timeout = "60m"`); остальные ресурсы — минуты. +(`operation_timeout = "60m"`); ВМ тоже создаётся небыстро (у неё отдельный таймаут `15m`), +остальные ресурсы — минуты. ## Что нужно перед началом @@ -22,12 +24,15 @@ | Токен API | доступ к ЛК | ЛК → Профиль → Токены → «Технический» | | Организация в Cloud Director | всё создаётся внутри неё | услуга «Организация в Cloud Director» | | Edge с балансировщиком AVI | без ALB кластер Штурвал не поднимется | `nsxt_need_enable_avi = true`, `nsxt_virtual_services_count >= 3` | -| Не меньше 3 внешних IP | адрес Kubernetes API, адрес Ingress и запас | `ip_count = "3"` | -| SNAT на Edge | выход в интернет для машин кластера | ресурс `nubes_vc_nsxt_snat` | +| Внешние IP: не меньше 3 + 1 под ВМ | адрес Kubernetes API, адрес Ingress, адрес ВМ и запас | `ip_count = "4"` | +| SNAT на Edge | выход в интернет для машин кластера и для ВМ | ресурс `nubes_vc_nsxt_snat` | +| Публичный SSH-ключ | вход на ВМ по SSH | `~/.ssh/id_ed25519.pub` → `vm_user_public_key` | +| Запас vCPU в vDC | Штурвал занимает 8 vCPU из 8 при настройках по умолчанию, и тогда ВМ не включится | `vdc_cpu_allocated` | Порядок из чек-листа услуги 150 (именно так связаны ресурсы в примере): -организация → vDC → Edge (ALB, AVI ≥ 3) → внешние IP (≥ 3) → SNAT → кластер Штурвал. -Минимум для кластера: 1 мастер-нода и 1 воркер-нода по 4 vCPU / 8 ГБ RAM / 50 ГБ диска. +организация → vDC → Edge (ALB, AVI ≥ 3) → внешние IP (≥ 3) → SNAT → **vApp → ВМ** → кластер Штурвал. +Минимум для кластера: 1 мастер-нода и 1 воркер-нода по 4 vCPU / 8 ГБ RAM / 50 ГБ диска; +минимум для ВМ: 1 vCPU / 1 ГБ RAM (в примере — 2 vCPU / 2 ГБ). ## 1. Скачайте пример @@ -67,7 +72,7 @@ organization = "organ" # Внешние IP ip_space_name = "internet-ipv4-v1" -ip_count = "3" +ip_count = "4" # 3 под Штурвал + 1 под ВМ # vDC vdc_resource_name = "fullpipe-vdc" # имя услуги в ЛК, любое @@ -86,6 +91,17 @@ nsxt_virtual_services_count = 3 # виртуальных серв nsxt_ip_addr_pool = "10.10.102.0/24" # пул адресов routed-сети, маска /24 nsxt_main_dns = "81.22.46.22" # основной DNS nsxt_second_dns = "185.247.187.77" # второй DNS + +# vApp и ВМ +vapp_name = "fullpipe-vapp-01" # имя vApp: маска ^[a-z0-9][a-z0-9.-]{3,61}[a-z0-9]$, уникально в организации +vm_name = "web01" # имя ВМ: задаёт имя IP Set {vapp_name}-{vm_name} +vm_image = "Ubuntu_22-20G" # RockyLinux_9-16G-cloudinit | Ubuntu_22-20G | Debian_13-20G +vm_cpu = 2 # vCPU, 1..64 +vm_ram = 2 # RAM, ГБ, 1..256 +vm_disk = 20 # дополнительный диск, ГБ +vm_user_login = "ubuntu" # учётка SSH +vm_user_public_key = "ssh-ed25519 AAAA..." # содержимое ~/.ssh/id_ed25519.pub +vm_same_snat = false # false — за общим SNAT шлюза ``` Описание всех параметров — в `variables.tf`. `terraform.tfvars` с токеном никому не передавайте @@ -95,7 +111,7 @@ nsxt_second_dns = "185.247.187.77" # второй DNS ```bash terraform init # один раз — скачает провайдер -terraform plan # покажет, что будет создано: 5 ресурсов +terraform plan # покажет, что будет создано: 7 ресурсов (vDC, Edge, IP, SNAT, vApp, ВМ, Штурвал) terraform apply # создаст (подтвердить: yes) ``` @@ -105,14 +121,73 @@ terraform apply # создаст (подтвердить: yes) terraform output # UUID и имена созданных услуг ``` -И в ЛК: появились vDC, Edge и кластер Штурвал, на организации выделены внешние IP, +И в ЛК: появились vDC, Edge, vApp с ВМ и кластер Штурвал, на организации выделены внешние IP, на шлюзе включён SNAT. Повторный `terraform plan` должен показать `No changes`. +Адрес ВМ виден в `terraform output vm_state_flat` — поля `externalConnect` (внешний IP), +`internalConnect` (адрес в routed-сети) и `fqdn`: `ssh @`. + Кластер создаётся десятки минут — провайдер ждёт его (`operation_timeout = "60m"`), в ЛК он появится со статусом `running`. Адреса Kubernetes API и Ingress — в `terraform output shturval_state_params` (поля `kubernetesApiAddress` и `ingressAddress`). -## 6. Удаление: «заморозка» вместо удаления +## 6. vApp и ВМ + +Виртуальная машина живёт **внутри vApp**: vApp привязывается к vDC (`vdc_uid`) и к Edge (`nsxt_uid`), +а ВМ — к vApp (`vapp_uid`) и получает адрес в routed-сети шлюза. Своей сети у vApp нет. + +| Ресурс | Услуга | Ключевые параметры | +|---|---|---| +| `nubes_vapp` | 26 | `vapp_name` (уникальное в организации, маска DNS-имени), `vdc_uid`, `nsxt_uid` | +| `nubes_vc_vm_v3` | 28 | `vapp_uid`, `vm_name`, `vm_cpu`, `vm_ram`, `vm_disk`, `image_vm`, `user_login`, `user_public_key`, `ip_space_name`, `access_port_list` | + +### Параметры ВМ + +| Параметр | Значения | +|---|---| +| `image_vm` | `RockyLinux_9-16G-cloudinit`, `Ubuntu_22-20G`, `Debian_13-20G` | +| `vm_cpu` / `vm_ram` | 1..64 шт. / 1..256 ГБ | +| `vm_disk` | дополнительный диск, ГБ (основной диск зависит от образа) | +| `user_login` | учётка SSH (по умолчанию `myuser`) | +| `access_port_list` | `[{ "port": "22", "type": "tcp" }]`; `type` — `tcp`, `udp` или `all` | +| `access_ip_list` | белый список адресов; по умолчанию `["0.0.0.0/0"]` | + +`image_vm`, `vm_name`, `user_login`, `user_public_key` и `vapp_uid` — **create-only** (менять нельзя). +`vm_cpu`, `vm_ram`, `vm_disk`, `access_port_list`, `ip_space_name` меняются операцией `modify`. + +### Внешний доступ + +| `ip_space_name` | Что это значит | +|---|---| +| `internet-ipv4-v1` | у ВМ есть внешний адрес: в `vm_state_flat` появятся `externalConnect` и `fqdn` | +| `no-needed` | внешнего адреса нет, доступ только изнутри | + +Адрес берётся из квоты организации, поэтому при внешнем доступе нужен **4-й адрес** (`ip_count = "4"`). +При `same_snat = false` (по умолчанию) ВМ публикуется за общим SNAT шлюза. + +Пример результата на живом стенде: + +``` +vm_state_flat = { + "externalConnect" = "185.247.187.235" + "internalConnect" = "10.10.102.4" + "fqdn" = "web01.85ea682f-...dev.nubes.ru" +} +``` + +### Что проверять при создании ВМ + +1. **Запас vCPU в vDC.** Штурвал при настройках по умолчанию занимает 8 vCPU из 8 (2 ноды × «TKG 4CPU 8RAM»). + Тогда ВМ не включится: платформа отдаёт `[400:VALIDATION] Unable to perform this action` на этапе + power-on, а инстанс остаётся в статусе `not created`. Лечится увеличением `vdc_cpu_allocated`. +2. **Квота IP.** `ip_count ≥ 4`, иначе внешний адрес для ВМ не выделится. +3. **Ключ.** Публичный ключ кладите в `terraform.tfvars`, не в репозиторий. +4. **Время.** ВМ создаётся и включается с customization (запись учётки и ключа) — на живом стенде + операция шла больше 15 минут. В примере стоит `operation_timeout = "15m"`; при медленной платформе + увеличьте его. Симптом таймаута — «операция … не завершилась за установленный таймаут». +5. **Проверка.** `ssh @` и `terraform plan` → `No changes`. + +## 7. Удаление: «заморозка» вместо удаления ```bash terraform destroy @@ -127,15 +202,18 @@ terraform destroy | Edge | не трогается: у эджа нет операции `suspend` | `keep_on_destroy = true` | | SNAT | не выключается | `keep_on_destroy = true` | | Квота внешних IP | не меняется: адреса держит кластер Штурвала | `keep_on_destroy = true` | +| vApp | `suspend`: выключаются все ВМ внутри каталога | `suspend_on_destroy = true` | +| ВМ | `suspend` | `suspend_on_destroy = true` | Приоритет флагов: `keep_on_destroy` важнее `suspend_on_destroy`. Следующий `apply` усыновит объекты по имени и разморозит кластер и vDC (`adopt_existing_on_create = true` → `resume`). **Организация не удаляется никогда.** Полное удаление — осознанно: поставьте `keep_on_destroy = false` и -`suspend_on_destroy = false` и удаляйте по порядку: кластер → квота IP (`count = 0`) → +`suspend_on_destroy = false` и удаляйте по порядку: кластер → ВМ → vApp → квота IP (`count = 0`) → SNAT → Edge → vDC. Квоту нельзя опустить ниже занятых адресов, поэтому — только -после удаления кластера; vDC удаляется лишь через 14 дней после `suspend`. +после удаления кластера и ВМ; vApp удаляется лишь после `suspend` (полное удаление — через 14 дней), +а vDC — через 14 дней после `suspend`. ## Файлы примера @@ -147,8 +225,9 @@ SNAT → Edge → vDC. Квоту нельзя опустить ниже зан | `vdc.tf` | виртуальный датацентр | | `edge.tf` | сетевой шлюз периметра (Edge) | | `modifiers.tf` | внешние IP на организации + SNAT на шлюзе | +| `vm.tf` | vApp и ВМ: переменные vApp/ВМ, оба ресурса и выводы (отключается удалением файла) | | `shturval.tf` | Kubernetes-кластер Штурвал: переменные Штурвала, группы воркеров и сам ресурс | -| `outputs.tf` | UUID и имена созданных услуг (vDC, Edge, Штурвал) | +| `outputs.tf` | UUID и имена созданных услуг (vDC, Edge, vApp, ВМ, Штурвал) | | `terraform.tfvars.example` | шаблон значений (копируется в `terraform.tfvars`) | Подробнее про два последних ресурса — на странице