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

795 lines
22 KiB
Markdown
Raw 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 Kind Кластеры
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Содержание
- [Описание](#описание)
- [Требования к системе](#требования-к-системе)
- [Возможности](#возможности)
- [Быстрый старт](#быстрый-старт)
- [Команды управления](#команды-управления)
- [Работа с Helm](#работа-с-helm)
- [Работа с манифестами](#работа-с-манифестами)
- [Управление Ingress](#управление-ingress)
- [Проброс портов (Port-forward)](#проброс-портов-port-forward)
- [Мониторинг и логи](#мониторинг-и-логи)
- [Конфигурация](#конфигурация)
- [Архитектура](#архитектура)
- [Доступ к приложениям](#доступ-к-приложениям)
- [Кроссплатформенность](#кроссплатформенность)
- [Подробная документация по скриптам](#подробная-документация-по-скриптам)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)
---
## Описание
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
## Требования к системе
### Обязательные требования
1. **Docker** - для запуска Kind кластеров
2. **Python 3** - для управления port-forward
3. **kubectl** - для работы с кластером
**Установка на macOS:**
```bash
brew install docker python3 kubectl
```
**Установка на Ubuntu/Debian:**
```bash
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
```
**Установка на CentOS/RHEL:**
```bash
sudo yum install -y docker python3 python3-pip kubectl
sudo systemctl start docker
sudo systemctl enable docker
```
### Проверка установки
```bash
docker --version
python3 --version
kubectl version --client
```
### Docker группы
На Linux добавьте пользователя в группу docker:
```bash
sudo usermod -aG docker $USER
# Выйдите и войдите заново
```
---
## Возможности
- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов
- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
-**Автоматический port-forward** для доступа к сервисам
- ✅ Работа с Helm (установка, удаление, обновление, rollback)
- ✅ Работа с Kubernetes манифестами
- ✅ Управление Helm репозиториями
- ✅ Автоматическое управление `/etc/hosts` для Ingress
- ✅ Управление Docker контейнерами в лабораторной сети
- ✅ Интеграция с Istio Service Mesh
- ✅ Детальный отчет о состоянии кластера
---
## Быстрый старт
### 1. Создание кластера
```bash
# Создание кластера с полным набором аддонов
make k8s create kubernetes
```
### 2. Проверка статуса
```bash
# Детальный отчет о кластере
make k8s status kubernetes
```
### 3. Доступ к аддонам
После создания кластера автоматически создаются port-forward:
- Grafana: http://localhost:3000
- Prometheus: http://localhost:9090
- Kiali: http://localhost:20001
### 4. Удаление кластера
```bash
make k8s destroy kubernetes
```
---
## Команды управления
### Создание кластера
```bash
# Минимальный кластер (без аддонов)
make k8s create
# Полный кластер с аддонами
make k8s create kubernetes
# Пользовательский пресет
make k8s create my-custom-preset
```
**Что происходит:**
1. Создается контейнер `k8s-controller` с инструментами (Kind, kubectl, Helm, Istio CLI)
2. Создаются Docker контейнеры из раздела `hosts` (если есть)
3. Создается Kind кластер
4. Устанавливаются аддоны
5. Создается автоматический port-forward
6. Добавляются записи в `/etc/hosts` для Ingress
### Управление жизненным циклом
```bash
# Удаление кластера (с очисткой port-forward и /etc/hosts)
make k8s destroy [preset]
# Остановка кластера (без удаления)
make k8s stop [preset]
# Запуск остановленного кластера
make k8s start [preset]
# Детальный отчет о состоянии
make k8s status [preset]
# Показать узлы кластера
make k8s nodes [preset]
```
### Получение kubeconfig
```bash
# Сохранить kubeconfig для подключения
make k8s config [preset]
# Использовать конфиг
export KUBECONFIG=kubeconfig
kubectl get nodes
```
### Shell доступ
```bash
# Открыть shell в контейнере k8s-controller
make k8s shell [preset]
```
---
## Работа с Helm
Helm - это менеджер пакетов для Kubernetes.
### Управление релизами
```bash
# Установить чарт
make k8s helm apply kubernetes nginx stable/nginx-ingress
# Обновить релиз
make k8s helm update kubernetes nginx stable/nginx-ingress
# Откатить релиз
make k8s helm rollback kubernetes nginx
# Посмотреть статус релиза
make k8s helm status kubernetes nginx
# Удалить релиз
make k8s helm delete kubernetes nginx
# Список всех релизов
make k8s helm list kubernetes
```
### Управление репозиториями
```bash
# Добавить репозиторий
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Обновить репозиторий
make k8s helmrepo update kubernetes stable
# Список репозиториев
make k8s helmrepo list kubernetes
# Показать доступные чарты
make k8s helmrepo packages kubernetes stable
# Удалить репозиторий
make k8s helmrepo delete kubernetes stable
```
### Пример: установка MySQL
```bash
# Добавить репозиторий Bitnami
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Установить MySQL
make k8s helm apply kubernetes mysql bitnami/mysql
# Проверить статус
make k8s helm status kubernetes mysql
```
---
## Работа с манифестами
Применение обычных Kubernetes манифестов (без Helm).
```bash
# Применить манифест из URL
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# Применить манифест из файла
make k8s manifest apply kubernetes /path/to/manifest.yaml
# Удалить манифест
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
### Пример: создание Deployment
```yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```
```bash
# Применить
make k8s manifest apply kubernetes ./nginx-deployment.yaml
```
---
## Управление Ingress
### Доступ к приложениям через Ingress
Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`:
```bash
# Добавить запись в /etc/hosts
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
# Очистить DNS кеш macOS
sudo killall -HUP mDNSResponder
```
После этого приложение будет доступно по адресу:
```
http://grafana.local:8081
```
**Пример манифеста Ingress:**
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
spec:
rules:
- host: grafana.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: monitoring-grafana
port:
number: 80
```
**Важно:**
- Записи в `/etc/hosts` нужно добавлять вручную
- Используйте порт 8081 для HTTP и 8443 для HTTPS
- Для удаления записей используйте sudo
---
## Проброс портов (Port-forward)
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
### Автоматический port-forward
После создания кластера автоматически создаются порты:
- Ingress HTTP: `8081:80`
- Ingress HTTPS: `8443:443`
- Grafana: `3000:80`
- Prometheus: `9090:9090`
- Kiali: `20001:20001`
### Управление вручную
```bash
# Создать port-forward
make k8s portforward create
# Список активных портов
make k8s portforward list
# Удалить конкретный порт
make k8s portforward delete 3000
# Очистить все порты
make k8s portforward clear
# Пересоздать порты
make k8s portforward recreate
```
### Ручной port-forward для своих сервисов
```bash
# Подключиться к кластеру
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
# Создать port-forward
kubectl port-forward -n default svc/my-service 8080:80
```
---
## Мониторинг и логи
### Детальный статус кластера
```bash
make k8s status kubernetes
```
Показывает:
- Узлы кластера
- Namespaces
- Pods
- Services
- Ingress
- Deployments
- DaemonSets
- StatefulSets
- PVC
- События
- Helm релизы
- Использование ресурсов
### Доступ к аддонам
**Grafana:**
```
URL: http://localhost:3000
Login: admin
Password: admin
```
**Prometheus:**
```
URL: http://localhost:9090
```
**Kiali:**
```
URL: http://localhost:20001
Login: admin
Password: admin
```
### Логи контейнера
```bash
# Логи k8s-controller
docker logs k8s-controller
# Логи в реальном времени
docker logs -f k8s-controller
```
### Логи кластера
```bash
# Логи конкретного pod
make k8s shell kubernetes
kubectl logs -n monitoring <pod-name>
# Все логи в namespace
kubectl logs -n monitoring --all-containers=true --tail=100
```
---
## Конфигурация
### Пресеты
Пресеты находятся в `molecule/presets/k8s/`:
**kubernetes.yml** - полный набор аддонов:
- Ingress NGINX
- Metrics Server
- Istio
- Kiali
- Prometheus + Grafana
### Структура пресета
```yaml
k8s_cluster:
name: lab
nodes: 1
addons:
ingress: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
addon_ports:
ingress_http: 8081
ingress_https: 8443
prometheus: 9090
grafana: 3000
kiali: 20001
metrics_server: 4443
hosts:
- name: test1
image: centos8
systemd_defaults:
container: true
images:
centos8:
name: inecs/ansible-lab:centos8-latest
```
### Пользовательский пресет
Создайте файл `molecule/presets/k8s/my-preset.yml`:
```yaml
k8s_cluster:
name: my-cluster
nodes: 2
addons:
ingress: true
metrics_server: false
istio: false
kiali: false
prometheus_stack: false
```
Использование:
```bash
make k8s create my-preset
```
---
## Архитектура
```
┌─────────────────────────────────────────────────────┐
│ Локальная машина │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Makefile → Python скрипты → Docker API │ │
│ │ kubectl (port-forward) │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker: k8s-controller │
│ ┌──────────────────────────────────────────────┐ │
│ │ kind, kubectl, helm, istioctl │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker сеть: kind │
│ ┌──────────────────────────────────────────────┐ │
│ │ Kind Kubernetes Cluster │ │
│ │ • Control Plane (6443) │ │
│ │ • Worker Nodes │ │
│ │ • Services (ClusterIP) │ │
│ │ • Ingress Controller │ │
│ │ • Istio Service Mesh │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
### Компоненты
1. **k8s-controller** - контейнер с инструментами управления
2. **Kind кластер** - Kubernetes кластер в Docker контейнерах
3. **Port-forward** - локальные процессы на хосте
4. **Ingress** - маршрутизация трафика внутрь кластера
---
## Доступ к приложениям
### Доступ через Ingress
1. Создайте Ingress манифест
2. Примените через `make k8s manifest apply`
3. Запись автоматически добавится в `/etc/hosts`
4. Приложение доступно по доменному имени
### Доступ через port-forward
Для ClusterIP сервисов:
```bash
kubectl port-forward -n namespace svc/service-name 8080:80
```
Доступ: http://localhost:8080
### Доступ внутри кластера
Из другого pod:
```bash
kubectl exec -it pod-name -- curl http://service-name.namespace:80
```
---
## Кроссплатформенность
### Поддерживаемые платформы
- **macOS (Intel & Apple Silicon)** - полная поддержка
- **Linux (amd64 & arm64)** - полная поддержка
- **Windows** - через WSL2
### Проблемы на разных платформах
**Apple Silicon (M1/M2):**
- Используется ARM64 образы
- Автоматическое определение архитектуры
**Linux:**
- Требуются права на Docker socket
- Возможны проблемы с selinux
---
## Подробная документация по скриптам
Для подробного описания работы всех скриптов управления Kubernetes смотрите:
📖 [Документация по скриптам Kubernetes](k8s-scripts.md)
Включает:
- Описание каждого скрипта
- Принцип работы
- Примеры использования
- Архитектура взаимодействия
- Отладка
---
## Best Practices
### 1. Используйте пресеты
Не создавайте кластеры вручную, используйте пресеты для консистентности.
### 2. Очищайте после работы
```bash
# После тестирования
make k8s destroy kubernetes
```
### 3. Проверяйте статус
```bash
# Регулярно проверяйте статус
make k8s status kubernetes
```
### 4. Используйте Helm для сложных приложений
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
### 5. Логируйте изменения
Все изменения в кластере через `make k8s` автоматически логируются.
---
## Troubleshooting
### Кластер не создается
**Проблема:** `kind create cluster` завершается с ошибкой
**Решение:**
```bash
# Проверьте Docker
docker ps
# Перезапустите Docker
sudo systemctl restart docker
# Очистите старые кластеры
kind delete cluster --all
```
### Port-forward не работает
**Проблема:** Невозможно подключиться к порту
**Решение:**
```bash
# Проверьте процессы
make k8s portforward list
# Пересоздайте порты
make k8s portforward recreate
# Проверьте, что порт свободен
lsof -i :3000
```
### kubectl не подключается
**Проблема:** `kubectl get nodes` выдает ошибку
**Решение:**
```bash
# Проверьте контейнер
docker ps | grep k8s-controller
# Зайдите в контейнер
make k8s shell kubernetes
# Проверьте кластер
kubectl get nodes
# Если не работает, пересоздайте кластер
make k8s destroy kubernetes
make k8s create kubernetes
```
### Аддоны не устанавливаются
**Проблема:** Grafana/Prometheus/Kiali не доступны
**Решение:**
```bash
# Проверьте статус кластера
make k8s status kubernetes
# Проверьте pods
make k8s shell kubernetes
kubectl get pods -n monitoring
kubectl logs -n monitoring <pod-name>
# Пересоздайте кластер
make k8s destroy kubernetes
make k8s create kubernetes
```
### Ingress не работает
**Проблема:** Доменные имена не резолвятся
**Решение:**
```bash
# Проверьте Ingress
make k8s shell kubernetes
kubectl get ingress --all-namespaces
# Добавьте запись в /etc/hosts вручную
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
# Очистите DNS кеш
sudo killall -HUP mDNSResponder
# Проверьте доступность
curl http://grafana.local:8081
```
### Helm чарты не устанавливаются
**Проблема:** `helm install` завершается с ошибкой
**Решение:**
```bash
# Проверьте репозитории
make k8s helmrepo list kubernetes
# Обновите репозитории
make k8s helmrepo update kubernetes stable
# Проверьте логи
make k8s shell kubernetes
kubectl logs -l app=<release-name>
```
### Контейнер k8s-controller не запускается
**Проблема:** `docker: Error response from daemon: ...`
**Решение:**
```bash
# Проверьте образ
docker images | grep k8s
# Пересоберите образ
make docker build-image IMAGE=k8s-amd64
make docker build-image IMAGE=k8s-arm64
# Проверьте Docker
docker system prune -f
```
---
## Контакты
- **Автор:** Сергей Антропов
- **Сайт:** https://devops.org.ru
- **GitHub:** https://github.com/your-repo
---
## Лицензия
MIT