Index
Управление инфраструктурой проекта через Ansible.
Быстрый старт
-
Настройка окружения:
1 2
cp env.example .env # Отредактируйте .env с вашими нодами и SSH ключами -
Запуск playbook:
1 2 3 4
make firewall # Настройка firewall на всех нодах make firewall-limit limit=master # Только master ноды make wireguard # Настройка WireGuard full-mesh make ping # Проверка подключения
Важно: Все конфигурационные файлы (inventory и WireGuard playbook) автоматически генерируются в entrypoint контейнера перед каждым запуском команды на основе .env файла.
Основные команды
Общие команды
make generate-configs- принудительная генерация всех конфигурационных файловmake ping- проверка подключения к нодамmake inventory-list- просмотр inventorymake lint- проверка синтаксиса playbooksmake help- справка по командам
Firewall
make firewall- настройка firewall на всех нодахmake firewall-limit limit=<group>- настройка на конкретной группе/ноде
WireGuard Full-Mesh
make wireguard- настройка WireGuard full-mesh на всех нодахmake wireguard-limit limit=<group>- настройка WireGuard на конкретной группе/нодеmake wireguard-status- показать статус WireGuard на всех нодахmake wireguard-test- тестирование связности между нодами через WireGuard
WireGuard Client VPN
make wireguard-client-setup- настройка клиентского VPN на первом master нодеmake wireguard-client-config- генерация клиентской конфигурации WireGuardmake wireguard-client-status- проверка статуса клиентского подключения
Примечание:
- Все конфигурационные файлы (inventory и WireGuard playbook) автоматически генерируются в entrypoint контейнера перед каждым запуском команды.
- Генерация происходит через docker-entrypoint.sh, который вызывает python3 -m config_generator.
- Файлы генерируются из шаблонов на основе данных из .env файла.
- Сгенерированные файлы создаются только внутри контейнера и не попадают на хост (все bind mounts - read-only).
- Редактировать можно только шаблоны (например, ansible/playbooks/wireguard.yml.j2), изменения применяются без пересборки образа.
WireGuard Full-Mesh Network
Проект использует WireGuard для создания полносвязной (full-mesh) приватной сети между всеми нодами.
Архитектура сети
- Сеть:
10.99.0.0/24(настраивается в.env) - Интерфейс:
wg0 - Порт:
51820/udp(настраивается в.env) - Топология: Full-mesh (каждая нода связана со всеми остальными)
Динамическое распределение IP-адресов
WireGuard IP-адреса задаются явно для каждой ноды в .env файле:
1 2 3 4 5 6 7 8 9 10 11 | |
Преимущества явного указания IP: - Полный контроль над адресацией - Нет ограничений по количеству нод каждого типа - Легко понять, какой IP у какой ноды - Гибкость в выборе схемы адресации
Количество туннелей
Количество туннелей рассчитывается автоматически: n × (n-1) / 2, где n — количество нод.
Например: - 3 ноды → 3 туннеля - 6 нод → 15 туннелей - 10 нод → 45 туннелей
Генерация конфигураций
Все конфигурационные файлы генерируются автоматически пакетом config_generator:
- Inventory (
inventory.ini) - генерируется из нод в.env - WireGuard playbook (
playbooks/wireguard.yml) - генерируется из шаблонаwireguard.yml.j2с автоматическим назначением IP-адресов
Структура пакета:
- config_generator/parser.py - парсинг нод из переменных окружения
- config_generator/inventory.py - генерация Ansible inventory
- config_generator/wireguard.py - генерация WireGuard playbook
- config_generator/main.py - главная функция
1 2 3 4 5 6 7 8 9 | |
Процесс настройки
- Генерация playbook: Автоматически создается playbook с правильными IP-адресами для всех нод
- Установка WireGuard: Playbook автоматически устанавливает WireGuard на всех нодах
- Генерация ключей: На каждой ноде генерируются приватный и публичный ключи (если их еще нет)
- Создание конфигурации: Для каждой ноды создается конфигурация с подключением ко всем остальным нодам
- Запуск: WireGuard запускается и включается в автозагрузку
Проверка работы
После настройки можно проверить связность:
1 2 3 4 5 6 7 8 9 10 | |
Важные замечания
- Firewall: Playbook автоматически настраивает firewall для разрешения порта 51820/udp
- IP Forwarding: Автоматически включается на всех нодах
- Ключи: Приватные ключи хранятся в
/etc/wireguard/privatekeyс правами 600 - Конфигурация: Конфигурация хранится в
/etc/wireguard/wg0.conf - Персистентность: Ключи не перегенерируются, если уже существуют (для сохранения конфигурации)
WireGuard Client VPN
Проект поддерживает настройку клиентского VPN для доступа к сервисам Kubernetes кластера извне.
Архитектура клиентского VPN
- VPN Gateway: Первый master нод (автоматически определяется)
- Клиентский IP: Указывается в
.envфайле (например,10.99.0.100) - Доступная сеть:
- WireGuard сеть:
10.99.0.0/24(настраивается в.env)
Важно: Доступ к pod и service сетям Kubernetes не включен в VPN по соображениям безопасности. Доступ к сервисам кластера осуществляется через:
- Port-forward (kubectl port-forward)
- Ingress с IP whitelist (ограничение доступа только для VPN IP адресов)
- LoadBalancer сервисы с доступом через WireGuard IP адреса
Настройка клиентского VPN
- Добавьте конфигурацию клиента в
.envфайл:
1 2 3 4 5 6 | |
Важно:
- Клиентский IP должен быть в пределах WireGuard сети (WIREGUARD_NETWORK_CIDR)
- Клиентский IP не должен конфликтовать с IP адресами нод
- Рекомендуется использовать IP из диапазона, не занятого нодами (например, 10.99.0.100-199)
- Настройте клиентский VPN:
1 | |
Эта команда: - Генерирует ключи для клиента (приватный/публичный) - Добавляет клиента как peer в конфигурацию первого master нода - Сохраняет клиентскую конфигурацию на сервере
- Сгенерируйте клиентскую конфигурацию:
1 | |
Эта команда:
- Читает клиентскую конфигурацию с сервера
- Сохраняет её локально в infra/wireguard-clients/<client_name>.conf
-
Импортируйте конфигурацию в WireGuard клиент:
-
Windows: Импортируйте файл через WireGuard GUI
- Linux:
sudo wg-quick up <client_name>.conf - macOS: Импортируйте файл через WireGuard GUI
-
Android/iOS: Отсканируйте QR-код или импортируйте файл
-
Подключитесь к VPN:
После импорта конфигурации подключитесь к VPN через клиент WireGuard.
Проверка подключения
1 2 3 4 5 6 | |
Использование после подключения
После подключения к VPN вы получите доступ к:
- Нодам кластера: Через WireGuard сеть (
10.99.0.0/24) - LoadBalancer сервисам: Если они используют IP адреса из WireGuard сети (MetalLB)
Доступ к сервисам Kubernetes:
Доступ к pod и service сетям не включен в VPN по соображениям безопасности. Используйте следующие методы:
-
Port-forward (рекомендуется для разработки):
1 2 3 4 5 6
# Kubernetes Dashboard kubectl port-forward -n tech-dashboard svc/kubernetes-dashboard-web 8000:8000 # Затем откройте http://localhost:8000 # MinIO Console kubectl port-forward -n tech-minio-tenants svc/minio-console 9001:9001 -
Ingress с IP whitelist (для production): Настройте Ingress контроллер для разрешения доступа только с IP адресов WireGuard сети:
1 2 3
# Пример аннотации для NGINX Ingress annotations: nginx.ingress.kubernetes.io/whitelist-source-range: "10.99.0.0/24" -
LoadBalancer через MetalLB: Если MetalLB использует IP адреса из WireGuard сети, сервисы будут доступны напрямую через VPN.
Управление клиентскими конфигурациями
- Ключи клиента: Хранятся на сервере в
/etc/wireguard/clients/<client_name>/ - Конфигурация клиента: Хранится на сервере в
/etc/wireguard/clients/<client_name>/<client_name>.conf - Локальная копия: Сохраняется в
infra/wireguard-clients/<client_name>.conf
Добавление дополнительных клиентов
Для добавления дополнительных клиентов:
- Измените
WIREGUARD_CLIENT_NAMEиWIREGUARD_CLIENT_IPв.env - Запустите
make wireguard-client-setup - Сгенерируйте конфигурацию:
make wireguard-client-config
Каждый клиент должен иметь уникальный IP адрес в WireGuard сети.
Kubernetes Cluster
Проект поддерживает автоматическую установку production-ready кластера Kubernetes с использованием Calico CNI.
Архитектура
- Container Runtime: containerd
- CNI Plugin: Calico (с Network Policies)
- Network: WireGuard IP адреса (настраиваемая сеть, по умолчанию
10.99.0.0/24) для внутренней коммуникации - Pod Network CIDR:
10.244.0.0/16(настраивается) - Service CIDR:
10.96.0.0/12(настраивается) - High Availability: Поддержка нескольких master нод
Быстрая установка
Для полной установки кластера одной командой:
1 | |
Эта команда выполнит все шаги автоматически: 1. Подготовка всех нод (отключение swap, установка containerd, kubeadm) 2. Инициализация первого master 3. Установка Calico CNI 4. Присоединение дополнительных master нод (если есть) 5. Присоединение worker нод 6. Проверка кластера
Пошаговая установка
Если нужен больший контроль, выполняйте команды последовательно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Управление кластером
1 2 3 4 5 | |
Конфигурация
Настройте параметры Kubernetes в .env файле:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Примечание: WireGuard IP каждой ноды задается индивидуально в определении ноды через NODE_X_WIREGUARD_IP.
Особенности реализации
Использование WireGuard сети
Все компоненты Kubernetes используют WireGuard IP адреса (настраиваемая сеть, по умолчанию 10.99.0.0/24) для коммуникации:
- API Server advertise address
- Kubelet node IP
- etcd peer communication
Это обеспечивает: - Безопасную коммуникацию между нодами - Работу кластера через NAT и firewall - Возможность географически распределенного кластера
Отключение swap
Swap автоматически отключается на всех нодах, так как это требование Kubernetes:
- Временное отключение: swapoff -a
- Постоянное: комментирование записей в /etc/fstab
- Проверка: автоматическая верификация после отключения
High Availability (HA)
Для production рекомендуется: - Минимум 3 master ноды (для кворума etcd) - Нечетное количество master нод (3, 5, 7) - Load balancer перед master нодами (MetalLB или внешний LB)
Playbooks автоматически: - Настраивают stacked etcd (etcd на тех же нодах, что и control plane) - Генерируют и распространяют сертификаты - Настраивают все компоненты для HA
Network Policies с Calico
Calico предоставляет: - Встроенные Kubernetes Network Policies - Расширенные Calico Network Policies - BGP маршрутизацию (опционально) - Высокую производительность
Пример использования Network Policy:
1 2 3 4 5 6 7 8 9 10 | |
Верификация кластера
Команда make k8s-verify проверяет:
- ✓ Статус всех нод (Ready/NotReady)
- ✓ Количество master и worker нод
- ✓ Статус системных подов (kube-system namespace)
- ✓ Работу Calico (calico-node, calico-kube-controllers)
- ✓ DNS resolution из подов
- ✓ Connectivity к API server
- ✓ Связность между нодами через WireGuard
- ✓ Срок действия сертификатов
Troubleshooting
Проверка статуса нод
1 2 3 4 5 6 | |
Проверка подов
1 2 3 4 5 6 7 8 | |
Проверка сети
1 2 3 4 5 6 7 8 | |
Проверка сертификатов
1 2 | |
Переустановка ноды
Если нода в проблемном состоянии:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Рекомендации по production
- Резервное копирование etcd:
- Регулярные снапшоты etcd
- Хранение в отдельном месте
-
Тестирование восстановления
-
Мониторинг:
- Установить Prometheus + Grafana
- Настроить алерты для критичных метрик
-
Мониторить использование ресурсов
-
Безопасность:
- Регулярное обновление Kubernetes
- Использование RBAC
- Pod Security Standards
-
Network Policies для изоляции
-
Обновления:
- Следовать официальной документации kubeadm
- Обновлять по одной ноде за раз
- Тестировать на staging окружении
Дополнительные компоненты
Установите дополнительные компоненты:
1 | |
Это установит:
- Metrics Server - сбор метрик ресурсов (CPU, память) для использования в kubectl top и HPA
Metrics Server версия настраивается через переменную окружения METRICS_SERVER_VERSION (по умолчанию v0.8.0).
Сброс кластера
⚠️ Внимание: Эта операция полностью удалит кластер Kubernetes!
1 | |
Это выполнит: - Drain всех подов - Удаление всех нод из кластера - Полную очистку Kubernetes конфигураций - Очистку сетевых интерфейсов и правил iptables - Очистку контейнеров
После сброса можно заново установить кластер командой make k8s-full-install.
Структура проекта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
Принципы работы
Генерация конфигураций
Все конфигурационные файлы генерируются автоматически перед каждым запуском команды:
- Inventory (
inventory.ini) - создается на основе нод из.env - WireGuard playbook (
wireguard.yml) - генерируется из шаблона с автоматическим назначением IP - Kubeadm config - генерируется с учетом WireGuard IP адресов
Идемпотентность
Все playbooks идемпотентны - их можно запускать многократно без побочных эффектов:
- Проверяют текущее состояние перед изменениями
- Пропускают уже выполненные шаги
- Безопасны для повторного применения
Безопасность
- SSH ключи монтируются read-only
- Приватные ключи WireGuard имеют права 600
- Все коммуникации через зашифрованный WireGuard туннель
- Поддержка SSH ключей с парольной фразой
Гибкость
- Нет хардкода нод - используются группы (master/worker)
- Переменные окружения для всех настроек
- Шаблоны для кастомизации playbooks
- Поддержка разных OS (Debian/Ubuntu, RedHat/CentOS)
FAQ
Как добавить новую ноду?
-
Добавьте ноду в
.env:1 2 3 4 5
NODE_4_NAME=worker3 NODE_4_IP=192.168.1.14 NODE_4_TYPE=worker NODE_4_WIREGUARD_IP=10.99.0.23 # Выберите свободный IP NODE_4_SSH_KEY=/path/to/key -
Настройте инфраструктуру на новой ноде:
1 2
make firewall make wireguard -
Присоедините к Kubernetes кластеру:
1make k8s-join-workers
Как удалить ноду из кластера?
1 2 3 4 5 6 | |
Можно ли использовать для production?
Да, но учтите: - Минимум 3 master ноды для HA - Регулярные бэкапы etcd - Мониторинг и алерты - Тестирование на staging - План disaster recovery
Как обновить Kubernetes?
Следуйте официальной документации kubeadm для обновления версии. Обновляйте по одной ноде за раз.
Почему WireGuard IP вместо публичных?
WireGuard обеспечивает: - Безопасную зашифрованную коммуникацию - Работу через NAT и firewall - Возможность географически распределенного кластера - Изоляцию кластера от публичной сети