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

233 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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