feat: add demonstration 6.1

This commit is contained in:
Black_Raven committed 2026-06-18 19:06:16 +03:00
1 parent ee54718ba0
commit b2713667e6
8 files changed
+824

No files matched your search

+7
View File
@@ -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_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_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_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, 00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final,
1 file_name artifact_type module_or_lab task_code task_title relative_path evidence_for status comment
102 VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf CODE LR_02 main Terraform провайдер 03_code/VKC_LR_02_tf_packer_provider_РемизовКЛ_20260617.tf final
103 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
104 VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf CODE LR_02 main Terraform переменные 03_code/VKC_LR_02_tf_packer_variables_РемизовКЛ_20260617.tf final
105 VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md PR M06 01 Настройка мониторинга (Prometheus + Grafana) 01_reports/VKC_PR_M06_01_monitoring_REPORT_РемизовКЛ_20260617.md final
106 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
107 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
108 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
109 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
110 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
111 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
112 00_manifest.csv MANIFEST all all Финальный манифест сдачи 00_manifest.csv final
@@ -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.
- **Наглядность** — готовый дашборд позволяет быстро оценить состояние системы и выявить проблемы.
Полученный стек мониторинга готов к использованию в реальных проектах с минимальными доработками (настройка алертинга, ограничение доступа, интеграция с системой уведомлений).
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

@@ -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"
@@ -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 <<EOL
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
Group=nogroup
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOL
systemctl daemon-reload
systemctl enable node_exporter
systemctl start node_exporter
echo "App VM ${count.index + 1} ready"
EOF
}
resource "vkcs_compute_instance" "monitoring" {
depends_on = [vkcs_compute_instance.app]
name = "monitoring-vm"
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
exec > >(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 <<EOL
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: []
EOL
cat > /etc/systemd/system/prometheus.service <<EOL
[Unit]
Description=Prometheus
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --web.listen-address=0.0.0.0:9090 --storage.tsdb.path=/opt/prometheus/data
Restart=always
[Install]
WantedBy=multi-user.target
EOL
systemctl daemon-reload
systemctl enable prometheus
systemctl start prometheus
# --- Grafana (установка через deb, чтобы избежать проблем с репозиторием) ---
cd /tmp
wget https://dl.grafana.com/oss/release/grafana_11.3.0_amd64.deb
dpkg -i grafana_11.3.0_amd64.deb || apt-get install -f -y
systemctl enable grafana-server
systemctl start grafana-server
# --- Node Exporter ---
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 <<EOL
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
Group=nogroup
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOL
systemctl daemon-reload
systemctl enable node_exporter
systemctl start node_exporter
echo "=== user_data finished ==="
EOF
}
resource "vkcs_networking_floatingip" "monitoring_fip" {
pool = data.vkcs_networking_network.extnet.name
}
resource "vkcs_compute_floatingip_associate" "monitoring_fip_assoc" {
floating_ip = vkcs_networking_floatingip.monitoring_fip.address
instance_id = vkcs_compute_instance.monitoring.id
}
output "monitoring_ip" {
value = vkcs_networking_floatingip.monitoring_fip.address
}
output "app_ips" {
value = vkcs_compute_instance.app[*].access_ip_v4
}
output "grafana_url" {
value = "http://${vkcs_networking_floatingip.monitoring_fip.address}:3000"
}
output "prometheus_url" {
value = "http://${vkcs_networking_floatingip.monitoring_fip.address}:9090"
}
output "ssh_password" {
value = "debian"
description = "Логин: ubuntu, пароль: debian"
}