# Скрипты управления Kubernetes **Автор:** Сергей Антропов **Сайт:** https://devops.org.ru ## Обзор В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории `scripts/`. ## Скрипты ### 1. `create_k8s_cluster.py` **Назначение:** Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета. **Принцип работы:** 1. **Парсинг пресета:** Читает YAML файл пресета (например, `molecule/presets/k8s/kubernetes.yml`) 2. **Создание Docker сети:** - Проверяет наличие сети (по умолчанию `labnet`) - Создает сеть если её нет 3. **Создание Docker контейнеров:** - Читает секцию `hosts` из пресета - Для каждого хоста создает Docker контейнер с настройками из `systemd_defaults` - Использует образы из секции `images` 4. **Создание Kind кластера:** - Генерирует конфигурацию Kind в формате YAML - Настраивает `extraPortMappings` для Ingress портов - Создает кластер через команду `kind create cluster` 5. **Установка аддонов:** - **Ingress NGINX:** Устанавливает ingress-nginx controller через kubectl apply - **Metrics Server:** Устанавливает metrics-server с патчем для insecure TLS - **Istio:** Устанавливает Istio через istioctl с профилем demo - **Kiali:** Устанавливает Kiali через Helm (использует Helm chart) - **Prometheus Stack:** Устанавливает Prometheus + Grafana через Helm (kube-prometheus-stack) 6. **Подключение к сети Kind:** Подключает контейнер `k8s-controller` к сети `kind` для доступа к API серверу **Параметры:** ```bash python3 scripts/create_k8s_cluster.py ``` **Пример:** ```bash python3 scripts/create_k8s_cluster.py molecule/presets/k8s/kubernetes.yml k8s-controller ``` --- ### 2. `delete_hosts.py` **Назначение:** Удаление Docker контейнеров, созданных из секции `hosts` пресета. **Принцип работы:** 1. **Парсинг пресета:** Читает YAML файл пресета 2. **Получение списка хостов:** Извлекает секцию `hosts` 3. **Удаление контейнеров:** Для каждого хоста выполняет `docker rm -f ` **Параметры:** ```bash python3 scripts/delete_hosts.py ``` **Пример:** ```bash python3 scripts/delete_hosts.py molecule/presets/k8s/kubernetes.yml ``` --- ### 3. `portforward.py` **Назначение:** Управление port-forward для доступа к сервисам Kubernetes извне кластера. **Принцип работы:** 1. **Загрузка пресета:** Читает файл `molecule/presets/k8s/kubernetes.yml` 2. **Получение kubeconfig:** - Копирует kubeconfig из контейнера `k8s-controller` через `docker exec` - Сохраняет во временный файл 3. **Модификация kubeconfig:** - Заменяет `server: https://0.0.0.0:6443` на `server: https://localhost:6443` - Это необходимо для доступа с локальной машины 4. **Создание port-forward:** - Запускает `kubectl port-forward` для каждого сервиса из `addon_ports` - Использует формат: `kubectl port-forward -n svc/ :` - Управляет процессами через PID **Команды:** - `create` - создает port-forward для всех сервисов - `list` - показывает список активных портов - `clear` - останавливает все port-forward процессы - `recreate` - очищает и заново создает port-forward - `delete ` - удаляет конкретный port-forward **Пример использования:** ```bash python3 scripts/portforward.py create python3 scripts/portforward.py list python3 scripts/portforward.py delete 3000 python3 scripts/portforward.py clear ``` **Важно:** Скрипт должен запускаться на локальной машине, где установлены `kubectl` и Python 3. --- ### 4. `manage_hosts.py` **Назначение:** Автоматическое управление записями в `/etc/hosts` для Ingress ресурсов. **Принцип работы:** 1. **Получение списка Ingress:** - Получает kubeconfig из контейнера `k8s-controller` - Выполняет `kubectl get ingress --all-namespaces` - Извлекает все хосты из Ingress правил 2. **Работа с /etc/hosts:** - Использует метку `#k8s` для различения автоматических и ручных записей - Добавляет записи в формате: `127.0.0.1 #k8s` - Удаляет только записи с меткой `#k8s` 3. **Автоматизация:** - Вызывается автоматически после: - `make k8s create` (добавление) - `make k8s destroy` (удаление) - `make k8s manifest apply/delete` (обновление) - `make k8s helm apply/delete/update` (обновление) **Команды:** - `add` - добавляет все Ingress хосты в /etc/hosts - `remove` - удаляет все записи с меткой #k8s - `cleanup` - удаляет записи если кластер недоступен - `list` - показывает текущие k8s записи **Пример использования:** ```bash sudo python3 scripts/manage_hosts.py add sudo python3 scripts/manage_hosts.py list sudo python3 scripts/manage_hosts.py remove ``` **Безопасность:** - Работает только с записями, помеченными `#k8s` - Не трогает ручные записи пользователя - Требует sudo для редактирования `/etc/hosts` --- ### 5. `k8s_status.py` **Назначение:** Детальный отчет о состоянии Kubernetes кластера. **Принцип работы:** 1. **Подключение к кластеру:** - Получает имя кластера через `kind get clusters` - Формирует адрес API сервера: `https://-control-plane:6443` - Выполняет все kubectl команды через `docker exec k8s-controller` 2. **Сбор информации:** - **Общая информация:** версия Kubernetes - **Узлы:** статус, ресурсы, описание каждого узла - **Namespaces:** список всех namespace - **Использование ресурсов:** метрики через metrics-server (если установлен) - **Pods:** поды по каждому namespace - **Deployments:** deployments по namespace - **DaemonSets:** daemonsets по namespace - **StatefulSets:** statefulsets по namespace - **Services:** сервисы по namespace - **Ingress:** ingress ресурсы - **PVC:** PersistentVolumeClaims - **События:** последние 20 событий по namespace - **Helm релизы:** список установленных через Helm 3. **Форматирование вывода:** - Использует секции с разделителями - Группирует информацию по namespace - Показывает только непустые секции **Пример использования:** ```bash python3 scripts/k8s_status.py ``` **Интеграция:** - Автоматически вызывается командой `make k8s status [preset]` **Особенности:** - Выполняет все команды внутри контейнера `k8s-controller` - Использует прямой адрес control-plane для подключения - Обходит проблемы с kubeconfig через `--insecure-skip-tls-verify` --- ## Архитектура взаимодействия ``` ┌─────────────────────────────────────────────────────┐ │ Локальная машина │ │ │ │ Makefile → Python скрипты → Docker API │ │ ↓ ↓ ↓ │ │ make k8s scripts/*.py docker exec │ └─────────────────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────┐ │ Docker контейнер │ │ k8s-controller │ │ ┌──────────────────────────────────────────┐ │ │ │ kind, kubectl, helm, istioctl │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────┐ │ Docker сеть: kind │ │ ┌──────────────────────────────────────────┐ │ │ │ Kind Kubernetes Cluster │ │ │ │ • Control Plane (6443) │ │ │ │ • Worker Nodes │ │ │ │ • Services (ClusterIP) │ │ │ │ • Ingress │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘ ``` ## Общие принципы 1. **Изоляция:** Все kubectl команды выполняются внутри контейнера `k8s-controller` 2. **Безопасность:** Используется `--insecure-skip-tls-verify` для обхода проблем с сертификатами 3. **Автоматизация:** Скрипты вызываются автоматически через Makefile 4. **Логгирование:** Все скрипты выводят подробную информацию о своих действиях ## Требования - Python 3 (на локальной машине) - kubectl (на локальной машине, для portforward.py) - Docker - Docker контейнер `k8s-controller` должен быть запущен ## Отладка Если что-то не работает: 1. **Проверьте контейнер:** ```bash docker ps | grep k8s-controller ``` 2. **Запустите скрипт вручную:** ```bash python3 scripts/k8s_status.py ``` 3. **Посмотрите логи:** ```bash docker logs k8s-controller ``` 4. **Проверьте кластер:** ```bash docker exec k8s-controller kubectl get nodes ```