Files
DevOpsLab/docs/kubernetes-kind.md
Сергей Антропов 4ca882b5f7 docs: добавлены примеры доступа к приложениям и кроссплатформенность
- Добавлен раздел 'Доступ к приложениям'
- Описан доступ через Ingress с примерами hosts файла
- Описан доступ через ClusterIP с ручным port-forward
- Добавлен раздел 'Кроссплатформенность' для macOS и Linux
- Добавлены примеры работы с пользовательскими приложениями
2025-10-26 09:59:41 +03:00

22 KiB
Raw Blame History

Kubernetes Kind Кластеры

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

Описание

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

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

Для работы с Kubernetes кластерами на локальной машине требуется установить:

1. Python 3

Port-forward управляется Python скриптом. Установите Python 3:

macOS:

brew install python3

Ubuntu/Debian:

sudo apt update && sudo apt install -y python3 python3-pip

CentOS/RHEL:

sudo yum install -y python3 python3-pip

2. kubectl

kubectl используется для port-forward и работы с кластером. Установите kubectl:

macOS:

brew install kubectl

Linux:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

Проверка установки:

python3 --version
kubectl version --client

Возможности

  • Создание Kind кластеров с настраиваемым количеством worker-узлов
  • Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
  • Автоматический port-forward для доступа к аддонам
  • Работа с Helm (установка, удаление, обновление чартов)
  • Работа с Kubernetes манифестами
  • Управление Docker контейнерами в лабораторной сети
  • Интеграция с Istio Service Mesh

Команды

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

# Создание минимального кластера (без аддонов)
make k8s create

# Создание кластера с полным набором аддонов
make k8s create kubernetes

# Использование пользовательского пресета
make k8s create my-custom-preset

Что происходит при создании:

  1. Создается Docker контейнер k8s-controller с Kind, kubectl, Helm, Istio CLI
  2. Создаются Docker контейнеры из раздела hosts пресета (если есть)
  3. Создается Kind кластер с настройками из пресета
  4. Устанавливаются аддоны (Ingress, Metrics Server, Istio, Kiali, Prometheus)
  5. Автоматически создается port-forward для доступа к сервисам

Управление кластером

# Удаление кластера (с автоматической очисткой port-forward)
make k8s destroy [preset]

# Остановка кластера (без удаления)
make k8s stop [preset]

# Запуск остановленного кластера
make k8s start [preset]

# Проверка статуса кластера
make k8s status [preset]

# Получение kubeconfig для подключения
make k8s config [preset]

# Открытие shell в контейнере k8s-controller
make k8s shell [preset]

# Просмотр узлов кластера
make k8s nodes [preset]

Port-Forward (Проброс портов)

Port-forward создается автоматически при создании кластера и удаляется автоматически при его уничтожении.

# Создать port-forward для всех сервисов из preset
make k8s portforward create [preset]

# Просмотреть активные port-forward
make k8s portforward list

# Удалить конкретный port-forward по порту
make k8s portforward delete [port]

# Удалить все port-forward
make k8s portforward clear

# Пересоздать все port-forward (очистить + создать)
make k8s portforward recreate

Порты по умолчанию:

  • Prometheus: 9090
  • Grafana: 3000
  • Kiali: 20001
  • Ingress HTTP: 8081
  • Ingress HTTPS: 8443
  • Metrics Server: 4443

Установка аддонов из манифестов

# Установить аддон из URL манифеста
make k8s addon [preset] [manifest_url]

# Пример: установить MetalLB
make k8s addon kubernetes https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

Работа с манифестами

# Применить манифест
make k8s manifest apply [preset] [manifest_url_or_path]

# Удалить ресурсы из манифеста
make k8s manifest delete [preset] [manifest_url_or_path]

# Обновить манифест (apply с --force)
make k8s manifest update [preset] [manifest_url_or_path]

# Примеры:
make k8s manifest apply kubernetes https://example.com/app.yaml
make k8s manifest apply kubernetes ./manifests/my-app.yaml
make k8s manifest delete kubernetes ./manifests/my-app.yaml

Работа с Helm

Установка и управление релизами

# Установить Helm chart
make k8s helm apply [preset] [release_name] [chart_name]

# Удалить Helm release
make k8s helm delete [preset] [release_name]

# Обновить Helm release
make k8s helm update [preset] [release_name] [chart_name]

# Откатить Helm release к предыдущей версии
make k8s helm rollback [preset] [release_name]

# Список всех Helm releases
make k8s helm list [preset]

# Статус конкретного Helm release
make k8s helm status [preset] [release_name]

# Примеры:
make k8s helm apply kubernetes my-app bitnami/nginx
make k8s helm status kubernetes my-app
make k8s helm list kubernetes
make k8s helm rollback kubernetes my-app

Управление Helm репозиториями

# Добавить Helm репозиторий
make k8s helmrepo add [preset] [repo_name] [repo_url]

# Список Helm репозиториев
make k8s helmrepo list [preset]

# Удалить Helm репозиторий
make k8s helmrepo delete [preset] [repo_name]

# Обновить Helm репозитории
make k8s helmrepo update [preset]

# Список пакетов (charts) в репозитории
make k8s helmrepo packages [preset] [repo_name]

# Примеры:
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helmrepo list kubernetes
make k8s helmrepo packages kubernetes bitnami
make k8s helmrepo update kubernetes

Конфигурация

Пресеты Kubernetes хранятся в molecule/presets/k8s/

Минимальный кластер (k8s-minimal.yml)

kind_clusters:
  - name: minimal
    workers: 0  # Только control-plane узел
    api_port: 6443

Полный кластер с аддонами (kubernetes.yml)

kind_clusters:
  - name: lab
    workers: 2
    api_port: 6443
    addons:
      ingress_nginx: true
      metrics_server: true
      istio: true
      kiali: true
      prometheus_stack: true
    # Порты для port-forward
    addon_ports:
      ingress_http: 8081
      ingress_https: 8443
      prometheus: 9090
      grafana: 3000
      kiali: 20001
      metrics_server: 4443

Доступ к аддонам

После создания кластера с аддонами, они доступны через автоматический port-forward:

Prometheus

# Web UI доступна на порту 9090
http://localhost:9090

Grafana

# Web UI доступна на порту 3000
http://localhost:3000

# Пароль администратора
kubectl get secret -n monitoring monitoring-grafana \
  -o jsonpath="{.data.admin-password}" | base64 -d

# Логин: admin
# Пароль: (получен выше)

Kiali

# Web UI доступна на порту 20001
http://localhost:20001

# Аутентификация: anonymous (отключена по умолчанию)

Istio Ingress

# HTTP доступен на порту 8081
http://localhost:8081

# HTTPS доступен на порту 8443
https://localhost:8443

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

Доступ через Ingress

Если ваше приложение использует Ingress с доменным именем:

  1. Создайте манифест с Ingress:
# my-app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
  - host: my-app.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80
  1. Примените манифест:
make k8s manifest apply kubernetes my-app-ingress.yaml
  1. Добавьте домен в hosts файл:

macOS/Linux:

echo "127.0.0.1 my-app.local" | sudo tee -a /etc/hosts
  1. Откройте приложение через Ingress порт:
# HTTP через Ingress
curl http://my-app.local:8081
# или в браузере
open http://my-app.local:8081

# HTTPS через Ingress
curl -k https://my-app.local:8443

Важно: Используйте порт Ingress (8081 для HTTP, 8443 для HTTPS) вместе с доменным именем!

Доступ через ClusterIP (port-forward)

Если ваше приложение имеет сервис с типом ClusterIP:

  1. Установите приложение (например, через Helm):
make k8s helm apply kubernetes my-app bitnami/nginx
  1. Узнайте имя сервиса:
# Откройте shell в контейнере
make k8s shell kubernetes

# Посмотрите сервисы
kubectl get svc -A

# Выход из контейнера
exit
  1. Создайте port-forward вручную:
# Экспортируйте kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig

# Создайте port-forward
# Синтаксис: kubectl port-forward -n <namespace> svc/<service-name> <local-port>:<service-port>
kubectl port-forward -n default svc/my-app-service 8080:80
  1. Откройте приложение:
# Доступно на localhost:8080
curl http://localhost:8080
open http://localhost:8080

Примечание: Port-forward запустится в фоне. Для остановки нажмите Ctrl+C или найдите процесс и завершите его:

# Найти процесс port-forward
ps aux | grep "kubectl port-forward"

# Завершить процесс (замените PID)
kill <PID>

Автоматический port-forward для пользовательских приложений

Если вы хотите, чтобы port-forward создавался автоматически, добавьте порт в пресет:

# molecule/presets/k8s/kubernetes.yml
addon_ports:
  # ... существующие порты аддонов
  my_app: 8080  # Ваш порт

Затем в коде scripts/portforward.py добавьте логику для этих портов. Однако, это требует знания имени сервиса и namespace заранее.

Рекомендация: Для пользовательских приложений используйте ручной port-forward или Ingress.

Примеры использования

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

# 1. Создать кластер с аддонами (port-forward создастся автоматически!)
make k8s create kubernetes

# 2. Проверить статус
make k8s status kubernetes

# 3. Проверить port-forward
make k8s portforward list

# 4. Получить kubeconfig
make k8s config kubernetes

# 5. Использовать kubeconfig
export KUBECONFIG=kubeconfig
kubectl get nodes
kubectl get pods -A

# 6. Открыть Grafana в браузере
open http://localhost:3000
# Логин: admin
# Пароль: (получить командой выше)

Работа с Helm

# 1. Добавить репозиторий
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami

# 2. Посмотреть доступные charts
make k8s helmrepo packages kubernetes bitnami

# 3. Установить nginx
make k8s helm apply kubernetes nginx bitnami/nginx

# 4. Проверить статус
make k8s helm status kubernetes nginx

# 5. Посмотреть все релизы
make k8s helm list kubernetes

# 6. Откатить релиз
make k8s helm rollback kubernetes nginx

# 7. Удалить релиз
make k8s helm delete kubernetes nginx

Работа с манифестами

# 1. Применить манифест из URL
make k8s manifest apply kubernetes https://k8s.io/examples/application/deployment.yaml

# 2. Применить манифест из файла
make k8s manifest apply kubernetes ./manifests/my-app.yaml

# 3. Обновить манифест
make k8s manifest update kubernetes ./manifests/my-app.yaml

# 4. Удалить ресурсы
make k8s manifest delete kubernetes ./manifests/my-app.yaml

Управление портами

# Если нужно пересоздать port-forward
make k8s portforward recreate

# Посмотреть активные port-forward
make k8s portforward list

# Удалить конкретный порт (например, 3000 для Grafana)
make k8s portforward delete 3000

# Удалить все port-forward
make k8s portforward clear

Полное удаление кластера

# Удалит кластер, контейнеры и все port-forward
make k8s destroy kubernetes

Работа внутри контейнера

# Открыть shell в контейнере k8s-controller
make k8s shell kubernetes

# Внутри контейнера:
kind get clusters
kubectl --context kind-lab get nodes
istioctl --context kind-lab proxy-status
kubectl --context kind-lab get pods -n monitoring
helm list --all-namespaces

Архитектура

┌─────────────────────────────────────────────────────────┐
│                   Docker Network: kind                  │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │         Kind Cluster: "lab"                      │  │
│  │  ┌──────────────┐  ┌──────────────┐             │  │
│  │  │ Control Plane│  │   Worker 1   │             │  │
│  │  │ Port 6443    │  │              │             │  │
│  │  └──────────────┘  └──────────────┘             │  │
│  │  ┌──────────────┐                               │  │
│  │  │   Worker 2   │                               │  │
│  │  └──────────────┘                               │  │
│  │                                                 │  │
│  │  ClusterIP Services:                            │  │
│  │  - Prometheus :9090                             │  │
│  │  - Grafana    :3000                             │  │
│  │  - Kiali      :20001                            │  │
│  │  - Ingress    :80 (HTTP), :443 (HTTPS)         │  │
│  └──────────────────────────────────────────────────┘  │
│                                                         │
│  ┌──────────────┐                                      │
│  │ k8s-controller│ ← kubectl port-forward             │
│  │ (Kind, Helm) │                                      │
│  └──────────────┘                                      │
└─────────────────────────────────────────────────────────┘
                              │
                              │ kubectl port-forward
                              │ (localhost)
                              ▼
┌─────────────────────────────────────────────────────────┐
│                  Локальная машина                       │
│                                                         │
│  • localhost:9090 → Prometheus                          │
│  • localhost:3000 → Grafana                             │
│  • localhost:20001 → Kiali                              │
│  • localhost:8081 → Ingress HTTP                        │
│  • localhost:8443 → Ingress HTTPS                       │
└─────────────────────────────────────────────────────────┘

Настройка портов аддонов

Вы можете настроить порты для port-forward в пресете:

kind_clusters:
  - name: lab
    workers: 2
    addons:
      prometheus_stack: true
      kiali: true
    addon_ports:
      prometheus: 9090   # Port-forward для Prometheus
      grafana: 3000      # Port-forward для Grafana
      kiali: 20001       # Port-forward для Kiali
      ingress_http: 8081 # Port-forward для Ingress HTTP
      ingress_https: 8443 # Port-forward для Ingress HTTPS
      metrics_server: 4443 # Port-forward для Metrics Server

Кроссплатформенность

Port-forward работает одинаково на macOS и Linux:

macOS

# Проверка установки
python3 --version
kubectl version --client

# Работа с port-forward
make k8s portforward create
make k8s portforward list

Linux

# Проверка установки
python3 --version
kubectl version --client

# Работа с port-forward (то же самое!)
make k8s portforward create
make k8s portforward list

Важно: Port-forward работает идентично на обеих платформах, так как использует стандартные утилиты:

  • kubectl (кроссплатформенный)
  • Python 3 (кроссплатформенный)
  • kubectl port-forward команда (кроссплатформенная)

Best Practices

  1. Порты: Port-forward создается автоматически при создании кластера - не нужно делать это вручную
  2. Локальные зависимости: Установите Python 3 и kubectl на локальной машине для работы port-forward
  3. Минимальные ресурсы: Для быстрого тестирования используйте workers: 0 (только control-plane)
  4. Production-like: Для реалистичных тестов используйте workers: 2-3
  5. Аддоны: Включайте только необходимые аддоны для уменьшения времени создания
  6. Удаление: Используйте make k8s destroy - он автоматически очистит port-forward
  7. Helm: Используйте официальные Helm charts из проверенных репозиториев
  8. Изоляция: Каждый preset может иметь свой уникальный кластер с разными настройками
  9. Ingress vs ClusterIP: Используйте Ingress для доступа по доменным именам, ClusterIP + port-forward для прямого доступа к сервисам

Troubleshooting

Port-forward не работает

# Проверить, что порт не занят
lsof -i :3000

# Пересоздать port-forward
make k8s portforward recreate

# Проверить активные port-forward
make k8s portforward list

# Проверить, что kubectl установлен локально
kubectl version --client

Кластер не создается

# Проверить логи
docker logs k8s-controller

# Проверить доступное место на диске
df -h

# Проверить Docker ресурсы
docker system df

Проблемы с аддонами

# Проверить статус подов
kubectl get pods -A

# Проверить сервисы
kubectl get svc -A

# Проверить логи
kubectl logs -n monitoring -l app.kubernetes.io/name=grafana

Проблемы с Istio

# Открыть shell в контейнере
make k8s shell kubernetes

# Внутри контейнера:
istioctl proxy-status --context kind-lab
istioctl proxy-config --context kind-lab

Python не установлен

# macOS
brew install python3

# Ubuntu/Debian
sudo apt update && sudo apt install -y python3 python3-pip

# Проверка
python3 --version

Дополнительные ресурсы