diff --git a/00_manifest.csv b/00_manifest.csv index 7cbd0f4..9ab2cde 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -102,4 +102,11 @@ VKC_LR_02_tf_packer_packer-config_РемизовКЛ_20260516.pkr.hcl,CODE,LR_02 VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform провайдер,03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf,,final, VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform Security Groups,03_code/VKC_LR_02_tf_packer_security_РемизовКЛ_20260617.tf,,final, VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,CODE,LR_02,main,Terraform переменные,03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf,,final, +VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,PR,M06,01,Настройка мониторинга (Prometheus + Grafana),01_reports/VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,,final, +VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png,EVIDENCE,M06,01,Список созданных ВМ,02_evidence/VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, +VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png,EVIDENCE,M06,01,Цели Prometheus (UP),02_evidence/VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, +VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png,EVIDENCE,M06,01,Data Source Prometheus в Grafana,02_evidence/VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png,VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md,final, +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, 00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final, diff --git a/01_reports/VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md b/01_reports/VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md new file mode 100644 index 0000000..4544e27 --- /dev/null +++ b/01_reports/VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md @@ -0,0 +1,182 @@ +--- +course_code: VKCLOUD-80 +artifact_type: PR +module: 6 +task_code: 1 +task_title: Настройка мониторинга (Prometheus + Grafana) +student_fio: Ремизов Кирилл Львович +date: 2026-06-17 +source_docs: + - 3-Конспект лекций - VK 1.md + - 4-Практические работы - VK -1.md +commands_used: + - terraform init + - terraform plan + - terraform apply -auto-approve + - openstack server list + - curl http://localhost:9090 + - curl http://localhost:3000 +attached_files: + - VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log + - VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf + - VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png + - VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png + - VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png + - VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png +status: final +--- +# Отчёт по практической демонстрации + +## 1. Цель + +Освоить настройку мониторинга виртуальных машин в облаке VK Cloud с использованием стека **Prometheus + Grafana**. Научиться: + +- разворачивать инфраструктуру для мониторинга с помощью **Terraform**; +- устанавливать и настраивать **Node Exporter** на целевых ВМ для сбора системных метрик; +- развёртывать **Prometheus** как центральный сервер сбора метрик; +- устанавливать и настраивать **Grafana** для визуализации метрик; +- подключать **Grafana** к **Prometheus** в качестве источника данных; +- импортировать готовый дашборд и убедиться в его работоспособности. + +## 2. Что было прочитано перед выполнением + +- **Документ:** 3-Конспект лекций - VK 1.md +- **Раздел/тема:** Модуль 6 «Мониторинг, логирование и Observability», тема 6.1 «Стек мониторинга (Prometheus, Grafana)» +- **Ключевые понятия:** + - **Prometheus** — система сбора метрик с временными рядами, использующая подход pull (активный опрос экспортеров). + - **Node Exporter** — агент, собирающий метрики хоста (CPU, RAM, Disk, Network) и предоставляющий их Prometheus через HTTP endpoint на порту 9100. + - **Grafana** — платформа для визуализации данных, подключаемая к Prometheus как к источнику данных. + - **PromQL** — язык запросов к метрикам Prometheus. + - **Targets** — цели, с которых Prometheus собирает метрики (в данном случае — Node Exporter на каждой ВМ). + +- **Дополнительно:** Документ 4-Практические работы - VK -1.md, демонстрация 6.1 «Настройка Prometheus и Grafana». + +## 3. Ход выполнения + +### Демонстрация 6.1: Настройка Prometheus и Grafana + +#### Этап 0. Подготовка окружения + +- Убедился, что Terraform установлен и настроен для работы с VK Cloud. +- Создал директорию для проекта и подготовил файл `main.tf` с конфигурацией инфраструктуры. + +#### Этап 1. Развертывание инфраструктуры с помощью Terraform + +В файле `VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf` описаны следующие ресурсы: + +1. **Провайдер VKCS** — для взаимодействия с VK Cloud через OpenStack API. +2. **Переменные** — внешняя сеть (`internet`), ID роутера, образ (`ubuntu-20-202602051631.gite7a38aaf`), flavour (`Basic-1-2-20`), зона доступности (`MS1`). +3. **Data-источники** — для получения идентификаторов внешней сети, роутера, образа и flavour. +4. **Внутренняя сеть** (`monitoring-internal-net`) с подсетью `192.168.200.0/24` и подключением к существующему роутеру для выхода в интернет. +5. **Security Group** (`monitoring-sg`) с правилами для SSH (22), Grafana (3000), Prometheus (9090), Node Exporter (9100) — доступ разрешён с `0.0.0.0/0` (для демонстрации). +6. **SSH-ключ** — `monitoring-key`, создаётся из публичного ключа `~/.ssh/id_rsa.pub`. +7. **App-ВМ** (`app-vm-1`) — одна ВМ, на которую через `user_data` устанавливается **Node Exporter**. +8. **Monitoring-ВМ** (`monitoring-vm`) — ВМ, на которую через `user_data` устанавливаются: + - **Node Exporter** (для сбора метрик самой мониторинговой ВМ), + - **Prometheus** (сервер сбора метрик, порт 9090), + - **Grafana** (сервер визуализации, порт 3000). +9. **Floating IP** — публичный IP для мониторинговой ВМ, который ассоциируется с ней. + +**Выполнение Terraform:** + +```bash +terraform apply -auto-approve +``` + +План показал создание 13 ресурсов (сеть, подсеть, интерфейс роутера, security group, правила, ключ, две ВМ, floating IP, ассоциация). Применение прошло успешно, все ресурсы созданы за ~2 минуты. + +**Результат:** +- `monitoring-vm` получила публичный IP: `95.163.215.1` (floating IP) +- `app-vm-1` получила внутренний IP: `192.168.200.9` (доступ к ней осуществляется через мониторинговую ВМ или напрямую по публичному IP невозможен) +- URL Prometheus: `http://95.163.215.1:9090` +- URL Grafana: `http://95.163.215.1:3000` +- Пароль для SSH (задан в `user_data`): `debian` (логин: `ubuntu`) + +#### Этап 2. Настройка Prometheus + +На мониторинговой ВМ был установлен Prometheus. В файле конфигурации `/opt/prometheus/prometheus.yml` необходимо было добавить цели (targets) для сбора метрик: + +```yaml +scrape_configs: + - job_name: 'node' + static_configs: + - targets: + - '192.168.200.9:9100' # app-vm-1 (внутренний IP) + - '95.163.215.1:9100' # monitoring-vm (публичный IP, т.к. node_exporter установлен и на ней) +``` + +После перезапуска Prometheus цели стали доступны для опроса. В веб-интерфейсе Prometheus (порт 9090) в разделе **Targets** обе цели отображаются в статусе **UP**. + +#### Этап 3. Настройка Grafana + +- Grafana установлена и запущена на порту 3000. +- Первый вход выполнен с учётными данными по умолчанию: `admin` / `admin` (пароль был изменён при первом входе). +- Добавлен **Data Source** типа **Prometheus** с URL `http://localhost:9090` (так как Grafana и Prometheus находятся на одной ВМ). Data source помечен как **default**. + +#### Этап 4. Импорт дашборда + +В Grafana был импортирован готовый дашборд **Node Exporter Full** (ID: `1860`). Этот дашборд предоставляет комплексную визуализацию метрик, собираемых Node Exporter: загрузка CPU, использование памяти, сетевой трафик, состояние дисков и многое другое. + +На дашборде можно выбрать конкретный экземпляр (instance) для отображения метрик — в данном случае доступны оба: `192.168.200.9:9100` (app-vm-1) и `95.163.215.1:9100` (monitoring-vm). + +#### Этап 5. Проверка работоспособности + +- В разделе **Targets** Prometheus отображаются обе цели в статусе **UP** (скриншот приложен). +- Дашборд Grafana отображает актуальные метрики с обеих ВМ. На скриншоте видно: + - CPU: 0.1% + - RAM Used: 15.8% + - Uptime: 10.5 минут + - Графики CPU Basic, Memory Basic, Network Traffic Basic, Disk Space Used Basic — все отображают данные. + +## 4. Ошибки и исправления + +| Проблема | Решение | +| :--- | :--- | +| **Предупреждения Terraform:** `ethertype = "IPv4"` deprecated | В секции `vkcs_networking_secgroup_rule` аргумент `ethertype` помечен как устаревший. Рекомендуется не указывать его, так как по умолчанию используется IPv4. На функциональность не влияет. | +| **Отсутствие внешнего доступа к app-ВМ:** app-ВМ находится во внутренней сети без публичного IP | Использован floating IP только для мониторинговой ВМ. Для доступа к app-ВМ используется внутренний IP, что безопаснее. При необходимости можно было бы добавить бастионный хост. | + +## 5. Критерии успеха + +- [x] **Инфраструктура развёрнута с помощью Terraform** — две ВМ созданы и активны (скриншот списка ВМ). +- [x] **Node Exporter установлен на всех ВМ** — цели Prometheus доступны и отвечают на порту 9100. +- [x] **Prometheus настроен и запущен** — веб-интерфейс доступен на порту 9090, цели отображаются в статусе UP. +- [x] **Grafana установлена и запущена** — веб-интерфейс доступен на порту 3000. +- [x] **Data Source Prometheus добавлен в Grafana** — помечен как default. +- [x] **Дашборд импортирован и отображает данные** — на скриншоте видны графики и метрики. + +## 6. Приложенные доказательства + +| Файл | Тип | Что подтверждает | +| ---------------------------------------------------------------------------- | ------------- | ----------------------------------------------------- | +| `VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log` | Текстовый лог | Полный вывод `terraform apply` со списком созданных ресурсов | +| `VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf` | Конфигурация | Исходный код Terraform с описанием инфраструктуры | +| `VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png` | Скриншот | Список созданных ВМ с IP-адресами | +| `VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png` | Скриншот | Цели Prometheus в статусе UP | +| `VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png` | Скриншот | Data Source Prometheus в Grafana | +| `VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png` | Скриншот | Дашборд Node Exporter Full с отображаемыми метриками | + +## 7. Самопроверка + +- **Что получилось:** + Успешно развернул инфраструктуру для мониторинга с использованием Terraform, автоматически установил Node Exporter, Prometheus и Grafana через `user_data`. Настроил Prometheus на сбор метрик с обеих ВМ, импортировал дашборд в Grafana и убедился, что все метрики отображаются корректно. Использование отдельной внутренней сети и floating IP для мониторинговой ВМ обеспечивает дополнительную безопасность. + +- **Что осталось непонятным:** + - Почему в конфигурации Prometheus пришлось указывать публичный IP для мониторинговой ВМ (хотя можно было использовать localhost). Это связано с тем, что node_exporter на мониторинговой ВМ слушает на всех интерфейсах, но для единообразия я указал публичный IP. + - Как более элегантно автоматизировать добавление целей в Prometheus (например, через Consul или file_sd). + - Как настроить алертинг в Alertmanager. + +- **Что можно улучшить:** + - Добавить автоматическое обновление конфигурации Prometheus при добавлении новых ВМ через Terraform (использовать `templatefile` для генерации `prometheus.yml`). + - Настроить аутентификацию и TLS для Grafana и Prometheus. + - Ограничить доступ к портам 3000, 9090, 9100 с помощью Security Groups, разрешив только с доверенных IP (в учебных целях оставлено `0.0.0.0/0`). + +## 8. Краткий вывод + +Практическая работа продемонстрировала полный цикл настройки мониторинга для облачной инфраструктуры с использованием **Terraform**, **Prometheus** и **Grafana**. Благодаря декларативному описанию инфраструктуры удалось за несколько минут развернуть изолированную сеть, две ВМ и все необходимые компоненты мониторинга. + +Ключевые преимущества, подтверждённые на практике: +- **Автоматизация** — весь процесс воспроизводим и версионируется. +- **Масштабируемость** — легко добавить новые ВМ, обновив список целей в Prometheus. +- **Наглядность** — готовый дашборд позволяет быстро оценить состояние системы и выявить проблемы. + +Полученный стек мониторинга готов к использованию в реальных проектах с минимальными доработками (настройка алертинга, ограничение доступа, интеграция с системой уведомлений). diff --git a/02_evidence/VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png b/02_evidence/VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png new file mode 100644 index 0000000..8c85206 Binary files /dev/null and b/02_evidence/VKC_PR_M06_01_monitoring_DS_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png b/02_evidence/VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png new file mode 100644 index 0000000..54644a0 Binary files /dev/null and b/02_evidence/VKC_PR_M06_01_monitoring_Prometeus_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png b/02_evidence/VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png new file mode 100644 index 0000000..5d06b9b Binary files /dev/null and b/02_evidence/VKC_PR_M06_01_monitoring_VM_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png b/02_evidence/VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png new file mode 100644 index 0000000..8d6dc72 Binary files /dev/null and b/02_evidence/VKC_PR_M06_01_monitoring_dashboard_РемизовКЛ_20260617.png differ diff --git a/02_evidence/VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log b/02_evidence/VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log new file mode 100644 index 0000000..8af8090 --- /dev/null +++ b/02_evidence/VKC_PR_M06_01_monitoring_tf_РемизовКЛ_20260617.log @@ -0,0 +1,319 @@ + ~/rosatom/terraform6-1 +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_compute_flavor.vm: Reading... +data.vkcs_networking_router.router: Reading... +data.vkcs_networking_network.extnet: Reading... +data.vkcs_images_image.ubuntu: Reading... +data.vkcs_images_image.ubuntu: Read complete after 0s [id=371e0707-6700-48d1-97d8-e1a01a443fbf] +data.vkcs_networking_router.router: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132] +data.vkcs_compute_flavor.vm: Read complete after 0s [id=25ae869c-be29-4840-8e12-99e046d2dbd4] +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_floatingip_associate.monitoring_fip_assoc will be created + + resource "vkcs_compute_floatingip_associate" "monitoring_fip_assoc" { + + floating_ip = (known after apply) + + id = (known after apply) + + instance_id = (known after apply) + + region = (known after apply) + } + + # vkcs_compute_instance.app[0] will be created + + resource "vkcs_compute_instance" "app" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = "MS1" + + flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = (known after apply) + + image_name = (known after apply) + + key_pair = "monitoring-key" + + name = "app-vm-1" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = [ + + "monitoring-sg", + ] + + stop_before_destroy = false + + user_data = "f355816eb1f6204d3318b3db355d4625d045ab6f" + + + 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 = (known after apply) + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_instance.monitoring will be created + + resource "vkcs_compute_instance" "monitoring" { + + access_ip_v4 = (known after apply) + + all_metadata = (known after apply) + + all_tags = (known after apply) + + availability_zone = "MS1" + + flavor_id = "25ae869c-be29-4840-8e12-99e046d2dbd4" + + flavor_name = (known after apply) + + force_delete = false + + id = (known after apply) + + image_id = (known after apply) + + image_name = (known after apply) + + key_pair = "monitoring-key" + + name = "monitoring-vm" + + password_data = (known after apply) + + power_state = "active" + + region = (known after apply) + + security_group_ids = (known after apply) + + security_groups = [ + + "monitoring-sg", + ] + + stop_before_destroy = false + + user_data = "9ecd690e01cac29a10c58e9563c4ea99a7f8cf15" + + + 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 = (known after apply) + + mac = (known after apply) + + name = (known after apply) + + port = (known after apply) + + uuid = (known after apply) + } + } + + # vkcs_compute_keypair.monitoring will be created + + resource "vkcs_compute_keypair" "monitoring" { + + fingerprint = (known after apply) + + id = (known after apply) + + name = "monitoring-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_networking_floatingip.monitoring_fip will be created + + resource "vkcs_networking_floatingip" "monitoring_fip" { + + 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_network.internal will be created + + resource "vkcs_networking_network" "internal" { + + admin_state_up = true + + all_tags = (known after apply) + + id = (known after apply) + + name = "monitoring-internal-net" + + port_security_enabled = true + + private_dns_domain = (known after apply) + + region = (known after apply) + + sdn = "sprut" + } + + # vkcs_networking_router_interface.router_interface will be created + + resource "vkcs_networking_router_interface" "router_interface" { + + 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.monitoring_sg will be created + + resource "vkcs_networking_secgroup" "monitoring_sg" { + + all_tags = (known after apply) + + description = "Allow SSH, Prometheus, Grafana, Node Exporter" + + id = (known after apply) + + name = "monitoring-sg" + + region = (known after apply) + + sdn = (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.node_exporter will be created + + resource "vkcs_networking_secgroup_rule" "node_exporter" { + + 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 = "0.0.0.0/0" + + 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 = "0.0.0.0/0" + + sdn = (known after apply) + + security_group_id = (known after apply) + } + + # vkcs_networking_subnet.internal will be created + + resource "vkcs_networking_subnet" "internal" { + + all_tags = (known after apply) + + cidr = "192.168.200.0/24" + + enable_dhcp = true + + enable_private_dns = (known after apply) + + gateway_ip = (known after apply) + + id = (known after apply) + + name = "monitoring-internal-subnet" + + network_id = (known after apply) + + no_gateway = false + + region = (known after apply) + + sdn = (known after apply) + + + allocation_pool (known after apply) + } + +Plan: 13 to add, 0 to change, 0 to destroy. + +Changes to Outputs: + + app_ips = [ + + (known after apply), + ] + + grafana_url = (known after apply) + + monitoring_ip = (known after apply) + + prometheus_url = (known after apply) + + ssh_password = "debian" +vkcs_networking_secgroup.monitoring_sg: Creating... +vkcs_networking_floatingip.monitoring_fip: Creating... +vkcs_networking_network.internal: Creating... +vkcs_compute_keypair.monitoring: Creating... +vkcs_compute_keypair.monitoring: Creation complete after 0s [id=monitoring-key] +vkcs_networking_secgroup.monitoring_sg: Creation complete after 1s [id=8aa4eb80-45e1-4f0d-a54b-f3e0f52f853f] +vkcs_networking_secgroup_rule.node_exporter: Creating... +vkcs_networking_secgroup_rule.ssh: Creating... +vkcs_networking_secgroup_rule.prometheus: Creating... +vkcs_networking_secgroup_rule.grafana: Creating... +vkcs_networking_secgroup_rule.ssh: Creation complete after 0s [id=fb2538b5-fc65-4743-a37e-be5789b1742d] +vkcs_networking_secgroup_rule.prometheus: Creation complete after 0s [id=b8cc74ab-a015-4615-8975-0bfd338f8213] +vkcs_networking_secgroup_rule.grafana: Creation complete after 1s [id=576f3bc7-b4d2-4158-b012-ca38b7561894] +vkcs_networking_secgroup_rule.node_exporter: Creation complete after 1s [id=5dcf4a9e-c04a-4724-915a-3a29318c3f5a] +vkcs_networking_network.internal: Creation complete after 5s [id=93dd466e-b667-4acf-8ecd-47a6e21c955b] +vkcs_networking_subnet.internal: Creating... +vkcs_compute_instance.app[0]: Creating... +vkcs_networking_floatingip.monitoring_fip: Creation complete after 8s [id=7acab770-0e85-4f18-b1f3-513be0b11874] +vkcs_networking_subnet.internal: Creation complete after 6s [id=8d7531bf-4b90-4759-b6c9-cc030061b9be] +vkcs_networking_router_interface.router_interface: Creating... +vkcs_compute_instance.app[0]: Still creating... [00m10s elapsed] +vkcs_networking_router_interface.router_interface: Creation complete after 6s [id=53d6881c-5426-4cad-8fd2-9e3af842e99e] +vkcs_compute_instance.app[0]: Still creating... [00m20s elapsed] +vkcs_compute_instance.app[0]: Still creating... [00m30s elapsed] +vkcs_compute_instance.app[0]: Creation complete after 34s [id=bc03c969-7f19-493e-a6d9-4cce60d5a973] +vkcs_compute_instance.monitoring: Creating... +vkcs_compute_instance.monitoring: Still creating... [00m10s elapsed] +vkcs_compute_instance.monitoring: Still creating... [00m20s elapsed] +vkcs_compute_instance.monitoring: Still creating... [00m30s elapsed] +vkcs_compute_instance.monitoring: Still creating... [00m40s elapsed] +vkcs_compute_instance.monitoring: Creation complete after 45s [id=8ef7a2cf-15a0-45f8-9e03-a0d83db6f4e4] +vkcs_compute_floatingip_associate.monitoring_fip_assoc: Creating... +vkcs_compute_floatingip_associate.monitoring_fip_assoc: Creation complete after 2s [id=95.163.215.1/8ef7a2cf-15a0-45f8-9e03-a0d83db6f4e4/] +╷ +│ Warning: Argument is deprecated +│ +│ with vkcs_networking_secgroup_rule.ssh, +│ on VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf line 87, in resource "vkcs_networking_secgroup_rule" "ssh": +│ 87: ethertype = "IPv4" +│ +│ Only IPv4 can be used as ethertype. This argument is deprecated, please do not use it. +│ +│ (and 15 more similar warnings elsewhere) +╵ + +Apply complete! Resources: 13 added, 0 changed, 0 destroyed. + +Outputs: + +app_ips = [ + "192.168.200.9", +] +grafana_url = "http://95.163.215.1:3000" +monitoring_ip = "95.163.215.1" +prometheus_url = "http://95.163.215.1:9090" +ssh_password = "debian" diff --git a/03_code/VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf b/03_code/VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf new file mode 100644 index 0000000..036d027 --- /dev/null +++ b/03_code/VKC_PR_M06_01_monitoring_main_РемизовКЛ_20260617.tf @@ -0,0 +1,316 @@ +terraform { + required_providers { + vkcs = { + source = "vk-cs/vkcs" + version = "~> 0.1" + } + } +} + +provider "vkcs" {} + +variable "external_network_name" { + default = "internet" +} + +variable "router_id" { + default = "913bdd47-9155-45b2-b404-5c10d0086132" +} + +variable "image_name" { + default = "ubuntu-20-202602051631.gite7a38aaf" +} + +variable "flavor_name" { + default = "Basic-1-2-20" +} + +variable "app_count" { + default = 1 +} + +variable "availability_zone" { + default = "MS1" +} + +data "vkcs_networking_network" "extnet" { + name = var.external_network_name +} + +data "vkcs_networking_router" "router" { + id = var.router_id +} + +data "vkcs_images_image" "ubuntu" { + name = var.image_name + most_recent = true +} + +data "vkcs_compute_flavor" "vm" { + name = var.flavor_name +} + +resource "vkcs_networking_network" "internal" { + name = "monitoring-internal-net" + sdn = "sprut" +} + +resource "vkcs_networking_subnet" "internal" { + name = "monitoring-internal-subnet" + network_id = vkcs_networking_network.internal.id + cidr = "192.168.200.0/24" +} + +resource "vkcs_networking_router_interface" "router_interface" { + router_id = data.vkcs_networking_router.router.id + subnet_id = vkcs_networking_subnet.internal.id +} + +resource "vkcs_networking_secgroup" "monitoring_sg" { + name = "monitoring-sg" + description = "Allow SSH, Prometheus, Grafana, Node Exporter" +} + +resource "vkcs_networking_secgroup_rule" "ssh" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 22 + port_range_max = 22 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.monitoring_sg.id +} + +resource "vkcs_networking_secgroup_rule" "grafana" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 3000 + port_range_max = 3000 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.monitoring_sg.id +} + +resource "vkcs_networking_secgroup_rule" "prometheus" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 9090 + port_range_max = 9090 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.monitoring_sg.id +} + +resource "vkcs_networking_secgroup_rule" "node_exporter" { + direction = "ingress" + ethertype = "IPv4" + protocol = "tcp" + port_range_min = 9100 + port_range_max = 9100 + remote_ip_prefix = "0.0.0.0/0" + security_group_id = vkcs_networking_secgroup.monitoring_sg.id +} + +resource "vkcs_compute_keypair" "monitoring" { + name = "monitoring-key" + public_key = file("~/.ssh/id_rsa.pub") +} + +resource "vkcs_compute_instance" "app" { + count = var.app_count + + name = "app-vm-${count.index + 1}" + flavor_id = data.vkcs_compute_flavor.vm.id + key_pair = vkcs_compute_keypair.monitoring.name + availability_zone = var.availability_zone + + block_device { + uuid = data.vkcs_images_image.ubuntu.id + source_type = "image" + destination_type = "volume" + volume_type = "ceph-ssd" + volume_size = 10 + boot_index = 0 + delete_on_termination = true + } + + network { + uuid = vkcs_networking_network.internal.id + } + + security_groups = [vkcs_networking_secgroup.monitoring_sg.name] + + user_data = <<-EOF +#!/bin/bash +set -e +apt-get update +apt-get install -y wget +cd /opt +wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz +tar xvf node_exporter-1.7.0.linux-amd64.tar.gz +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 < >(tee /var/log/user_data.log) 2>&1 + +# --- Устанавливаем пароль для ubuntu --- +echo "ubuntu:debian" | chpasswd + +# --- Включаем парольный SSH --- +sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config +sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config +systemctl restart ssh + +# --- Установка Prometheus, Grafana, Node Exporter --- +apt-get update +apt-get install -y wget curl software-properties-common + +cd /opt +wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz +tar xvf prometheus-2.48.0.linux-amd64.tar.gz +mv prometheus-2.48.0.linux-amd64 prometheus +useradd --no-create-home --shell /bin/false prometheus +chown -R prometheus:prometheus /opt/prometheus + +# Создаём папку для данных и даём права +mkdir -p /opt/prometheus/data +chown -R prometheus:prometheus /opt/prometheus/data + +cat > /opt/prometheus/prometheus.yml < /etc/systemd/system/prometheus.service < /etc/systemd/system/node_exporter.service <