Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Создан новый Docker образ k8s для работы с Kind, kubectl, Helm, Istio CLI - Добавлены команды make k8s: create, destroy, stop, start, status, config, nodes, addon, shell - Добавлена поддержка пресетов Kubernetes в molecule/presets/k8s/ - Создан скрипт create_k8s_cluster.py для автоматического создания кластеров и установки аддонов - Добавлена документация docs/kubernetes-kind.md - Команды kubectl выполняются внутри контейнера k8s, не требуют локальной установки
298 lines
9.7 KiB
Markdown
298 lines
9.7 KiB
Markdown
# 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/)
|