- Добавлен раздел 'Доступ к приложениям' - Описан доступ через Ingress с примерами hosts файла - Описан доступ через ClusterIP с ручным port-forward - Добавлен раздел 'Кроссплатформенность' для macOS и Linux - Добавлены примеры работы с пользовательскими приложениями
22 KiB
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
Что происходит при создании:
- Создается Docker контейнер
k8s-controllerс Kind, kubectl, Helm, Istio CLI - Создаются Docker контейнеры из раздела
hostsпресета (если есть) - Создается Kind кластер с настройками из пресета
- Устанавливаются аддоны (Ingress, Metrics Server, Istio, Kiali, Prometheus)
- Автоматически создается 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 с доменным именем:
- Создайте манифест с 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
- Примените манифест:
make k8s manifest apply kubernetes my-app-ingress.yaml
- Добавьте домен в hosts файл:
macOS/Linux:
echo "127.0.0.1 my-app.local" | sudo tee -a /etc/hosts
- Откройте приложение через 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:
- Установите приложение (например, через Helm):
make k8s helm apply kubernetes my-app bitnami/nginx
- Узнайте имя сервиса:
# Откройте shell в контейнере
make k8s shell kubernetes
# Посмотрите сервисы
kubectl get svc -A
# Выход из контейнера
exit
- Создайте 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
- Откройте приложение:
# Доступно на 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
- Порты: Port-forward создается автоматически при создании кластера - не нужно делать это вручную
- Локальные зависимости: Установите Python 3 и kubectl на локальной машине для работы port-forward
- Минимальные ресурсы: Для быстрого тестирования используйте
workers: 0(только control-plane) - Production-like: Для реалистичных тестов используйте
workers: 2-3 - Аддоны: Включайте только необходимые аддоны для уменьшения времени создания
- Удаление: Используйте
make k8s destroy- он автоматически очистит port-forward - Helm: Используйте официальные Helm charts из проверенных репозиториев
- Изоляция: Каждый preset может иметь свой уникальный кластер с разными настройками
- 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