Files
DevOpsLab/docs/k8s-scripts.md
Сергей Антропов 0ffe1f1a90 refactor: удален скрипт manage_hosts.py и все упоминания
- Удален скрипт scripts/manage_hosts.py
- Удалены все вызовы из Makefile
- Удалены упоминания из документации
- Обновлена документация по Ingress - теперь требуется ручное добавление в /etc/hosts
- Убрано автоматическое управление /etc/hosts (не состоятельное решение)
2025-10-26 11:56:14 +03:00

11 KiB
Raw Permalink Blame History

Скрипты управления 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 серверу

Параметры:

python3 scripts/create_k8s_cluster.py <preset_file> <container_name>

Пример:

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 <host_name>

Параметры:

python3 scripts/delete_hosts.py <preset_file>

Пример:

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 <namespace> svc/<service> <local_port>:<remote_port>
    • Управляет процессами через PID

Команды:

  • create - создает port-forward для всех сервисов
  • list - показывает список активных портов
  • clear - останавливает все port-forward процессы
  • recreate - очищает и заново создает port-forward
  • delete <port> - удаляет конкретный port-forward

Пример использования:

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. k8s_status.py

Назначение: Детальный отчет о состоянии Kubernetes кластера.

Принцип работы:

  1. Подключение к кластеру:

    • Получает имя кластера через kind get clusters
    • Формирует адрес API сервера: https://<cluster_name>-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
    • Показывает только непустые секции

Пример использования:

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. Проверьте контейнер:

    docker ps | grep k8s-controller
    
  2. Запустите скрипт вручную:

    python3 scripts/k8s_status.py
    
  3. Посмотрите логи:

    docker logs k8s-controller
    
  4. Проверьте кластер:

    docker exec k8s-controller kubectl get nodes