- Удален скрипт scripts/manage_hosts.py - Удалены все вызовы из Makefile - Удалены упоминания из документации - Обновлена документация по Ingress - теперь требуется ручное добавление в /etc/hosts - Убрано автоматическое управление /etc/hosts (не состоятельное решение)
		
			
				
	
	
		
			233 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Скрипты управления 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 <preset_file> <container_name>
 | ||
| ```
 | ||
| 
 | ||
| **Пример:**
 | ||
| ```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 <host_name>`
 | ||
| 
 | ||
| **Параметры:**
 | ||
| ```bash
 | ||
| python3 scripts/delete_hosts.py <preset_file>
 | ||
| ```
 | ||
| 
 | ||
| **Пример:**
 | ||
| ```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 <namespace> svc/<service> <local_port>:<remote_port>`
 | ||
|    - Управляет процессами через PID
 | ||
| 
 | ||
| **Команды:**
 | ||
| - `create` - создает port-forward для всех сервисов
 | ||
| - `list` - показывает список активных портов
 | ||
| - `clear` - останавливает все port-forward процессы
 | ||
| - `recreate` - очищает и заново создает port-forward
 | ||
| - `delete <port>` - удаляет конкретный 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. `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
 | ||
|    - Показывает только непустые секции
 | ||
| 
 | ||
| **Пример использования:**
 | ||
| ```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
 | ||
|    ```
 |