- Создана подробная документация по скриптам (k8s-scripts.md) - Полностью переписана документация kubernetes-kind.md - Добавлено содержание с навигацией - Добавлены разделы: Helm, манифесты, Ingress, port-forward - Добавлена архитектура взаимодействия - Добавлены Best Practices и Troubleshooting - Обновлена справка в Makefile - Удалены устаревшие команды (manifest update, addon) - Добавлена ссылка на документацию по скриптам
13 KiB
Скрипты управления Kubernetes
Автор: Сергей Антропов
Сайт: https://devops.org.ru
Обзор
В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории scripts/.
Скрипты
1. create_k8s_cluster.py
Назначение: Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета.
Принцип работы:
-
Парсинг пресета: Читает YAML файл пресета (например,
molecule/presets/k8s/kubernetes.yml) -
Создание Docker сети:
- Проверяет наличие сети (по умолчанию
labnet) - Создает сеть если её нет
- Проверяет наличие сети (по умолчанию
-
Создание Docker контейнеров:
- Читает секцию
hostsиз пресета - Для каждого хоста создает Docker контейнер с настройками из
systemd_defaults - Использует образы из секции
images
- Читает секцию
-
Создание Kind кластера:
- Генерирует конфигурацию Kind в формате YAML
- Настраивает
extraPortMappingsдля Ingress портов - Создает кластер через команду
kind create cluster
-
Установка аддонов:
- 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)
-
Подключение к сети 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 пресета.
Принцип работы:
- Парсинг пресета: Читает YAML файл пресета
- Получение списка хостов: Извлекает секцию
hosts - Удаление контейнеров: Для каждого хоста выполняет
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 извне кластера.
Принцип работы:
-
Загрузка пресета: Читает файл
molecule/presets/k8s/kubernetes.yml -
Получение kubeconfig:
- Копирует kubeconfig из контейнера
k8s-controllerчерезdocker exec - Сохраняет во временный файл
- Копирует kubeconfig из контейнера
-
Модификация kubeconfig:
- Заменяет
server: https://0.0.0.0:6443наserver: https://localhost:6443 - Это необходимо для доступа с локальной машины
- Заменяет
-
Создание 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-forwarddelete <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. manage_hosts.py
Назначение: Автоматическое управление записями в /etc/hosts для Ingress ресурсов.
Принцип работы:
-
Получение списка Ingress:
- Получает kubeconfig из контейнера
k8s-controller - Выполняет
kubectl get ingress --all-namespaces - Извлекает все хосты из Ingress правил
- Получает kubeconfig из контейнера
-
Работа с /etc/hosts:
- Использует метку
#k8sдля различения автоматических и ручных записей - Добавляет записи в формате:
127.0.0.1 <hostname> #k8s - Удаляет только записи с меткой
#k8s
- Использует метку
-
Автоматизация:
- Вызывается автоматически после:
make k8s create(добавление)make k8s destroy(удаление)make k8s manifest apply/delete(обновление)make k8s helm apply/delete/update(обновление)
- Вызывается автоматически после:
Команды:
add- добавляет все Ingress хосты в /etc/hostsremove- удаляет все записи с меткой #k8scleanup- удаляет записи если кластер недоступенlist- показывает текущие k8s записи
Пример использования:
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 кластера.
Принцип работы:
-
Подключение к кластеру:
- Получает имя кластера через
kind get clusters - Формирует адрес API сервера:
https://<cluster_name>-control-plane:6443 - Выполняет все kubectl команды через
docker exec k8s-controller
- Получает имя кластера через
-
Сбор информации:
- Общая информация: версия 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
-
Форматирование вывода:
- Использует секции с разделителями
- Группирует информацию по 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 │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
Общие принципы
- Изоляция: Все kubectl команды выполняются внутри контейнера
k8s-controller - Безопасность: Используется
--insecure-skip-tls-verifyдля обхода проблем с сертификатами - Автоматизация: Скрипты вызываются автоматически через Makefile
- Логгирование: Все скрипты выводят подробную информацию о своих действиях
Требования
- Python 3 (на локальной машине)
- kubectl (на локальной машине, для portforward.py)
- Docker
- Docker контейнер
k8s-controllerдолжен быть запущен
Отладка
Если что-то не работает:
-
Проверьте контейнер:
docker ps | grep k8s-controller -
Запустите скрипт вручную:
python3 scripts/k8s_status.py -
Посмотрите логи:
docker logs k8s-controller -
Проверьте кластер:
docker exec k8s-controller kubectl get nodes