- Создана подробная документация по скриптам (k8s-scripts.md) - Полностью переписана документация kubernetes-kind.md - Добавлено содержание с навигацией - Добавлены разделы: Helm, манифесты, Ingress, port-forward - Добавлена архитектура взаимодействия - Добавлены Best Practices и Troubleshooting - Обновлена справка в Makefile - Удалены устаревшие команды (manifest update, addon) - Добавлена ссылка на документацию по скриптам
21 KiB
Kubernetes Kind Кластеры
Автор: Сергей Антропов
Сайт: https://devops.org.ru
Содержание
- Описание
- Требования к системе
- Возможности
- Быстрый старт
- Команды управления
- Работа с Helm
- Работа с манифестами
- Управление Ingress
- Проброс портов (Port-forward)
- Мониторинг и логи
- Конфигурация
- Архитектура
- Доступ к приложениям
- Кроссплатформенность
- Подробная документация по скриптам
- Best Practices
- Troubleshooting
Описание
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе Kind для тестирования в изолированной лабораторной среде.
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
Требования к системе
Обязательные требования
- Docker - для запуска Kind кластеров
- Python 3 - для управления port-forward
- kubectl - для работы с кластером
Установка на macOS:
brew install docker python3 kubectl
Установка на Ubuntu/Debian:
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
Установка на CentOS/RHEL:
sudo yum install -y docker python3 python3-pip kubectl
sudo systemctl start docker
sudo systemctl enable docker
Проверка установки
docker --version
python3 --version
kubectl version --client
Docker группы
На Linux добавьте пользователя в группу docker:
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. Создание кластера
# Создание кластера с полным набором аддонов
make k8s create kubernetes
2. Проверка статуса
# Детальный отчет о кластере
make k8s status kubernetes
3. Доступ к аддонам
После создания кластера автоматически создаются port-forward:
- Grafana: http://localhost:3000
- Prometheus: http://localhost:9090
- Kiali: http://localhost:20001
4. Удаление кластера
make k8s destroy kubernetes
Команды управления
Создание кластера
# Минимальный кластер (без аддонов)
make k8s create
# Полный кластер с аддонами
make k8s create kubernetes
# Пользовательский пресет
make k8s create my-custom-preset
Что происходит:
- Создается контейнер
k8s-controllerс инструментами (Kind, kubectl, Helm, Istio CLI) - Создаются Docker контейнеры из раздела
hosts(если есть) - Создается Kind кластер
- Устанавливаются аддоны
- Создается автоматический port-forward
- Добавляются записи в
/etc/hostsдля Ingress
Управление жизненным циклом
# Удаление кластера (с очисткой 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
# Сохранить kubeconfig для подключения
make k8s config [preset]
# Использовать конфиг
export KUBECONFIG=kubeconfig
kubectl get nodes
Shell доступ
# Открыть shell в контейнере k8s-controller
make k8s shell [preset]
Работа с Helm
Helm - это менеджер пакетов для Kubernetes.
Управление релизами
# Установить чарт
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
Управление репозиториями
# Добавить репозиторий
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
# Добавить репозиторий 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).
# Применить манифест из 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
# 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
# Применить
make k8s manifest apply kubernetes ./nginx-deployment.yaml
Управление Ingress
Автоматическое управление /etc/hosts
При создании Ingress ресурсов, их хосты автоматически добавляются в /etc/hosts с меткой #k8s:
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 автоматически добавится:
127.0.0.1 grafana.local #k8s
Доступ к приложению
После установки Ingress и портов, приложение доступно по адресу:
http://grafana.local
Удаление записей
Записи автоматически удаляются при:
- Удалении кластера (
make k8s destroy) - Удалении Ingress манифеста (
make k8s manifest delete)
Проброс портов (Port-forward)
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
Автоматический port-forward
После создания кластера автоматически создаются порты:
- Ingress HTTP:
8081:80 - Ingress HTTPS:
8443:443 - Grafana:
3000:80 - Prometheus:
9090:9090 - Kiali:
20001:20001
Управление вручную
# Создать 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 для своих сервисов
# Подключиться к кластеру
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
# Создать port-forward
kubectl port-forward -n default svc/my-service 8080:80
Мониторинг и логи
Детальный статус кластера
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
Логи контейнера
# Логи k8s-controller
docker logs k8s-controller
# Логи в реальном времени
docker logs -f k8s-controller
Логи кластера
# Логи конкретного 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
Структура пресета
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:
k8s_cluster:
name: my-cluster
nodes: 2
addons:
ingress: true
metrics_server: false
istio: false
kiali: false
prometheus_stack: false
Использование:
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 │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
Компоненты
- k8s-controller - контейнер с инструментами управления
- Kind кластер - Kubernetes кластер в Docker контейнерах
- Port-forward - локальные процессы на хосте
- Ingress - маршрутизация трафика внутрь кластера
Доступ к приложениям
Доступ через Ingress
- Создайте Ingress манифест
- Примените через
make k8s manifest apply - Запись автоматически добавится в
/etc/hosts - Приложение доступно по доменному имени
Доступ через port-forward
Для ClusterIP сервисов:
kubectl port-forward -n namespace svc/service-name 8080:80
Доступ: http://localhost:8080
Доступ внутри кластера
Из другого pod:
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
Включает:
- Описание каждого скрипта
- Принцип работы
- Примеры использования
- Архитектура взаимодействия
- Отладка
Best Practices
1. Используйте пресеты
Не создавайте кластеры вручную, используйте пресеты для консистентности.
2. Очищайте после работы
# После тестирования
make k8s destroy kubernetes
3. Проверяйте статус
# Регулярно проверяйте статус
make k8s status kubernetes
4. Используйте Helm для сложных приложений
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
5. Логируйте изменения
Все изменения в кластере через make k8s автоматически логируются.
Troubleshooting
Кластер не создается
Проблема: kind create cluster завершается с ошибкой
Решение:
# Проверьте Docker
docker ps
# Перезапустите Docker
sudo systemctl restart docker
# Очистите старые кластеры
kind delete cluster --all
Port-forward не работает
Проблема: Невозможно подключиться к порту
Решение:
# Проверьте процессы
make k8s portforward list
# Пересоздайте порты
make k8s portforward recreate
# Проверьте, что порт свободен
lsof -i :3000
kubectl не подключается
Проблема: kubectl get nodes выдает ошибку
Решение:
# Проверьте контейнер
docker ps | grep k8s-controller
# Зайдите в контейнер
make k8s shell kubernetes
# Проверьте кластер
kubectl get nodes
# Если не работает, пересоздайте кластер
make k8s destroy kubernetes
make k8s create kubernetes
Аддоны не устанавливаются
Проблема: Grafana/Prometheus/Kiali не доступны
Решение:
# Проверьте статус кластера
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 не работает
Проблема: Доменные имена не резолвятся
Решение:
# Проверьте /etc/hosts
cat /etc/hosts | grep k8s
# Добавьте вручную
sudo scripts/manage_hosts.py add
# Проверьте Ingress
make k8s shell kubernetes
kubectl get ingress --all-namespaces
Helm чарты не устанавливаются
Проблема: helm install завершается с ошибкой
Решение:
# Проверьте репозитории
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: ...
Решение:
# Проверьте образ
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