- Удален скрипт 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
|
||
```
|