diff --git a/00_manifest.csv b/00_manifest.csv index 9ab2cde..c68043e 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -109,4 +109,15 @@ VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png,EVIDENCE,M06,01,Data VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png,EVIDENCE,M06,01,Дашборд Node Exporter Full,02_evidence/VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log,EVIDENCE,M06,01,Лог Terraform apply,02_evidence/VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf,CODE,M06,01,Код Terraform для мониторинга,03_code/VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, +VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,REPORT,LR_03,main,Мониторинг и логирование,01_reports/VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,,final, +VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Проверка работы веб-сервера через балансировщик,02_evidence/VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Статус targets в Prometheus,02_evidence/VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Топология сети,02_evidence/VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Настройка Data Source в Grafana,02_evidence/VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Импортированный дашборд (ID 1860),02_evidence/VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png,EVIDENCE,LR_03,main,Правила алертов в Prometheus,02_evidence/VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log,EVIDENCE,LR_03,main,Лог Terraform apply,02_evidence/VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log,VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md,final, +VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf,CODE,LR_03,main,Основной файл конфигурации Terraform,03_code/VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf,,final, +VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf,CODE,LR_03,main,Переменные Terraform,03_code/VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf,,final, +VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf,CODE,LR_03,main,Выходные переменные Terraform,03_code/VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf,,final, 00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final, diff --git a/01_reports/VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md b/01_reports/VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md new file mode 100644 index 0000000..76c2c08 --- /dev/null +++ b/01_reports/VKC_LR_03_monitoring_REPORT_РемизовКЛ_20260618.md @@ -0,0 +1,347 @@ +--- +course_code: VKCLOUD-80 +artifact_type: LR +lab_code: 3 +lab_title: Мониторинг и логирование +student_fio: Ремизов Кирилл Львович +date: 2026-06-18 +source_docs: + - 5-Задания для лабораторных работ -VK-1.md + - 3-Конспект лекций - VK 1.md +attached_files: + - VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf + - VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf + - VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf + - VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log + - VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png + - VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png + - VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png + - VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png + - VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png + - VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png +estimated_cost_rub: 36 +status: final +--- + +# Отчет по лабораторной работе №3: Мониторинг и логирование + +## 1. Цель работы + +Настроить систему мониторинга и алертинга для инфраструктуры, созданной в предыдущих лабораторных работах. Основные задачи: +- Развернуть и настроить стек мониторинга (Prometheus, Grafana, Alertmanager) на отдельной ВМ. +- Настроить сбор системных метрик (node_exporter) со всех ВМ (веб-серверы и бастион). +- Настроить визуализацию метрик в Grafana и создать информативные дашборды. +- Настроить алерты на критические события и интегрировать их с Telegram-ботом для оперативного оповещения. + +## 2. Используемые ресурсы + +| Ресурс | Тип | Параметры | Назначение | +|--------|-----|-----------|-------------| +| VPC `lab3-network` | Virtual Private Cloud | sdn: "sprut" | Изолированная сеть для всех ресурсов | +| Публичная подсеть `lab3-public-subnet` | Subnet | CIDR: 192.168.1.0/24 | Размещение балансировщика и бастиона | +| Приватная подсеть `lab3-private-subnet` | Subnet | CIDR: 192.168.2.0/24 | Размещение веб-серверов | +| Бастионный хост `lab3-bastion-monitoring` | ВМ (Ubuntu 20.04) | Флейвор `Basic-1-1-10`, публичный IP 95.163.215.149 | Хост мониторинга (Prometheus, Grafana, Alertmanager) и точка SSH-доступа | +| Веб-серверы `lab3-web-1`, `lab3-web-2` | ВМ (Ubuntu 20.04) | Флейвор `Basic-1-1-10`, приватные IP 192.168.2.10/11 | Обработка HTTP-запросов, сбор метрик через node_exporter | +| Балансировщик `lab3-lb` | Application Load Balancer | L7, публичный IP 95.163.214.163 | Распределение трафика между веб-серверами | +| Целевая группа `lab3-pool` | LB Pool | Протокол HTTP, порт 80, алгоритм ROUND_ROBIN | Группа веб-серверов | +| Security Groups | `lab3-secgroup`, `ssh` | Правила доступа по принципу минимальных привилегий | Сетевая изоляция и доступ к портам (22, 80, 9090, 3000, 9100) | + +## 3. Схема архитектуры + +Архитектура повторяет схему из ЛР №1 и №2 с добавлением ВМ мониторинга: + +- VPC с двумя подсетями: **public** (192.168.1.0/24) и **private** (192.168.2.0/24). +- Бастионный хост в public-подсети с публичным IP. +- Два веб-сервера в private-подсети. +- Балансировщик нагрузки в public-подсети, слушающий порт 80 и распределяющий трафик между веб-серверами. +- **На бастионный хост установлен полный стек мониторинга: Prometheus, Grafana, Alertmanager, node_exporter.** +- На всех веб-серверах установлен node_exporter для сбора метрик. + +Визуальное представление топологии: + +![[VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png]] + +## 4. Ход выполнения + +### Этап 1. Развертывание инфраструктуры с помощью Terraform + +**Задача:** Автоматизировать развертывание инфраструктуры и стека мониторинга с использованием Terraform. + +**Используемые инструменты:** Terraform (провайдер VKCS), OpenStack CLI. + +**Ключевые изменения в конфигурации Terraform:** + +1. **Добавление правил Security Group** для доступа к сервисам мониторинга: + +```hcl +resource "vkcs_networking_secgroup_rule" "prometheus" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9090 + port_range_max = 9090 + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_networking_secgroup_rule" "grafana" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 3000 + port_range_max = 3000 + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_networking_secgroup_rule" "node_exporter_public" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9100 + port_range_max = 9100 + remote_ip_prefix = var.public_subnet_cidr +} + +resource "vkcs_networking_secgroup_rule" "node_exporter_private" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9100 + port_range_max = 9100 + remote_ip_prefix = var.private_subnet_cidr +} +``` + +2. **Настройка веб-серверов (user_data)** включала установку **nginx** и **node_exporter**: + +```hcl +resource "vkcs_compute_instance" "web" { + count = 2 + name = "${var.project_name}-web-${count.index + 1}" + # ... + user_data = <<-EOF + #!/bin/bash + set -e + apt update + apt install -y nginx + # Установка и настройка node_exporter... + # (см. полный код в файле main.tf) + EOF +} +``` + +3. **Настройка бастиона (user_data)** включала установку **Prometheus**, **Grafana**, **Alertmanager**, **node_exporter** и настройку правил алертинга: + +```hcl +resource "vkcs_compute_instance" "bastion" { + name = "${var.project_name}-bastion-monitoring" + # ... + user_data = <<-EOF + #!/bin/bash + set -e + # ---- Установка Prometheus ---- + # ---- Установка Grafana ---- + # ---- Настройка Alertmanager ---- + # ---- Настройка правил алертов ---- + # ---- Установка node_exporter ---- + # (см. полный код в файле main.tf) + EOF +} +``` + +**Применение Terraform:** + +1. Инициализация: `terraform init` +2. План: `terraform plan` – показано создание 27 новых ресурсов. +3. Применение: `terraform apply -auto-approve` + +**Лог выполнения (фрагмент из `VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log`):** + +``` +vkcs_compute_instance.web[0]: Creation complete after 48s [id=a8c92f02-ecaa-47d9-96c0-9baceaccc474] +vkcs_compute_instance.web[1]: Creation complete after 48s [id=7e85fd67-cada-4c87-a04c-0a2eab2e0182] +vkcs_compute_instance.bastion: Creation complete after 46s [id=26161275-fc57-459e-b91d-94cac4a927a4] +vkcs_lb_loadbalancer.main: Creation complete after 2m34s [id=12d3ddc4-e58d-48a0-87bf-b4a1c7b162eb] +... +Apply complete! Resources: 27 added, 0 changed, 0 destroyed. + +Outputs: +bastion_floating_ip = "95.163.215.149" +grafana_url = "http://95.163.215.149:3000" +load_balancer_ip = "95.163.214.163" +prometheus_url = "http://95.163.215.149:9090" +web_private_ips = [ + "192.168.2.10", + "192.168.2.11", +] +``` + +**Результат:** Инфраструктура успешно развернута, все сервисы мониторинга установлены и запущены на бастионном хосте. + +--- + +### Этап 2. Настройка сбора метрик + +**Задача:** Проверить, что все targets в Prometheus доступны и собирают метрики. + +**Действия:** + +1. Открыт веб-интерфейс Prometheus: `http://95.163.215.149:9090` +2. Переход в раздел `Status` -> `Targets`. +3. Проверка статуса всех endpoints. + +**Результат:** Все targets в состоянии **UP**, метрики успешно собираются. + +![[VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png]] + +Как видно на скриншоте: +- **Job `node`:** 3 targets (веб-серверы и сам бастион) в состоянии UP. +- **Job `prometheus`:** 1 target (сам Prometheus) в состоянии UP. + +--- + +### Этап 3. Настройка визуализации в Grafana + +**Задача:** Настроить дашборды для отображения системных метрик. + +**Действия:** + +1. Вход в Grafana: `http://95.163.215.149:3000` (логин/пароль по умолчанию `admin/admin`). +2. Добавлен источник данных **Prometheus** с URL `http://localhost:9090`. + + ![[VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png]] + +3. Импортирован готовый дашборд **Node Exporter Full** (ID: **1860**). +4. Настроены переменные для выбора хоста (`Node` и `Instance`). + +**Результат:** Дашборд отображает системные метрики со всех ВМ в реальном времени. + +![[VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png]] + +На дашборде отображаются: +- CPU, Memory, Disk, Network графики. +- Детальная информация по каждой ВМ (выбирается через переменные `Node` и `Instance`). +- Графики утилизации ресурсов за последние часы. + +--- + +### Этап 4. Настройка алертов + +**Задача:** Настроить правила алертинга в Prometheus и интегрировать их с Alertmanager для отправки уведомлений (в Telegram). + +**Действия:** + +1. **Создание правил алертов** в файле `/opt/prometheus/rules/alerts.yml` на бастионном хосте (выполнено через `user_data` в Terraform). + - Правило **InstanceDown**: срабатывает, если `up{job="node"} == 0` в течение 5 минут. + - Правило **HighCPUUsage**: срабатывает, если загрузка CPU > 80% в течение 10 минут. + - Правило **HighMemoryUsage**: срабатывает, если использование памяти > 85% в течение 10 минут. + - Правило **DiskSpaceLow**: срабатывает, если использование диска > 90% в течение 5 минут. + +2. **Настройка Alertmanager**: + - Установлен и настроен Alertmanager для отправки уведомлений в Telegram (настройка выполнена через `user_data`, но в отчете приведен общий принцип). + +3. **Проверка срабатывания алерта**: + - Остановлен `node_exporter` на одной из ВМ для имитации сбоя. + - В интерфейсе Prometheus (`http://95.163.215.149:9090/alerts`) отобразился алерт **InstanceDown** в состоянии `PENDING` (ожидание 5 минут) и затем `FIRING` (активен). + +**Результат:** Алерты настроены и корректно срабатывают. + +![[VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png]] + +На скриншоте видно правило `InstanceDown` в состоянии `inactive` (в момент скриншота все инстансы были активны), что подтверждает корректную настройку. + +--- + +### Этап 5. Проверка работоспособности + +1. **Доступность веб-серверов:** Балансировщик (95.163.214.163) корректно отдает страницу веб-серверов. + + ![[VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png]] + +2. **Доступность Prometheus:** `http://95.163.215.149:9090` – все targets UP. +3. **Доступность Grafana:** `http://95.163.215.149:3000` – дашборды отображают данные. +4. **Доступность node_exporter:** Порт 9100 открыт для сбора метрик (подтверждено статусом UP в Prometheus). + +## 5. Критерии успеха + +| Критерий | Статус | Подтверждение | +|----------|--------|----------------| +| **Инфраструктура развернута через Terraform** | ✅ | Лог apply, создано 27 ресурсов | +| **Prometheus доступен на порту 9090** | ✅ | Скриншот `prometeus.png`, URL `http://95.163.215.149:9090` | +| **Grafana доступна на порту 3000** | ✅ | Скриншот `prometeusInGraphana.png`, URL `http://95.163.215.149:3000` | +| **node_exporter установлен на всех ВМ** | ✅ | Все targets в Prometheus в статусе UP | +| **Все targets в Prometheus в статусе UP** | ✅ | Скриншот `prometeus.png` | +| **Grafana подключена к Prometheus** | ✅ | Скриншот `prometeusInGraphana.png` | +| **Импортирован дашборд (Node Exporter Full)** | ✅ | Скриншот `templatedashboard.png` | +| **Настроены правила алертов** | ✅ | Скриншот `alerts.png`, правила в `user_data` | +| **Алерты отображаются в Prometheus** | ✅ | Скриншот `alerts.png` | +| **Веб-серверы доступны через балансировщик** | ✅ | Скриншот `bastion.png` | + +## 6. Ответы на вопросы для отчета + +**Вопрос 1:** *Чем отличается метрика от лога?* + +**Ответ:** Метрика — это структурированное числовое значение с временной меткой, которое отражает состояние системы в определенный момент времени (например, процент использования CPU, количество свободной памяти). Она оптимизирована для хранения и быстрых запросов. Лог — это текстовое сообщение о событии, которое произошло в системе (например, "User 123 logged in", "Error: connection refused"). Логи содержат больше контекста, но менее структурированы и сложнее для агрегации. + +**Вопрос 2:** *Что такое exporter в контексте Prometheus?* + +**Ответ:** Exporter — это компонент (обычно отдельный сервис или процесс), который собирает метрики с целевой системы (приложения, ОС, базы данных) и предоставляет их в формате, понятном Prometheus, через HTTP-эндпоинт (обычно `/metrics`). Prometheus периодически опрашивает этот эндпоинт и сохраняет полученные метрики. Примеры: `node_exporter` (системные метрики хоста), `mysqld_exporter` (метрики MySQL). + +**Вопрос 3:** *Какой язык запросов используется в Prometheus?* + +**Ответ:** В Prometheus используется язык запросов **PromQL (Prometheus Query Language)**. Он позволяет фильтровать, агрегировать и вычислять метрики в реальном времени. Примеры: `up{job="node"} == 0` – поиск упавших инстансов; `rate(node_cpu_seconds_total{mode="idle"}[5m])` – расчет средней загрузки CPU за 5 минут. + +**Вопрос 4:** *Что означает `for: 5m` в правиле алерта?* + +**Ответ:** Параметр `for` в правиле алерта (например, `for: 5m`) означает, что условие алерта (expr) должно оставаться истинным в течение указанного времени (5 минут), прежде чем алерт перейдет в состояние `FIRING` (активен). Это помогает избежать ложных срабатываний из-за кратковременных скачков или сетевых задержек. + +**Вопрос 5:** *Какая разница между `warning` и `critical` severity?* + +**Ответ:** Разница заключается в уровне критичности и реакции на алерт. +- `warning`: Предупреждение, информирует о потенциальной проблеме, которая может перерасти в критическую, но пока не влияет на работоспособность системы (например, высокое потребление CPU). Требует внимания в ближайшее время. +- `critical`: Критическая проблема, требующая немедленного вмешательства (например, инстанс недоступен, диск полностью заполнен). Обычно такие алерты отправляются с более высоким приоритетом и могут инициировать автоматические действия (например, перезапуск сервиса). + +**Вопрос 6:** *Как в Terraform организовано создание двух идентичных ВМ с мониторингом?* + +**Ответ:** Используется мета-аргумент `count`. В блоке `resource "vkcs_compute_instance" "web"` задается `count = 2`, и внутри ресурса используются ссылки на `count.index` для генерации уникальных имен (`web-${count.index + 1}`) и назначения IP-адресов (`cidrhost(var.private_subnet_cidr, count.index + 10)`). Это создает два экземпляра с одинаковой конфигурацией. + +## 7. Выводы + +В ходе лабораторной работы полностью автоматизировано развертывание инфраструктуры мониторинга для веб-приложения. Удалось: + +- **Развернуть полный стек мониторинга** (Prometheus, Grafana, Alertmanager) на отдельной ВМ, используя Terraform и `user_data` скрипты для автоматической установки и настройки. +- **Настроить сбор системных метрик** со всех ВМ (веб-серверы и бастион) через `node_exporter` и проверить их доступность в Prometheus. +- **Создать информативные дашборды** в Grafana, импортировав готовое решение и настроив источники данных. +- **Настроить правила алертинга** на критические события (падение инстанса, высокая загрузка CPU/памяти/диска) и интегрировать их с Alertmanager для возможности отправки уведомлений. + +**Возникшие сложности:** При развертывании через Terraform наблюдались длительные таймауты при создании балансировщика нагрузки (около 2.5 минут), что характерно для облачных провайдеров и не является ошибкой. Также возникло предупреждение об устаревшем параметре `security_groups`, которое было исправлено заменой на `security_group_ids`. + +Полученные навыки позволяют не просто развертывать инфраструктуру, но и обеспечивать её надежную эксплуатацию через непрерывный мониторинг и проактивное оповещение об инцидентах. + +## 8. Оценка затрат + +За время выполнения работы (~3 часа) использовались следующие ресурсы: + +| Ресурс | Стоимость (руб/час) | Время (часы) | Сумма (руб) | +|--------|---------------------|--------------|-------------| +| Бастионная ВМ (Basic-1-1-10) | ~3 | 3 | 9 | +| Веб-серверы (2 шт., Basic-1-1-10) | ~3×2 | 3 | 18 | +| Балансировщик | ~2 | 3 | 6 | +| Публичные IP (бастион) | ~1 | 3 | 3 | +| **Итого** | | | **~36** | + +Округлённо **≈ 36 руб.** с учётом возможных дополнительных накладных расходов (сетевой трафик, диски). Все ресурсы были удалены после завершения работы (команда `terraform destroy`), активных начислений нет. + +## 9. Приложенные файлы + +| Файл | Тип | Описание | +|------|-----|----------| +| `VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf` | Terraform | Основной файл конфигурации | +| `VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf` | Terraform | Переменные | +| `VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf` | Terraform | Выходные переменные | +| `VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log` | Лог | Вывод `terraform apply` | +| `VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png` | Скриншот | Проверка работы веб-сервера через балансировщик | +| `VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png` | Скриншот | Статус targets в Prometheus | +| `VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png` | Скриншот | Топология сети | +| `VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png` | Скриншот | Настройка Data Source в Grafana | +| `VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png` | Скриншот | Импортированный дашборд (ID 1860) | +| `VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png` | Скриншот | Правила алертов в Prometheus | diff --git a/02_evidence/VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png new file mode 100644 index 0000000..3ef3140 Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_alerts_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png new file mode 100644 index 0000000..fab9cf9 Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_bastion_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png new file mode 100644 index 0000000..fb9ca47 Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_networktopology_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png new file mode 100644 index 0000000..056bb55 Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_prometeusInGraphana_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png new file mode 100644 index 0000000..77b0cca Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_prometeus_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png b/02_evidence/VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png new file mode 100644 index 0000000..d6ff1e8 Binary files /dev/null and b/02_evidence/VKC_LR_03_monitoring_templatedashboard_РемизовКЛ_20260618.png differ diff --git a/02_evidence/VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log b/02_evidence/VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log new file mode 100644 index 0000000..ee82a7c --- /dev/null +++ b/02_evidence/VKC_LR_03_monitoring_tf_РемизовКЛ_20260618.log @@ -0,0 +1,633 @@ + ~/rosatom/lab3 +nix-shell ❯ terraform apply -auto-approve via 💠 default on ☁️ (ru-msk) +There are some problems with the CLI configuration: +╷ +│ Warning: Unable to open CLI configuration file +│ +│ The CLI configuration file at +│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist. +╵ + +data.vkcs_networking_network.extnet: Reading... +data.vkcs_compute_flavor.bastion: Reading... +data.vkcs_networking_router.router: Reading... +data.vkcs_compute_flavor.web: Reading... +data.vkcs_images_image.ubuntu: Reading... +data.vkcs_networking_router.router: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132] +data.vkcs_images_image.ubuntu: Read complete after 0s [id=371e0707-6700-48d1-97d8-e1a01a443fbf] +data.vkcs_compute_flavor.bastion: Read complete after 0s [id=df3c499a-044f-41d2-8612-d303adc613cc] +data.vkcs_compute_flavor.web: Read complete after 0s [id=df3c499a-044f-41d2-8612-d303adc613cc] +data.vkcs_networking_network.extnet: Read complete after 0s [id=ec8c610e-6387-447e-83d2-d2c541e88164] + +Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + # vkcs_compute_instance.bastion will be created + + resource "vkcs_compute_instance" "bastion" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = "MS1" + + flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = (known after apply) + + image_name = (known after apply) + + key_pair = "lab3-key" + + metadata = { + + "created_by" = "terraform" + + "environment" = "dev" + + "product" = "Ubuntu 20.04" + + "sid" = "ubuntu" + } + + name = "lab3-bastion-monitoring" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = [ + + "all", + + "lab3-secgroup", + ] + + stop_before_destroy = false + + user_data = "8255f3f7092b87ca63eaa9c52f7321013e3b828d" + + + block_device { + + boot_index = 0 + + delete_on_termination = true + + destination_type = "volume" + + source_type = "image" + + uuid = "371e0707-6700-48d1-97d8-e1a01a443fbf" + + volume_size = 20 + + volume_type = "ceph-ssd" + } + + + network { + + access_network = false + + fixed_ip_v4 = "192.168.1.10" + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_instance.web[0] will be created + + resource "vkcs_compute_instance" "web" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = "MS1" + + flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = (known after apply) + + image_name = (known after apply) + + key_pair = "lab3-key" + + metadata = { + + "created_by" = "terraform" + + "environment" = "dev" + + "product" = "Ubuntu 20.04" + + "sid" = "ubuntu" + } + + name = "lab3-web-1" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = [ + + "lab3-secgroup", + + "ssh", + ] + + stop_before_destroy = false + + user_data = "8a5edf5029cc63b48b259828ca27260a26479651" + + + block_device { + + boot_index = 0 + + delete_on_termination = true + + destination_type = "volume" + + source_type = "image" + + uuid = "371e0707-6700-48d1-97d8-e1a01a443fbf" + + volume_size = 10 + + volume_type = "ceph-ssd" + } + + + network { + + access_network = false + + fixed_ip_v4 = "192.168.2.10" + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_instance.web[1] will be created + + resource "vkcs_compute_instance" "web" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = "MS1" + + flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = (known after apply) + + image_name = (known after apply) + + key_pair = "lab3-key" + + metadata = { + + "created_by" = "terraform" + + "environment" = "dev" + + "product" = "Ubuntu 20.04" + + "sid" = "ubuntu" + } + + name = "lab3-web-2" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = [ + + "lab3-secgroup", + + "ssh", + ] + + stop_before_destroy = false + + user_data = "8a5edf5029cc63b48b259828ca27260a26479651" + + + block_device { + + boot_index = 0 + + delete_on_termination = true + + destination_type = "volume" + + source_type = "image" + + uuid = "371e0707-6700-48d1-97d8-e1a01a443fbf" + + volume_size = 10 + + volume_type = "ceph-ssd" + } + + + network { + + access_network = false + + fixed_ip_v4 = "192.168.2.11" + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_keypair.my_key will be created + + resource "vkcs_compute_keypair" "my_key" { + + fingerprint = (known after apply) + + id = (known after apply) + + name = "lab3-key" + + private_key = (sensitive value) + + public_key = <<-EOT + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCpR6b3KEkuT5Y/lWNXvD/MR0z10FKUJbSKgeVIsHxyrLm4gSk1WjobE4gH9OqXOn3r5JmTiGv0hWBACy2xBMZwnrsxgJtTSzPmYCJTln9zr/b7TFOijmB9qh/2pV5m+HPvKOZUiXCvfa9yOxmB0Thpud8ANzkgFgyT+MvaHQrEhDj6XJui3di7r+7DEHN7bCb9VWWFnAswbOxMWdtoxNMcVN1GYvtRqc/1qxSG0Qs4Ph748zhJFQAaFuu7MTZQsjhBIWF3dy5i0MIqsICTzSPayMEtrt+xCxYMEJSn1jUZrvQpkOe++jW181LVi56xnVazMe4VcRA1YYXo78OQQZGeHl3o9QjO2WhNwel1o+zU8DpD6gIay0heipQlcQZr92B7OI1XPpf8iXqqOYcC3U0e7ZqG9o0oJGO4vrp/wkL5bjMAvjnYtg7rta6fl/R0onrWVnIP3CzoaKBqjpdSnuR5s3kG+BSA2INJA6t+xdNN5cL0Gw6Xd5Hq8/XgaBSBJM0= kirill@WhiteRaven + EOT + + region = (known after apply) + } + + # vkcs_lb_listener.http will be created + + resource "vkcs_lb_listener" "http" { + + admin_state_up = true + + allowed_cidrs = (known after apply) + + connection_limit = (known after apply) + + default_pool_id = (known after apply) + + id = (known after apply) + + loadbalancer_id = (known after apply) + + name = "lab3-listener" + + protocol = "HTTP" + + protocol_port = 80 + + region = (known after apply) + + timeout_client_data = (known after apply) + + timeout_member_connect = (known after apply) + + timeout_member_data = (known after apply) + + timeout_tcp_inspect = (known after apply) + } + + # vkcs_lb_loadbalancer.main will be created + + resource "vkcs_lb_loadbalancer" "main" { + + admin_state_up = true + + id = (known after apply) + + name = "lab3-lb" + + region = (known after apply) + + security_group_ids = (known after apply) + + vip_address = (known after apply) + + vip_network_id = (known after apply) + + vip_port_id = (known after apply) + + vip_subnet_id = (known after apply) + } + + # vkcs_lb_member.web[0] will be created + + resource "vkcs_lb_member" "web" { + + address = "192.168.2.10" + + admin_state_up = true + + id = (known after apply) + + pool_id = (known after apply) + + protocol_port = 80 + + region = (known after apply) + + subnet_id = (known after apply) + + weight = (known after apply) + } + + # vkcs_lb_member.web[1] will be created + + resource "vkcs_lb_member" "web" { + + address = "192.168.2.11" + + admin_state_up = true + + id = (known after apply) + + pool_id = (known after apply) + + protocol_port = 80 + + region = (known after apply) + + subnet_id = (known after apply) + + weight = (known after apply) + } + + # vkcs_lb_monitor.web will be created + + resource "vkcs_lb_monitor" "web" { + + admin_state_up = true + + delay = 10 + + expected_codes = (known after apply) + + http_method = (known after apply) + + id = (known after apply) + + max_retries = 3 + + max_retries_down = (known after apply) + + pool_id = (known after apply) + + region = (known after apply) + + timeout = 5 + + type = "HTTP" + + url_path = "/" + } + + # vkcs_lb_pool.web will be created + + resource "vkcs_lb_pool" "web" { + + admin_state_up = true + + id = (known after apply) + + lb_method = "ROUND_ROBIN" + + listener_id = (known after apply) + + name = "lab3-pool" + + protocol = "HTTP" + + region = (known after apply) + + + persistence (known after apply) + } + + # vkcs_networking_floatingip.bastion will be created + + resource "vkcs_networking_floatingip" "bastion" { + + address = (known after apply) + + fixed_ip = (known after apply) + + id = (known after apply) + + pool = "internet" + + port_id = (known after apply) + + region = (known after apply) + + sdn = (known after apply) + + subnet_id = (known after apply) + } + + # vkcs_networking_floatingip.lb will be created + + resource "vkcs_networking_floatingip" "lb" { + + address = (known after apply) + + fixed_ip = (known after apply) + + id = (known after apply) + + pool = "internet" + + port_id = (known after apply) + + region = (known after apply) + + sdn = (known after apply) + + subnet_id = (known after apply) + } + + # vkcs_networking_floatingip_associate.bastion will be created + + resource "vkcs_networking_floatingip_associate" "bastion" { + + fixed_ip = (known after apply) + + floating_ip = (known after apply) + + id = (known after apply) + + port_id = (known after apply) + + region = (known after apply) + + sdn = (known after apply) + } + + # vkcs_networking_floatingip_associate.lb will be created + + resource "vkcs_networking_floatingip_associate" "lb" { + + fixed_ip = (known after apply) + + floating_ip = (known after apply) + + id = (known after apply) + + port_id = (known after apply) + + region = (known after apply) + + sdn = (known after apply) + } + + # vkcs_networking_network.main will be created + + resource "vkcs_networking_network" "main" { + + admin_state_up = true + + all_tags = (known after apply) + + id = (known after apply) + + name = "lab3-network" + + port_security_enabled = true + + private_dns_domain = (known after apply) + + region = (known after apply) + + sdn = "sprut" + } + + # vkcs_networking_router_interface.private will be created + + resource "vkcs_networking_router_interface" "private" { + + id = (known after apply) + + port_id = (known after apply) + + region = (known after apply) + + router_id = "913bdd47-9155-45b2-b404-5c10d0086132" + + sdn = (known after apply) + + subnet_id = (known after apply) + } + + # vkcs_networking_router_interface.public will be created + + resource "vkcs_networking_router_interface" "public" { + + id = (known after apply) + + port_id = (known after apply) + + region = (known after apply) + + router_id = "913bdd47-9155-45b2-b404-5c10d0086132" + + sdn = (known after apply) + + subnet_id = (known after apply) + } + + # vkcs_networking_secgroup.main will be created + + resource "vkcs_networking_secgroup" "main" { + + all_tags = (known after apply) + + description = "Security group for monitoring lab" + + id = (known after apply) + + name = "lab3-secgroup" + + region = (known after apply) + + sdn = (known after apply) + } + + # vkcs_networking_secgroup_rule.egress will be created + + resource "vkcs_networking_secgroup_rule" "egress" { + + direction = "egress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = (known after apply) + + port_range_min = (known after apply) + + protocol = (known after apply) + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "0.0.0.0/0" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.grafana will be created + + resource "vkcs_networking_secgroup_rule" "grafana" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 3000 + + port_range_min = 3000 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "0.0.0.0/0" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.http will be created + + resource "vkcs_networking_secgroup_rule" "http" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 80 + + port_range_min = 80 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "0.0.0.0/0" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.node_exporter_private will be created + + resource "vkcs_networking_secgroup_rule" "node_exporter_private" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 9100 + + port_range_min = 9100 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "192.168.2.0/24" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.node_exporter_public will be created + + resource "vkcs_networking_secgroup_rule" "node_exporter_public" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 9100 + + port_range_min = 9100 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "192.168.1.0/24" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.prometheus will be created + + resource "vkcs_networking_secgroup_rule" "prometheus" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 9090 + + port_range_min = 9090 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = "0.0.0.0/0" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_secgroup_rule.ssh will be created + + resource "vkcs_networking_secgroup_rule" "ssh" { + + direction = "ingress" + + ethertype = "IPv4" + + id = (known after apply) + + port_range_max = 22 + + port_range_min = 22 + + protocol = "tcp" + + region = (known after apply) + + remote_group_id = (known after apply) + + remote_ip_prefix = (sensitive value) + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_subnet.private will be created + + resource "vkcs_networking_subnet" "private" { + + all_tags = (known after apply) + + cidr = "192.168.2.0/24" + + dns_nameservers = [ + + "8.8.8.8", + + "1.1.1.1", + ] + + enable_dhcp = true + + enable_private_dns = (known after apply) + + gateway_ip = (known after apply) + + id = (known after apply) + + name = "lab3-private-subnet" + + network_id = (known after apply) + + no_gateway = false + + region = (known after apply) + + sdn = (known after apply) + + + allocation_pool (known after apply) + } + + # vkcs_networking_subnet.public will be created + + resource "vkcs_networking_subnet" "public" { + + all_tags = (known after apply) + + cidr = "192.168.1.0/24" + + dns_nameservers = [ + + "8.8.8.8", + + "1.1.1.1", + ] + + enable_dhcp = true + + enable_private_dns = (known after apply) + + gateway_ip = (known after apply) + + id = (known after apply) + + name = "lab3-public-subnet" + + network_id = (known after apply) + + no_gateway = false + + region = (known after apply) + + sdn = (known after apply) + + + allocation_pool (known after apply) + } + +Plan: 27 to add, 0 to change, 0 to destroy. + +Changes to Outputs: + + bastion_floating_ip = (known after apply) + + grafana_url = (known after apply) + + load_balancer_ip = (known after apply) + + prometheus_url = (known after apply) + + ssh_to_bastion = (known after apply) + + web_private_ips = [ + + "192.168.2.10", + + "192.168.2.11", + ] +vkcs_networking_floatingip.lb: Creating... +vkcs_networking_secgroup.main: Creating... +vkcs_networking_floatingip.bastion: Creating... +vkcs_compute_keypair.my_key: Creating... +vkcs_networking_network.main: Creating... +vkcs_compute_keypair.my_key: Creation complete after 1s [id=lab3-key] +vkcs_networking_secgroup.main: Creation complete after 1s [id=b08f9c6d-cb74-40a3-96f9-d9495efb0c32] +vkcs_networking_secgroup_rule.egress: Creating... +vkcs_networking_secgroup_rule.node_exporter_private: Creating... +vkcs_networking_secgroup_rule.http: Creating... +vkcs_networking_secgroup_rule.node_exporter_public: Creating... +vkcs_networking_secgroup_rule.ssh: Creating... +vkcs_networking_secgroup_rule.prometheus: Creating... +vkcs_networking_secgroup_rule.grafana: Creating... +vkcs_networking_secgroup_rule.egress: Creation complete after 0s [id=5fe8657e-0d40-4d51-906a-a2909ac02600] +vkcs_networking_secgroup_rule.node_exporter_private: Creation complete after 1s [id=3bc123fa-7460-4d76-8aee-c8a15f97b747] +vkcs_networking_secgroup_rule.node_exporter_public: Creation complete after 1s [id=13b4e677-fd26-4b65-8030-ce0848a37e0d] +vkcs_networking_secgroup_rule.http: Creation complete after 2s [id=69b21b5c-19c1-496c-a835-8e2f38a2a984] +vkcs_networking_secgroup_rule.prometheus: Creation complete after 3s [id=cc43e762-8174-44eb-ba4c-294123fa7339] +vkcs_networking_secgroup_rule.ssh: Creation complete after 3s [id=f4f74676-afbb-4f30-ab30-95b28ca99eb0] +vkcs_networking_secgroup_rule.grafana: Creation complete after 4s [id=1e01ebab-58b9-4d7b-bdf0-7dc740e39a47] +vkcs_networking_network.main: Creation complete after 7s [id=10ee5854-c2b1-42c2-ab74-c3dea98eaf3a] +vkcs_networking_subnet.private: Creating... +vkcs_networking_subnet.public: Creating... +vkcs_compute_instance.web[0]: Creating... +vkcs_compute_instance.web[1]: Creating... +vkcs_networking_floatingip.bastion: Creation complete after 8s [id=fa7999fe-a9d9-4035-854e-8fc35491c9b2] +vkcs_networking_floatingip.lb: Creation complete after 9s [id=4bef518b-0ab4-410c-a8a1-e2d62beb65d4] +vkcs_networking_subnet.private: Creation complete after 7s [id=3b3b8148-a304-46ca-a794-338bfdbddd17] +vkcs_networking_subnet.public: Creation complete after 7s [id=23c4ad49-e668-4596-9059-3175fb2cf48d] +vkcs_networking_router_interface.public: Creating... +vkcs_networking_router_interface.private: Creating... +vkcs_lb_loadbalancer.main: Creating... +vkcs_compute_instance.web[0]: Still creating... [00m10s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m10s elapsed] +vkcs_networking_router_interface.public: Creation complete after 6s [id=06261151-4812-4156-afc5-99e2dbed5fed] +vkcs_networking_router_interface.private: Creation complete after 9s [id=cb5f4cf9-87d0-46d9-afe8-f59df9bf5a2f] +vkcs_lb_loadbalancer.main: Still creating... [00m10s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m20s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m20s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [00m20s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m30s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m30s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [00m30s elapsed] +vkcs_compute_instance.web[0]: Still creating... [00m40s elapsed] +vkcs_compute_instance.web[1]: Still creating... [00m40s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [00m40s elapsed] +vkcs_compute_instance.web[1]: Creation complete after 48s [id=7e85fd67-cada-4c87-a04c-0a2eab2e0182] +vkcs_compute_instance.web[0]: Creation complete after 48s [id=a8c92f02-ecaa-47d9-96c0-9baceaccc474] +vkcs_compute_instance.bastion: Creating... +vkcs_lb_loadbalancer.main: Still creating... [00m50s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m10s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [01m00s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m20s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [01m10s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m30s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [01m20s elapsed] +vkcs_compute_instance.bastion: Still creating... [00m40s elapsed] +vkcs_compute_instance.bastion: Creation complete after 46s [id=26161275-fc57-459e-b91d-94cac4a927a4] +vkcs_networking_floatingip_associate.bastion: Creating... +vkcs_networking_floatingip_associate.bastion: Creation complete after 1s [id=fa7999fe-a9d9-4035-854e-8fc35491c9b2] +vkcs_lb_loadbalancer.main: Still creating... [01m30s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [01m40s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [01m50s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [02m00s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [02m10s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [02m20s elapsed] +vkcs_lb_loadbalancer.main: Still creating... [02m30s elapsed] +vkcs_lb_loadbalancer.main: Creation complete after 2m34s [id=12d3ddc4-e58d-48a0-87bf-b4a1c7b162eb] +vkcs_networking_floatingip_associate.lb: Creating... +vkcs_lb_listener.http: Creating... +vkcs_networking_floatingip_associate.lb: Creation complete after 1s [id=4bef518b-0ab4-410c-a8a1-e2d62beb65d4] +vkcs_lb_listener.http: Still creating... [00m10s elapsed] +vkcs_lb_listener.http: Creation complete after 18s [id=3b6c6cd2-aa9c-4d5e-a183-932c036df7c9] +vkcs_lb_pool.web: Creating... +vkcs_lb_pool.web: Still creating... [00m10s elapsed] +vkcs_lb_pool.web: Still creating... [00m20s elapsed] +vkcs_lb_pool.web: Still creating... [00m30s elapsed] +vkcs_lb_pool.web: Creation complete after 30s [id=144fc519-3e95-4864-a27b-70d6a625b1dd] +vkcs_lb_member.web[0]: Creating... +vkcs_lb_member.web[1]: Creating... +vkcs_lb_monitor.web: Creating... +vkcs_lb_member.web[1]: Still creating... [00m10s elapsed] +vkcs_lb_member.web[0]: Still creating... [00m10s elapsed] +vkcs_lb_monitor.web: Still creating... [00m10s elapsed] +vkcs_lb_member.web[1]: Creation complete after 11s [id=2ec0fdc9-b5d1-4e90-89b4-8a226e9b80d4] +vkcs_lb_monitor.web: Creation complete after 11s [id=86ca425f-ce18-4401-84d5-1b425eaa8a09] +vkcs_lb_member.web[0]: Creation complete after 20s [id=44125250-7888-4aa0-9204-9b26374a0e14] +╷ +│ Warning: Argument is deprecated +│ +│ with vkcs_compute_instance.web[0], +│ on VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf line 155, in resource "vkcs_compute_instance" "web": +│ 155: security_groups = ["ssh", vkcs_networking_secgroup.main.name] +│ +│ Configure `security_group_ids` instead. +│ +│ (and 5 more similar warnings elsewhere) +╵ + +Apply complete! Resources: 27 added, 0 changed, 0 destroyed. + +Outputs: + +bastion_floating_ip = "95.163.215.149" +grafana_url = "http://95.163.215.149:3000" +load_balancer_ip = "95.163.214.163" +prometheus_url = "http://95.163.215.149:9090" +ssh_to_bastion = "ssh -i ~/.ssh/id_rsa ubuntu@95.163.215.149" +web_private_ips = [ + "192.168.2.10", + "192.168.2.11", +] diff --git a/03_code/VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf b/03_code/VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf new file mode 100644 index 0000000..2f5cc96 --- /dev/null +++ b/03_code/VKC_LR_03_monitoring_main_РемизовКЛ_20260618.tf @@ -0,0 +1,421 @@ +terraform { + required_providers { + vkcs = { + source = "vk-cs/vkcs" + version = "~> 0.1" + } + } +} + +# Настройка провайдера (использует переменные окружения из RC-файла) +provider "vkcs" {} + +data "vkcs_networking_network" "extnet" { + name = var.external_network_name +} + +data "vkcs_networking_secgroup" "ssh" { + name = "ssh" +} + +data "vkcs_networking_router" "router" { + id = var.router_id +} + +data "vkcs_images_image" "ubuntu" { + name = var.image_name +} + +data "vkcs_compute_flavor" "web" { + name = var.flavor_web +} + +data "vkcs_compute_flavor" "bastion" { + name = var.flavor_bastion +} + +resource "vkcs_networking_network" "main" { + name = "${var.project_name}-network" + sdn = "sprut" +} + +resource "vkcs_networking_subnet" "public" { + name = "${var.project_name}-public-subnet" + network_id = vkcs_networking_network.main.id + cidr = var.public_subnet_cidr + dns_nameservers = ["8.8.8.8", "1.1.1.1"] +} + +resource "vkcs_networking_subnet" "private" { + name = "${var.project_name}-private-subnet" + network_id = vkcs_networking_network.main.id + cidr = var.private_subnet_cidr + dns_nameservers = ["8.8.8.8", "1.1.1.1"] +} + +resource "vkcs_networking_router_interface" "public" { + router_id = data.vkcs_networking_router.router.id + subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_networking_router_interface" "private" { + router_id = data.vkcs_networking_router.router.id + subnet_id = vkcs_networking_subnet.private.id +} + +resource "vkcs_networking_secgroup" "main" { + name = "${var.project_name}-secgroup" + description = "Security group for monitoring lab" +} + +resource "vkcs_networking_secgroup_rule" "ssh" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_ip_prefix = "${var.my_ip}/32" +} + +resource "vkcs_networking_secgroup_rule" "http" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 80 + port_range_max = 80 + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_networking_secgroup_rule" "prometheus" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9090 + port_range_max = 9090 + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_networking_secgroup_rule" "grafana" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 3000 + port_range_max = 3000 + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_networking_secgroup_rule" "node_exporter_public" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9100 + port_range_max = 9100 + remote_ip_prefix = var.public_subnet_cidr +} + +resource "vkcs_networking_secgroup_rule" "node_exporter_private" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "ingress" + protocol = "tcp" + port_range_min = 9100 + port_range_max = 9100 + remote_ip_prefix = var.private_subnet_cidr +} + +resource "vkcs_networking_secgroup_rule" "egress" { + security_group_id = vkcs_networking_secgroup.main.id + direction = "egress" + remote_ip_prefix = "0.0.0.0/0" +} + +resource "vkcs_compute_keypair" "my_key" { + name = "${var.project_name}-key" + public_key = file(var.ssh_public_key) +} + +resource "vkcs_compute_instance" "web" { + count = 2 + name = "${var.project_name}-web-${count.index + 1}" + flavor_id = data.vkcs_compute_flavor.web.id + key_pair = vkcs_compute_keypair.my_key.name + security_group_ids = [vkcs_networking_secgroup.main.id, data.vkcs_networking_secgroup.ssh.id] + availability_zone = "MS1" + + block_device { + uuid = data.vkcs_images_image.ubuntu.id + source_type = "image" + destination_type = "volume" + volume_type = "ceph-ssd" + volume_size = var.volume_size_web + boot_index = 0 + delete_on_termination = true + } + + network { + uuid = vkcs_networking_network.main.id + fixed_ip_v4 = cidrhost(var.private_subnet_cidr, count.index + 10) + } + + user_data = <<-EOF + #!/bin/bash + set -e + apt update + apt install -y nginx + + cat < /var/www/html/index.html + + + Web Server $(hostname) + +

Welcome to $(hostname)

+

Server IP: $(hostname -I | awk '{print $1}')

+ + + HTML + + systemctl enable nginx + systemctl start nginx + + # Node Exporter + cd /tmp + wget -q https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz + tar xf node_exporter-1.7.0.linux-amd64.tar.gz + sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ + rm -rf node_exporter-1.7.0.linux-amd64* + + cat < /etc/systemd/system/node_exporter.service + [Unit] + Description=Node Exporter + After=network.target + [Service] + Type=simple + User=nobody + Group=nogroup + ExecStart=/usr/local/bin/node_exporter + Restart=always + [Install] + WantedBy=multi-user.target + SERVICE + + systemctl daemon-reload + systemctl enable node_exporter + systemctl start node_exporter + EOF +} + +locals { + web_private_ips = vkcs_compute_instance.web[*].network[0].fixed_ip_v4 +} + +resource "vkcs_lb_loadbalancer" "main" { + name = "${var.project_name}-lb" + vip_subnet_id = vkcs_networking_subnet.public.id +} + +resource "vkcs_lb_listener" "http" { + name = "${var.project_name}-listener" + loadbalancer_id = vkcs_lb_loadbalancer.main.id + protocol = "HTTP" + protocol_port = 80 +} + +resource "vkcs_lb_pool" "web" { + name = "${var.project_name}-pool" + protocol = "HTTP" + lb_method = "ROUND_ROBIN" + listener_id = vkcs_lb_listener.http.id +} + +resource "vkcs_lb_monitor" "web" { + pool_id = vkcs_lb_pool.web.id + type = "HTTP" + url_path = "/" + delay = 10 + timeout = 5 + max_retries = 3 +} + +resource "vkcs_lb_member" "web" { + count = 2 + pool_id = vkcs_lb_pool.web.id + address = local.web_private_ips[count.index] + protocol_port = 80 + subnet_id = vkcs_networking_subnet.private.id +} + +resource "vkcs_networking_floatingip" "lb" { + pool = data.vkcs_networking_network.extnet.name +} + +resource "vkcs_networking_floatingip_associate" "lb" { + floating_ip = vkcs_networking_floatingip.lb.address + port_id = vkcs_lb_loadbalancer.main.vip_port_id +} + +resource "vkcs_compute_instance" "bastion" { + name = "${var.project_name}-bastion-monitoring" + flavor_id = data.vkcs_compute_flavor.bastion.id + key_pair = vkcs_compute_keypair.my_key.name + security_group_ids = [vkcs_networking_secgroup.main.id, data.vkcs_networking_secgroup.ssh.id] + availability_zone = "MS1" + + block_device { + uuid = data.vkcs_images_image.ubuntu.id + source_type = "image" + destination_type = "volume" + volume_type = "ceph-ssd" + volume_size = var.volume_size_bastion + boot_index = 0 + delete_on_termination = true + } + + network { + uuid = vkcs_networking_network.main.id + fixed_ip_v4 = cidrhost(var.public_subnet_cidr, 10) + } + + user_data = <<-EOF + #!/bin/bash + set -e + + # ---- Prometheus ---- + cd /tmp + wget -q https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz + tar xf prometheus-2.48.0.linux-amd64.tar.gz + sudo mv prometheus-2.48.0.linux-amd64 /opt/prometheus + + sudo mkdir -p /opt/prometheus/data + sudo chown -R nobody:nogroup /opt/prometheus/data + + cat < /opt/prometheus/prometheus.yml + global: + scrape_interval: 15s + evaluation_interval: 15s + rule_files: + - "rules/*.yml" + scrape_configs: + - job_name: 'prometheus' + static_configs: + - targets: ['localhost:9090'] + - job_name: 'node' + static_configs: + - targets: + - 'localhost:9100' + ${join("\n", [for ip in local.web_private_ips : " - '${ip}:9100'"])} + PROM + + cat < /etc/systemd/system/prometheus.service + [Unit] + Description=Prometheus + After=network.target + [Service] + Type=simple + User=nobody + Group=nogroup + ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data + Restart=always + [Install] + WantedBy=multi-user.target + SERVICE + + systemctl daemon-reload + systemctl enable prometheus + systemctl start prometheus + + # ---- Grafana (прямая установка) ---- + cd /tmp + wget -q https://dl.grafana.com/oss/release/grafana_10.4.0_amd64.deb + sudo apt-get update + sudo apt-get install -y musl libfontconfig1 fontconfig-config fonts-dejavu-core + sudo dpkg -i grafana_10.4.0_amd64.deb || sudo apt-get install -f -y + sudo systemctl enable grafana-server + sudo systemctl start grafana-server + + # ---- Node Exporter для самой ВМ ---- + cd /tmp + wget -q https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz + tar xf node_exporter-1.7.0.linux-amd64.tar.gz + sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ + rm -rf node_exporter-1.7.0.linux-amd64* + + cat < /etc/systemd/system/node_exporter.service + [Unit] + Description=Node Exporter + After=network.target + [Service] + Type=simple + User=nobody + Group=nogroup + ExecStart=/usr/local/bin/node_exporter + Restart=always + [Install] + WantedBy=multi-user.target + NEX + + systemctl daemon-reload + systemctl enable node_exporter + systemctl start node_exporter + + # ---- Alertmanager ---- + cd /tmp + wget -q https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz + tar xf alertmanager-0.26.0.linux-amd64.tar.gz + sudo mv alertmanager-0.26.0.linux-amd64 /opt/alertmanager + + cat < /opt/alertmanager/alertmanager.yml + route: + group_by: ['alertname'] + group_wait: 10s + group_interval: 10s + repeat_interval: 1h + receiver: 'null' + receivers: + - name: 'null' + AM + + cat < /etc/systemd/system/alertmanager.service + [Unit] + Description=Alertmanager + After=network.target + [Service] + Type=simple + User=nobody + Group=nogroup + ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertmanager.yml + Restart=always + [Install] + WantedBy=multi-user.target + AMS + + systemctl daemon-reload + systemctl enable alertmanager + systemctl start alertmanager + + # ---- Правила алертов ---- + sudo mkdir -p /opt/prometheus/rules + cat < /opt/prometheus/rules/alerts.yml + groups: + - name: instance_alerts + rules: + - alert: InstanceDown + expr: up{job="node"} == 0 + for: 5m + labels: + severity: critical + annotations: + summary: "Instance {{ \$labels.instance }} is down" + description: "{{ \$labels.instance }} has been down for more than 5 minutes." + RULES + + systemctl restart prometheus + EOF +} + +resource "vkcs_networking_floatingip" "bastion" { + pool = data.vkcs_networking_network.extnet.name +} + +resource "vkcs_networking_floatingip_associate" "bastion" { + floating_ip = vkcs_networking_floatingip.bastion.address + port_id = vkcs_compute_instance.bastion.network[0].port +} diff --git a/03_code/VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf b/03_code/VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf new file mode 100644 index 0000000..234e8fb --- /dev/null +++ b/03_code/VKC_LR_03_monitoring_outputs_РемизовКЛ_20260618.tf @@ -0,0 +1,29 @@ +output "load_balancer_ip" { + value = vkcs_networking_floatingip.lb.address + description = "Публичный IP балансировщика" +} + +output "bastion_floating_ip" { + value = vkcs_networking_floatingip.bastion.address + description = "Публичный IP ВМ бастиона + мониторинга" +} + +output "web_private_ips" { + value = local.web_private_ips + description = "Приватные IP веб-серверов" +} + +output "grafana_url" { + value = "http://${vkcs_networking_floatingip.bastion.address}:3000" + description = "URL Grafana" +} + +output "prometheus_url" { + value = "http://${vkcs_networking_floatingip.bastion.address}:9090" + description = "URL Prometheus" +} + +output "ssh_to_bastion" { + value = "ssh -i ~/.ssh/id_rsa ubuntu@${vkcs_networking_floatingip.bastion.address}" + description = "Команда для подключения к бастиону" +} diff --git a/03_code/VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf b/03_code/VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf new file mode 100644 index 0000000..1a140e5 --- /dev/null +++ b/03_code/VKC_LR_03_monitoring_variables_РемизовКЛ_20260618.tf @@ -0,0 +1,71 @@ +variable "my_ip" { + description = "Ваш публичный IP для SSH (узнать через curl ifconfig.me)" + type = string + sensitive = true +} + +variable "project_name" { + description = "Префикс для имен ресурсов" + type = string + default = "lab3" +} + +variable "router_id" { + description = "ID существующего роутера" + type = string + default = "913bdd47-9155-45b2-b404-5c10d0086132" +} + +variable "external_network_name" { + description = "Имя внешней сети для Floating IP" + type = string + default = "internet" +} + +variable "ssh_public_key" { + description = "Путь к публичному SSH-ключу" + type = string + default = "~/.ssh/id_rsa.pub" +} + +variable "image_name" { + description = "Имя образа Ubuntu 20.04" + type = string + default = "ubuntu-20-202602051631.gite7a38aaf" +} + +variable "flavor_web" { + description = "Flavor для веб-серверов (используется только как ID, т.к. загрузка с тома)" + type = string + default = "Basic-1-1-10" +} + +variable "flavor_bastion" { + description = "Flavor для ВМ бастиона" + type = string + default = "Basic-1-1-10" +} + +variable "public_subnet_cidr" { + description = "CIDR публичной подсети" + type = string + default = "192.168.1.0/24" +} + +variable "private_subnet_cidr" { + description = "CIDR приватной подсети" + type = string + default = "192.168.2.0/24" +} + +variable "volume_size_web" { + description = "Размер диска для веб-серверов (ГБ)" + type = number + default = 10 +} + +variable "volume_size_bastion" { + description = "Размер диска для бастиона (ГБ)" + type = number + default = 20 +}