# Kubernetes Kind Кластеры **Автор:** Сергей Антропов **Сайт:** https://devops.org.ru ## Описание Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде. ## Возможности - Создание Kind кластеров с настраиваемым количеством worker-узлов - Автоматическая установка аддонов: - Ingress NGINX Controller - Metrics Server - Istio Service Mesh - Kiali (визуализация Istio) - Prometheus Stack (Prometheus + Grafana) - Настройка портов для внешнего доступа к аддонам - Интеграция с Docker контейнерами в одной лабораторной сети ## Команды ### Создание кластера ```bash # Создание минимального кластера (без аддонов) make k8s create # Создание кластера с полным набором аддонов make k8s create kubernetes # Использование пользовательского пресета make k8s create my-custom-preset ``` ### Управление кластером ```bash # Удаление кластера make k8s destroy [preset] # Остановка кластера (без удаления) make k8s stop [cluster] # Запуск остановленного кластера make k8s start [cluster] # Проверка статуса кластера make k8s status [cluster] # Получение kubeconfig для подключения make k8s config [cluster] # Открытие shell в контейнере make k8s shell ``` ## Конфигурация ### Пресеты Kubernetes хранятся в `molecule/presets/k8s/` #### Минимальный кластер (`k8s-minimal.yml`) ```yaml kind_clusters: - name: minimal workers: 0 # Только control-plane узел api_port: 6443 ``` #### Полный кластер с аддонами (`kubernetes.yml`) ```yaml kind_clusters: - name: lab workers: 2 api_port: 6443 addons: ingress_nginx: true metrics_server: true istio: true kiali: true prometheus_stack: true ingress_host_http_port: 8081 ingress_host_https_port: 8443 # Порты для внешнего доступа к аддонам addon_ports: prometheus: 9090 grafana: 3000 kiali: 20001 ``` ## Доступ к аддонам После создания кластера с аддонами, они доступны на следующих портах: ### Prometheus ```bash # Web UI доступна на порту 9090 http://localhost:9090 ``` ### Grafana ```bash # Web UI доступна на порту 3000 http://localhost:3000 # Пароль администратора kubectl get secret -n monitoring monitoring-grafana \ -o jsonpath="{.data.admin-password}" | base64 -d # Логин: admin # Пароль: (получен выше) ``` ### Kiali ```bash # Web UI доступна на порту 20001 http://localhost:20001 # Аутентификация: anonymous (отключена по умолчанию) ``` ### Istio Ingress ```bash # HTTP доступен на порту 8081 http://localhost:8081 # HTTPS доступен на порту 8443 https://localhost:8443 ``` ## Примеры использования ### Создание и настройка кластера ```bash # 1. Создать кластер с аддонами make k8s create kubernetes # 2. Проверить статус make k8s status # 3. Получить kubeconfig make k8s config lab # 4. Использовать kubeconfig export KUBECONFIG=kubeconfig kubectl get nodes kubectl get pods -A # 5. Открыть Grafana в браузере open http://localhost:3000 # Логин: admin # Пароль: (получить командой выше) ``` ### Управление кластером ```bash # Остановить кластер (без удаления) make k8s stop lab # Запустить остановленный кластер make k8s start lab # Проверить конкретный кластер make k8s status lab # Получить kubeconfig для конкретного кластера make k8s config lab # Удалить кластер make k8s destroy kubernetes ``` ### Работа внутри контейнера ```bash # Открыть shell в контейнере ansible-controller make k8s shell # Внутри контейнера: kind get clusters kubectl --context kind-lab get nodes istioctl --context kind-lab proxy-status kubectl --context kind-lab get pods -n monitoring ``` ## Архитектура ``` ┌─────────────────────────────────────────────────────────┐ │ Docker Network: labnet │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Ubuntu22 │ │ Debian12 │ │ Ansible │ │ │ │ Container │ │ Container │ │ Controller │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Kind Cluster: "lab" │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ Control Plane│ │ Worker 1 │ │ │ │ │ │ Port 6443 │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────┐ │ │ │ │ │ Worker 2 │ │ │ │ │ └──────────────┘ │ │ │ │ │ │ │ │ NodePort Services: │ │ │ │ - Prometheus :9090 │ │ │ │ - Grafana :3000 │ │ │ │ - Kiali :20001 │ │ │ │ - Ingress :8081 (HTTP), :8443 (HTTPS) │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ ``` ## Настройка портов аддонов Вы можете настроить порты для внешнего доступа в пресете: ```yaml kind_clusters: - name: lab workers: 2 addons: prometheus_stack: true kiali: true addon_ports: prometheus: 9090 # Prometheus UI grafana: 3000 # Grafana UI kiali: 20001 # Kiali UI ``` ## Best Practices 1. **Минимальные ресурсы:** Для быстрого тестирования используйте `workers: 0` (только control-plane) 2. **Production-like:** Для реалистичных тестов используйте `workers: 2-3` 3. **Аддоны:** Включайте только необходимые аддоны для уменьшения времени создания 4. **Изоляция:** Каждый preset может иметь свой уникальный кластер с разными настройками 5. **Порты:** Используйте разные порты для разных кластеров, если запускаете несколько ## Troubleshooting ### Кластер не создается ```bash # Проверить логи docker logs ansible-controller # Проверить доступное место на диске df -h # Проверить Docker ресурсы docker system df ``` ### Проблемы с аддонами ```bash # Проверить статус подов kubectl get pods -A # Проверить сервисы kubectl get svc -A # Проверить порты kubectl get svc -n monitoring ``` ### Проблемы с Istio ```bash # Переустановить Istio istioctl uninstall -y --context kind-lab istioctl install -y --set profile=demo --context kind-lab ``` ### Проблемы с Prometheus Stack ```bash # Переустановить helm uninstall monitoring -n monitoring helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \ --namespace monitoring --kube-context kind-lab ``` ## Дополнительные ресурсы - [Kind Documentation](https://kind.sigs.k8s.io/docs/) - [Istio Documentation](https://istio.io/latest/docs/) - [Kiali Documentation](https://kiali.io/documentation/) - [Prometheus Operator](https://prometheus-operator.dev/)