feat: add lab 3
This commit is contained in:
1 parent
b2713667e6
commit
cc1e9c2320
12 files changed
+1512
No files matched your search
@@ -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 |
|
||||
Reference in new issue
Block a user