feat: add lab 3
This commit is contained in:
1 parent
b2713667e6
commit
cc1e9c2320
12 files changed
+1512
No files matched your search
@@ -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_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_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_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,
|
00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final,
|
||||||
|
@@ -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 |
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 91 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 196 KiB |
@@ -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",
|
||||||
|
]
|
||||||
@@ -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 <<HTML > /var/www/html/index.html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Web Server $(hostname)</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>Welcome to $(hostname)</h1>
|
||||||
|
<p>Server IP: $(hostname -I | awk '{print $1}')</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
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 <<SERVICE > /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 <<PROM > /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 <<SERVICE > /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 <<NEX > /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 <<AM > /opt/alertmanager/alertmanager.yml
|
||||||
|
route:
|
||||||
|
group_by: ['alertname']
|
||||||
|
group_wait: 10s
|
||||||
|
group_interval: 10s
|
||||||
|
repeat_interval: 1h
|
||||||
|
receiver: 'null'
|
||||||
|
receivers:
|
||||||
|
- name: 'null'
|
||||||
|
AM
|
||||||
|
|
||||||
|
cat <<AMS > /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 <<RULES > /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
|
||||||
|
}
|
||||||
@@ -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 = "Команда для подключения к бастиону"
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
Reference in new issue
Block a user