diff --git a/docs/kubernetes-kind.md b/docs/kubernetes-kind.md index 87b7b95..3b86b93 100644 --- a/docs/kubernetes-kind.md +++ b/docs/kubernetes-kind.md @@ -7,17 +7,60 @@ Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде. +## Требования к системе + +Для работы с Kubernetes кластерами **на локальной машине** требуется установить: + +### 1. Python 3 + +Port-forward управляется Python скриптом. Установите Python 3: + +**macOS:** +```bash +brew install python3 +``` + +**Ubuntu/Debian:** +```bash +sudo apt update && sudo apt install -y python3 python3-pip +``` + +**CentOS/RHEL:** +```bash +sudo yum install -y python3 python3-pip +``` + +### 2. kubectl + +`kubectl` используется для port-forward и работы с кластером. Установите kubectl: + +**macOS:** +```bash +brew install kubectl +``` + +**Linux:** +```bash +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/ +``` + +**Проверка установки:** +```bash +python3 --version +kubectl version --client +``` + ## Возможности -- Создание Kind кластеров с настраиваемым количеством worker-узлов -- Автоматическая установка аддонов: - - Ingress NGINX Controller - - Metrics Server - - Istio Service Mesh - - Kiali (визуализация Istio) - - Prometheus Stack (Prometheus + Grafana) -- Настройка портов для внешнего доступа к аддонам -- Интеграция с Docker контейнерами в одной лабораторной сети +- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов +- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack) +- ✅ **Автоматический port-forward** для доступа к аддонам +- ✅ Работа с Helm (установка, удаление, обновление чартов) +- ✅ Работа с Kubernetes манифестами +- ✅ Управление Docker контейнерами в лабораторной сети +- ✅ Интеграция с Istio Service Mesh ## Команды @@ -34,26 +77,148 @@ 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** для доступа к сервисам + ### Управление кластером ```bash -# Удаление кластера +# Удаление кластера (с автоматической очисткой port-forward) make k8s destroy [preset] # Остановка кластера (без удаления) -make k8s stop [cluster] +make k8s stop [preset] # Запуск остановленного кластера -make k8s start [cluster] +make k8s start [preset] # Проверка статуса кластера -make k8s status [cluster] +make k8s status [preset] # Получение kubeconfig для подключения -make k8s config [cluster] +make k8s config [preset] -# Открытие shell в контейнере -make k8s shell +# Открытие shell в контейнере k8s-controller +make k8s shell [preset] + +# Просмотр узлов кластера +make k8s nodes [preset] +``` + +### Port-Forward (Проброс портов) + +Port-forward **создается автоматически** при создании кластера и **удаляется автоматически** при его уничтожении. + +```bash +# Создать 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 + +### Установка аддонов из манифестов + +```bash +# Установить аддон из 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 +``` + +### Работа с манифестами + +```bash +# Применить манифест +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 + +#### Установка и управление релизами + +```bash +# Установить 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 репозиториями + +```bash +# Добавить 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 ``` ## Конфигурация @@ -82,18 +247,19 @@ kind_clusters: istio: true kiali: true prometheus_stack: true - ingress_host_http_port: 8081 - ingress_host_https_port: 8443 - # Порты для внешнего доступа к аддонам + # Порты для port-forward addon_ports: + ingress_http: 8081 + ingress_https: 8443 prometheus: 9090 grafana: 3000 kiali: 20001 + metrics_server: 4443 ``` ## Доступ к аддонам -После создания кластера с аддонами, они доступны на следующих портах: +После создания кластера с аддонами, они доступны через **автоматический port-forward**: ### Prometheus ```bash @@ -136,68 +302,112 @@ https://localhost:8443 ### Создание и настройка кластера ```bash -# 1. Создать кластер с аддонами +# 1. Создать кластер с аддонами (port-forward создастся автоматически!) make k8s create kubernetes # 2. Проверить статус -make k8s status +make k8s status kubernetes -# 3. Получить kubeconfig -make k8s config lab +# 3. Проверить port-forward +make k8s portforward list -# 4. Использовать kubeconfig +# 4. Получить kubeconfig +make k8s config kubernetes + +# 5. Использовать kubeconfig export KUBECONFIG=kubeconfig kubectl get nodes kubectl get pods -A -# 5. Открыть Grafana в браузере +# 6. Открыть Grafana в браузере open http://localhost:3000 # Логин: admin # Пароль: (получить командой выше) ``` -### Управление кластером +### Работа с Helm ```bash -# Остановить кластер (без удаления) -make k8s stop lab +# 1. Добавить репозиторий +make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami -# Запустить остановленный кластер -make k8s start lab +# 2. Посмотреть доступные charts +make k8s helmrepo packages kubernetes bitnami -# Проверить конкретный кластер -make k8s status lab +# 3. Установить nginx +make k8s helm apply kubernetes nginx bitnami/nginx -# Получить kubeconfig для конкретного кластера -make k8s config lab +# 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 +``` + +### Работа с манифестами + +```bash +# 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 +``` + +### Управление портами + +```bash +# Если нужно пересоздать 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 +``` + +### Полное удаление кластера + +```bash +# Удалит кластер, контейнеры и все port-forward make k8s destroy kubernetes ``` ### Работа внутри контейнера ```bash -# Открыть shell в контейнере ansible-controller -make k8s shell +# Открыть 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: labnet │ -│ │ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │ Ubuntu22 │ │ Debian12 │ │ Ansible │ │ -│ │ Container │ │ Container │ │ Controller │ │ -│ └──────────────┘ └──────────────┘ └──────────────┘ │ +│ Docker Network: kind │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Kind Cluster: "lab" │ │ @@ -209,19 +419,36 @@ kubectl --context kind-lab get pods -n monitoring │ │ │ Worker 2 │ │ │ │ │ └──────────────┘ │ │ │ │ │ │ -│ │ NodePort Services: │ │ +│ │ ClusterIP Services: │ │ │ │ - Prometheus :9090 │ │ │ │ - Grafana :3000 │ │ │ │ - Kiali :20001 │ │ -│ │ - Ingress :8081 (HTTP), :8443 (HTTPS) │ │ +│ │ - 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 в пресете: ```yaml kind_clusters: @@ -231,26 +458,48 @@ kind_clusters: prometheus_stack: true kiali: true addon_ports: - prometheus: 9090 # Prometheus UI - grafana: 3000 # Grafana UI - kiali: 20001 # Kiali UI + 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 ``` ## Best Practices -1. **Минимальные ресурсы:** Для быстрого тестирования используйте `workers: 0` (только control-plane) -2. **Production-like:** Для реалистичных тестов используйте `workers: 2-3` -3. **Аддоны:** Включайте только необходимые аддоны для уменьшения времени создания -4. **Изоляция:** Каждый preset может иметь свой уникальный кластер с разными настройками -5. **Порты:** Используйте разные порты для разных кластеров, если запускаете несколько +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 может иметь свой уникальный кластер с разными настройками ## Troubleshooting +### Port-forward не работает + +```bash +# Проверить, что порт не занят +lsof -i :3000 + +# Пересоздать port-forward +make k8s portforward recreate + +# Проверить активные port-forward +make k8s portforward list + +# Проверить, что kubectl установлен локально +kubectl version --client +``` + ### Кластер не создается ```bash # Проверить логи -docker logs ansible-controller +docker logs k8s-controller # Проверить доступное место на диске df -h @@ -268,25 +517,32 @@ kubectl get pods -A # Проверить сервисы kubectl get svc -A -# Проверить порты -kubectl get svc -n monitoring +# Проверить логи +kubectl logs -n monitoring -l app.kubernetes.io/name=grafana ``` ### Проблемы с Istio ```bash -# Переустановить Istio -istioctl uninstall -y --context kind-lab -istioctl install -y --set profile=demo --context kind-lab +# Открыть shell в контейнере +make k8s shell kubernetes + +# Внутри контейнера: +istioctl proxy-status --context kind-lab +istioctl proxy-config --context kind-lab ``` -### Проблемы с Prometheus Stack +### Python не установлен ```bash -# Переустановить -helm uninstall monitoring -n monitoring -helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \ - --namespace monitoring --kube-context kind-lab +# macOS +brew install python3 + +# Ubuntu/Debian +sudo apt update && sudo apt install -y python3 python3-pip + +# Проверка +python3 --version ``` ## Дополнительные ресурсы @@ -295,3 +551,4 @@ helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \ - [Istio Documentation](https://istio.io/latest/docs/) - [Kiali Documentation](https://kiali.io/documentation/) - [Prometheus Operator](https://prometheus-operator.dev/) +- [Helm Documentation](https://helm.sh/docs/)