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

22 KiB
Raw Permalink Blame History

Kubernetes Kind Кластеры

Автор: Сергей Антропов
Сайт: https://devops.org.ru

Содержание


Описание

Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе Kind для тестирования в изолированной лабораторной среде.

Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.

Требования к системе

Обязательные требования

  1. Docker - для запуска Kind кластеров
  2. Python 3 - для управления port-forward
  3. 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:

4. Удаление кластера

make k8s destroy kubernetes

Команды управления

Создание кластера

# Минимальный кластер (без аддонов)
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

Управление жизненным циклом

# Удаление кластера (с очисткой 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

Доступ к приложениям через Ingress

Для доступа к приложениям по доменным именам нужно вручную добавить записи в /etc/hosts:

# Добавить запись в /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:

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

Управление вручную

# Создать 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                        │  │
│  └──────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘

Компоненты

  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 сервисов:

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 не работает

Проблема: Доменные имена не резолвятся

Решение:

# Проверьте 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 завершается с ошибкой

Решение:

# Проверьте репозитории
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

Контакты


Лицензия

MIT