From e7bdc46bde35f2a19aabf92e8525a4bc7825d0ab Mon Sep 17 00:00:00 2001 From: ayurishchev Date: Mon, 7 Sep 2026 08:56:26 +0300 Subject: [PATCH] Add deployment summary for the 3-router VK Cloud PROD build Records the confirmed-working state: router IPs/network layout, requirements-to-implementation mapping, and the real-deployment bugs fixed along the way, for future reference. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r --- docs/DEPLOYMENT_SUMMARY.md | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 docs/DEPLOYMENT_SUMMARY.md diff --git a/docs/DEPLOYMENT_SUMMARY.md b/docs/DEPLOYMENT_SUMMARY.md new file mode 100644 index 0000000..fdc1773 --- /dev/null +++ b/docs/DEPLOYMENT_SUMMARY.md @@ -0,0 +1,73 @@ +# Deployment Summary — VK Cloud PROD (3 роутера) + +Дата: 2026-09-07 · Статус: **развёрнуто и проверено пользователем** · Коммит: `8886c1b` + +## Что развёрнуто + +```mermaid +flowchart TB + INET(("Internet")) + + subgraph R1["router1 · 95.163.209.37"] + R1p1["priv1: 10.90.0.12"] + R1p2["priv2: 10.90.0.21"] + end + subgraph R2["router2 · 95.163.209.99"] + R2p1["priv1: 10.90.0.5"] + R2p2["priv2: 10.90.0.28"] + end + subgraph R3["router3 · 95.163.209.23"] + R3p1["priv1: 10.90.0.13"] + R3p2["priv2: 10.90.0.29"] + end + + INET --- R1 + INET --- R2 + INET --- R3 + + NET1[("priv1 network\n10.90.0.0/28")] + NET2[("priv2 network\n10.90.0.16/28")] + + R1p1 --- NET1 + R2p1 --- NET1 + R3p1 --- NET1 + R1p2 --- NET2 + R2p2 --- NET2 + R3p2 --- NET2 +``` + +| ВМ | Публичный IP (WAN) | priv1 (`10.90.0.0/28`) | priv2 (`10.90.0.16/28`) | +|---|---|---|---| +| router1 | 95.163.209.37 | 10.90.0.12 | 10.90.0.21 | +| router2 | 95.163.209.99 | 10.90.0.5 | 10.90.0.28 | +| router3 | 95.163.209.23 | 10.90.0.13 | 10.90.0.29 | + +Каждая ВМ — 3 сетевых интерфейса (1 внешний + 2 приватных), flavor `STD3-4-4`, keypair `mcs_ru`, образ Ubuntu 24.04. Приватные адреса назначены Neutron IPAM автоматически (без ручного вычисления — см. ниже, почему). + +`terraform apply`: **19 added, 0 changed, 0 destroyed.** + +## Задача и её реализация + +| Требование | Как реализовано | +|---|---| +| 3 роутера | `router_count = 3` в `terraform/terraform.tfvars` | +| 3 порта на роутер (1 внешний + 2 приватных) | 1 динамический внешний порт + `dynamic "network"` по числу `private_network_cidrs` | +| Каждый приватный порт — в своей подсети | `vkcs_networking_network`/`subnet` по `for_each` на каждый CIDR | +| Размер приватной подсети `/28` | `private_network_cidrs = ["10.90.0.0/28", "10.90.0.16/28"]` | +| Только роутеры (без демо-сегмента) | `priv_srv_01/02/03`, `lan_net`, `private_sg` удалены из `main.tf` | +| Только Terraform, без Ansible | Ansible-плейбук не запускался (осознанное решение, зафиксировано в памяти) | + +## Что пришлось исправить по пути (реальные баги, найдены при живом деплое) + +1. **`provider "vkcs"` отсутствовал вовсе** — `username`/`password`/`project_id`/`region` были объявлены, но ни к чему не подключены. Добавлен provider-блок + переменные `auth_url`, `user_domain_name`. +2. **SSH-keypair не существовал под сервисным аккаунтом** (Nova keypair'ы — per-user, не per-project). Добавлен `vkcs_compute_keypair`, регистрирующий ключ из `var.ssh_public_key`. +3. **Коллизия IP на приватных портах** — ручной расчёт `fixed_ip` конфликтовал со служебным портом VKCS (`network:dns`), автоматически создаваемым в каждой сети. Убрано ручное вычисление IP — адрес назначает Neutron IPAM (гарантированно без коллизий). +4. **`image_id` на верхнем уровне ресурса ВМ при boot-from-volume** — по документации провайдера так делать нельзя: Nova возвращает служебную строку вместо UUID образа, из-за чего Terraform считал это дрейфом и пересоздавал уже созданные ВМ при каждом plan. `image_id` оставлен только внутри `block_device`. +5. **`/29` оказался слишком тесным** — с учётом служебных портов платформы. Заменено на `/28`. + +Подробности каждого фикса — в `docs/changes/2026-09-06-provider-auth-wiring-*.md` и `docs/changes/2026-09-07-router-only-deployment-*.md`. + +## Верификация + +- `venv/bin/pytest terraform/tests -v` → 56 passed (офлайн, без обращения к облаку). +- Реальные `terraform init`/`plan`/`apply` против VK Cloud — успех, подтверждено пользователем вручную после развёртывания.