Merge k8s в main: добавлена поддержка Kubernetes Kind кластеров
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🐳 Обзор
|
||||
|
||||
@@ -13,7 +13,16 @@ DevOpsLab использует предварительно собранные D
|
||||
```
|
||||
dockerfiles/
|
||||
├── ansible-controller/ # Ansible контроллер
|
||||
├── alt9/ # ALT Linux P9
|
||||
│ ├── Dockerfile
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── requirements.txt
|
||||
│ └── requirements.yml
|
||||
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
|
||||
│ └── Dockerfile
|
||||
├── k8s-portforward/ # Port-forward контейнер (устаревший)
|
||||
│ ├── Dockerfile
|
||||
│ └── portforward-container.py
|
||||
├── alt-linux/ # ALT Linux P9
|
||||
├── astra-linux/ # Astra Linux 1.7
|
||||
├── redos/ # RED OS 9
|
||||
├── rhel/ # Red Hat Enterprise Linux 8
|
||||
@@ -28,7 +37,8 @@ dockerfiles/
|
||||
├── debian9/ # Debian 9 Stretch
|
||||
├── debian10/ # Debian 10 Buster
|
||||
├── debian11/ # Debian 11 Bullseye
|
||||
└── debian12/ # Debian 12 Bookworm
|
||||
├── debian12/ # Debian 12 Bookworm
|
||||
└── README.md # Документация по Dockerfiles
|
||||
```
|
||||
|
||||
## 🚀 Доступные образы
|
||||
@@ -44,13 +54,12 @@ Ansible контроллер с предустановленными колле
|
||||
#### Компоненты:
|
||||
- Ansible Core с последними коллекциями
|
||||
- Docker CLI для работы с контейнерами
|
||||
- kubectl для управления Kubernetes
|
||||
- Helm для управления пакетами Kubernetes
|
||||
- Kind для локального Kubernetes
|
||||
- yq для работы с YAML
|
||||
- jq для работы с JSON
|
||||
- Molecule для тестирования ролей
|
||||
|
||||
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
|
||||
|
||||
#### Предустановленные коллекции:
|
||||
```yaml
|
||||
collections:
|
||||
@@ -82,6 +91,41 @@ docker run --rm \
|
||||
ansible-playbook site.yml
|
||||
```
|
||||
|
||||
### k8s
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Теги:** `inecs/ansible-lab:k8s-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Kubernetes контроллер с инструментами для работы с Kubernetes, Helm, Istio и Kind кластерами.
|
||||
|
||||
#### Компоненты:
|
||||
- **Docker CLI** (20.10.24) для работы с контейнерами
|
||||
- **kubectl** (1.34.1) для управления Kubernetes
|
||||
- **Helm** (latest) для управления пакетами Kubernetes
|
||||
- **Kind** (0.30.0) для локальных Kubernetes кластеров
|
||||
- **Istio CLI** (1.22.1) для управления Service Mesh
|
||||
- Python 3 с модулем yaml для выполнения скриптов
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
# Создание Kind кластера
|
||||
docker run -it --rm \
|
||||
--name k8s-controller \
|
||||
--network kind \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:rw \
|
||||
inecs/ansible-lab:k8s-latest \
|
||||
kind create cluster --name lab
|
||||
|
||||
# Выполнение kubectl команд
|
||||
docker exec k8s-controller kubectl get nodes
|
||||
|
||||
# Установка Helm релиза
|
||||
docker exec k8s-controller helm install prometheus prometheus-community/kube-prometheus-stack
|
||||
```
|
||||
|
||||
**Примечание:** Этот образ используется автоматически при выполнении `make k8s` команд. Контейнер запускается с именем `k8s-controller` и подключен к Docker daemon хоста.
|
||||
|
||||
### Ubuntu
|
||||
|
||||
**Базовые образы:**
|
||||
@@ -194,7 +238,7 @@ Red Hat Enterprise Linux 8 с systemd.
|
||||
### ALT Linux
|
||||
|
||||
**Базовый образ:** `altlinux/p9`
|
||||
**Тег:** `inecs/ansible-lab:alt9-latest`
|
||||
**Тег:** `inecs/ansible-lab:alt-linux-latest`
|
||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
||||
|
||||
ALT Linux P9 с systemd.
|
||||
@@ -348,18 +392,19 @@ docker run -d --privileged \
|
||||
|
||||
## 📋 Матрица совместимости
|
||||
|
||||
| Образ | Платформы | systemd | Docker | Python 3 |
|
||||
|-------|-----------|---------|--------|----------|
|
||||
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| alma | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| rocky | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| rhel | amd64, arm64 | ✅ | ✅ | ✅ |
|
||||
| alt9 | amd64 | ✅ | ✅ | ✅ |
|
||||
| astra-linux | amd64 | ✅ | ✅ | ✅ |
|
||||
| redos | amd64 | ✅ | ✅ | ✅ |
|
||||
| Образ | Платформы | systemd | Docker | Python 3 | Kubernetes Tools |
|
||||
|-------|-----------|---------|--------|----------|------------------|
|
||||
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| k8s | amd64, arm64 | ❌ | ✅ | ✅ | ✅ (kubectl, Helm, Kind, Istio) |
|
||||
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| alt-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| astra-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| redos | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
|
||||
## 🛠️ Управление образами
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🚀 Установка и настройка
|
||||
|
||||
|
||||
110
docs/k8s-ingress-fix.md
Normal file
110
docs/k8s-ingress-fix.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# Исправление проблемы с Ingress
|
||||
|
||||
## Проблема
|
||||
|
||||
После создания Kubernetes кластера Ingress ресурсы не доступны по доменным именам.
|
||||
|
||||
## Причина
|
||||
|
||||
1. **extraPortMappings не добавлялись в конфигурацию Kind** - порты 80 и 443 не пробрасывались на host
|
||||
2. **Записи в /etc/hosts не добавлялись автоматически** при применении манифестов
|
||||
|
||||
## Решение
|
||||
|
||||
### Вариант 1: Быстрое исправление (без пересоздания кластера)
|
||||
|
||||
1. **Добавьте запись в `/etc/hosts` вручную:**
|
||||
|
||||
```bash
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
```
|
||||
|
||||
2. **Создайте port-forward для Ingress напрямую:**
|
||||
|
||||
```bash
|
||||
# Подключитесь к кластеру
|
||||
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||
|
||||
# Замените 0.0.0.0 на localhost в kubeconfig
|
||||
export KUBECONFIG=$(echo "$KUBECONFIG" | sed 's/0\.0\.0\.0:6443/localhost:6443/g' > /tmp/kubeconfig-local.yaml && echo /tmp/kubeconfig-local.yaml)
|
||||
|
||||
# Создайте port-forward для Ingress HTTP
|
||||
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8081:80 &
|
||||
|
||||
# Проверьте доступность
|
||||
curl -H "Host: grafana.local" http://localhost:8081
|
||||
```
|
||||
|
||||
3. **Откройте в браузере:**
|
||||
|
||||
```
|
||||
http://grafana.local:8081
|
||||
```
|
||||
|
||||
### Вариант 2: Пересоздание кластера (рекомендуется)
|
||||
|
||||
Исправления уже внесены в код. Просто пересоздайте кластер:
|
||||
|
||||
```bash
|
||||
# Удалите старый кластер
|
||||
make k8s destroy kubernetes
|
||||
|
||||
# Создайте новый (с исправлениями)
|
||||
make k8s create kubernetes
|
||||
|
||||
# Примените манифест с Ingress
|
||||
make k8s manifest apply kubernetes manifests/test-grafana-ingress.yaml
|
||||
|
||||
# Запись в /etc/hosts добавится автоматически
|
||||
# Проверьте
|
||||
cat /etc/hosts | grep k8s
|
||||
|
||||
# Откройте в браузере
|
||||
open http://grafana.local:8081
|
||||
```
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
# 1. Проверьте Ingress
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get ingress --all-namespaces
|
||||
|
||||
# 2. Проверьте ports control-plane
|
||||
docker port lab-control-plane
|
||||
|
||||
# Должны быть:
|
||||
# 6443/tcp -> 0.0.0.0:6443
|
||||
# 80/tcp -> 0.0.0.0:8081 <- после исправления
|
||||
# 443/tcp -> 0.0.0.0:8443 <- после исправления
|
||||
|
||||
# 3. Проверьте доступность
|
||||
curl -H "Host: grafana.local" http://localhost:8081
|
||||
```
|
||||
|
||||
## Что было исправлено
|
||||
|
||||
1. В `scripts/create_k8s_cluster.py` исправлена логика добавления `extraPortMappings` в конфигурацию Kind
|
||||
2. Порты 80 и 443 теперь правильно пробрасываются на host (8081 и 8443)
|
||||
3. Манифест Ingress можно применить и автоматически добавить запись в `/etc/hosts`
|
||||
|
||||
## Дополнительно
|
||||
|
||||
Если Ingress всё ещё не работает:
|
||||
|
||||
1. **Проверьте статус подов Ingress Controller:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get pods -n ingress-nginx
|
||||
```
|
||||
|
||||
2. **Проверьте логи Ingress Controller:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify logs -n ingress-nginx -l app.kubernetes.io/component=controller
|
||||
```
|
||||
|
||||
3. **Проверьте события:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get events -n monitoring
|
||||
```
|
||||
232
docs/k8s-scripts.md
Normal file
232
docs/k8s-scripts.md
Normal file
@@ -0,0 +1,232 @@
|
||||
# Скрипты управления Kubernetes
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
## Обзор
|
||||
|
||||
В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории `scripts/`.
|
||||
|
||||
## Скрипты
|
||||
|
||||
### 1. `create_k8s_cluster.py`
|
||||
|
||||
**Назначение:** Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Парсинг пресета:** Читает YAML файл пресета (например, `molecule/presets/k8s/kubernetes.yml`)
|
||||
|
||||
2. **Создание Docker сети:**
|
||||
- Проверяет наличие сети (по умолчанию `labnet`)
|
||||
- Создает сеть если её нет
|
||||
|
||||
3. **Создание Docker контейнеров:**
|
||||
- Читает секцию `hosts` из пресета
|
||||
- Для каждого хоста создает Docker контейнер с настройками из `systemd_defaults`
|
||||
- Использует образы из секции `images`
|
||||
|
||||
4. **Создание Kind кластера:**
|
||||
- Генерирует конфигурацию Kind в формате YAML
|
||||
- Настраивает `extraPortMappings` для Ingress портов
|
||||
- Создает кластер через команду `kind create cluster`
|
||||
|
||||
5. **Установка аддонов:**
|
||||
- **Ingress NGINX:** Устанавливает ingress-nginx controller через kubectl apply
|
||||
- **Metrics Server:** Устанавливает metrics-server с патчем для insecure TLS
|
||||
- **Istio:** Устанавливает Istio через istioctl с профилем demo
|
||||
- **Kiali:** Устанавливает Kiali через Helm (использует Helm chart)
|
||||
- **Prometheus Stack:** Устанавливает Prometheus + Grafana через Helm (kube-prometheus-stack)
|
||||
|
||||
6. **Подключение к сети Kind:** Подключает контейнер `k8s-controller` к сети `kind` для доступа к API серверу
|
||||
|
||||
**Параметры:**
|
||||
```bash
|
||||
python3 scripts/create_k8s_cluster.py <preset_file> <container_name>
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
python3 scripts/create_k8s_cluster.py molecule/presets/k8s/kubernetes.yml k8s-controller
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. `delete_hosts.py`
|
||||
|
||||
**Назначение:** Удаление Docker контейнеров, созданных из секции `hosts` пресета.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Парсинг пресета:** Читает YAML файл пресета
|
||||
2. **Получение списка хостов:** Извлекает секцию `hosts`
|
||||
3. **Удаление контейнеров:** Для каждого хоста выполняет `docker rm -f <host_name>`
|
||||
|
||||
**Параметры:**
|
||||
```bash
|
||||
python3 scripts/delete_hosts.py <preset_file>
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
python3 scripts/delete_hosts.py molecule/presets/k8s/kubernetes.yml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. `portforward.py`
|
||||
|
||||
**Назначение:** Управление port-forward для доступа к сервисам Kubernetes извне кластера.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Загрузка пресета:** Читает файл `molecule/presets/k8s/kubernetes.yml`
|
||||
|
||||
2. **Получение kubeconfig:**
|
||||
- Копирует kubeconfig из контейнера `k8s-controller` через `docker exec`
|
||||
- Сохраняет во временный файл
|
||||
|
||||
3. **Модификация kubeconfig:**
|
||||
- Заменяет `server: https://0.0.0.0:6443` на `server: https://localhost:6443`
|
||||
- Это необходимо для доступа с локальной машины
|
||||
|
||||
4. **Создание port-forward:**
|
||||
- Запускает `kubectl port-forward` для каждого сервиса из `addon_ports`
|
||||
- Использует формат: `kubectl port-forward -n <namespace> svc/<service> <local_port>:<remote_port>`
|
||||
- Управляет процессами через PID
|
||||
|
||||
**Команды:**
|
||||
- `create` - создает port-forward для всех сервисов
|
||||
- `list` - показывает список активных портов
|
||||
- `clear` - останавливает все port-forward процессы
|
||||
- `recreate` - очищает и заново создает port-forward
|
||||
- `delete <port>` - удаляет конкретный port-forward
|
||||
|
||||
**Пример использования:**
|
||||
```bash
|
||||
python3 scripts/portforward.py create
|
||||
python3 scripts/portforward.py list
|
||||
python3 scripts/portforward.py delete 3000
|
||||
python3 scripts/portforward.py clear
|
||||
```
|
||||
|
||||
**Важно:** Скрипт должен запускаться на локальной машине, где установлены `kubectl` и Python 3.
|
||||
|
||||
---
|
||||
|
||||
### 4. `k8s_status.py`
|
||||
|
||||
**Назначение:** Детальный отчет о состоянии Kubernetes кластера.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Подключение к кластеру:**
|
||||
- Получает имя кластера через `kind get clusters`
|
||||
- Формирует адрес API сервера: `https://<cluster_name>-control-plane:6443`
|
||||
- Выполняет все kubectl команды через `docker exec k8s-controller`
|
||||
|
||||
2. **Сбор информации:**
|
||||
- **Общая информация:** версия Kubernetes
|
||||
- **Узлы:** статус, ресурсы, описание каждого узла
|
||||
- **Namespaces:** список всех namespace
|
||||
- **Использование ресурсов:** метрики через metrics-server (если установлен)
|
||||
- **Pods:** поды по каждому namespace
|
||||
- **Deployments:** deployments по namespace
|
||||
- **DaemonSets:** daemonsets по namespace
|
||||
- **StatefulSets:** statefulsets по namespace
|
||||
- **Services:** сервисы по namespace
|
||||
- **Ingress:** ingress ресурсы
|
||||
- **PVC:** PersistentVolumeClaims
|
||||
- **События:** последние 20 событий по namespace
|
||||
- **Helm релизы:** список установленных через Helm
|
||||
|
||||
3. **Форматирование вывода:**
|
||||
- Использует секции с разделителями
|
||||
- Группирует информацию по namespace
|
||||
- Показывает только непустые секции
|
||||
|
||||
**Пример использования:**
|
||||
```bash
|
||||
python3 scripts/k8s_status.py
|
||||
```
|
||||
|
||||
**Интеграция:**
|
||||
- Автоматически вызывается командой `make k8s status [preset]`
|
||||
|
||||
**Особенности:**
|
||||
- Выполняет все команды внутри контейнера `k8s-controller`
|
||||
- Использует прямой адрес control-plane для подключения
|
||||
- Обходит проблемы с kubeconfig через `--insecure-skip-tls-verify`
|
||||
|
||||
---
|
||||
|
||||
## Архитектура взаимодействия
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Локальная машина │
|
||||
│ │
|
||||
│ Makefile → Python скрипты → Docker API │
|
||||
│ ↓ ↓ ↓ │
|
||||
│ make k8s scripts/*.py docker exec │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker контейнер │
|
||||
│ k8s-controller │
|
||||
│ ┌──────────────────────────────────────────┐ │
|
||||
│ │ kind, kubectl, helm, istioctl │ │
|
||||
│ └──────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker сеть: kind │
|
||||
│ ┌──────────────────────────────────────────┐ │
|
||||
│ │ Kind Kubernetes Cluster │ │
|
||||
│ │ • Control Plane (6443) │ │
|
||||
│ │ • Worker Nodes │ │
|
||||
│ │ • Services (ClusterIP) │ │
|
||||
│ │ • Ingress │ │
|
||||
│ └──────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Общие принципы
|
||||
|
||||
1. **Изоляция:** Все kubectl команды выполняются внутри контейнера `k8s-controller`
|
||||
2. **Безопасность:** Используется `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||
3. **Автоматизация:** Скрипты вызываются автоматически через Makefile
|
||||
4. **Логгирование:** Все скрипты выводят подробную информацию о своих действиях
|
||||
|
||||
## Требования
|
||||
|
||||
- Python 3 (на локальной машине)
|
||||
- kubectl (на локальной машине, для portforward.py)
|
||||
- Docker
|
||||
- Docker контейнер `k8s-controller` должен быть запущен
|
||||
|
||||
## Отладка
|
||||
|
||||
Если что-то не работает:
|
||||
|
||||
1. **Проверьте контейнер:**
|
||||
```bash
|
||||
docker ps | grep k8s-controller
|
||||
```
|
||||
|
||||
2. **Запустите скрипт вручную:**
|
||||
```bash
|
||||
python3 scripts/k8s_status.py
|
||||
```
|
||||
|
||||
3. **Посмотрите логи:**
|
||||
```bash
|
||||
docker logs k8s-controller
|
||||
```
|
||||
|
||||
4. **Проверьте кластер:**
|
||||
```bash
|
||||
docker exec k8s-controller kubectl get nodes
|
||||
```
|
||||
395
docs/kubernetes-commands.md
Normal file
395
docs/kubernetes-commands.md
Normal file
@@ -0,0 +1,395 @@
|
||||
# Команды для работы с Kubernetes
|
||||
|
||||
Автор: Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Работа с Helm репозиториями](#работа-с-helm-репозиториями)
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
Команды для применения, удаления и обновления манифестов YAML в кластере.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `apply` - Применение манифеста
|
||||
|
||||
Применяет манифест YAML к кластеру.
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Применение манифеста из URL
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Применение локального манифеста
|
||||
make k8s manifest apply kubernetes ./manifests/my-app.yaml
|
||||
```
|
||||
|
||||
#### `delete` - Удаление ресурсов
|
||||
|
||||
Удаляет ресурсы из кластера по манифесту.
|
||||
|
||||
```bash
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
#### `update` - Обновление манифеста
|
||||
|
||||
Обновляет ресурсы в кластере, используя манифест.
|
||||
|
||||
```bash
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# Установка NGINX Ingress Controller
|
||||
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
|
||||
# Удаление ресурсов
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Обновление конфигурации
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml --force
|
||||
```
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
Команды для установки, обновления и управления Helm чартами в кластере.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s helm [команда] [пресет] [релиз] [чант]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `apply` - Установка/обновление чарта
|
||||
|
||||
Устанавливает новый релиз или обновляет существующий.
|
||||
|
||||
```bash
|
||||
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
**Параметры:**
|
||||
- `пресет` - имя пресета кластера
|
||||
- `релиз` - имя релиза (например: my-nginx)
|
||||
- `чарт` - имя чарта (например: nginx/nginx-ingress)
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Установка nginx-ingress
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# Установка с указанием репозитория
|
||||
make k8s helm apply kubernetes prometheus prometheus-community/prometheus
|
||||
```
|
||||
|
||||
#### `delete` - Удаление релиза
|
||||
|
||||
Удаляет Helm релиз из кластера.
|
||||
|
||||
```bash
|
||||
make k8s helm delete kubernetes my-nginx
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
|
||||
# Удаление с флагом --keep-history
|
||||
# (не поддерживается в текущей реализации)
|
||||
```
|
||||
|
||||
#### `update` - Обновление релиза
|
||||
|
||||
Обновляет существующий Helm релиз.
|
||||
|
||||
```bash
|
||||
make k8s helm update kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
#### `rollback` - Откат релиза
|
||||
|
||||
Откатывает релиз к предыдущей версии.
|
||||
|
||||
```bash
|
||||
make k8s helm rollback kubernetes my-nginx
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Откат к предыдущей ревизии
|
||||
make k8s helm rollback kubernetes my-nginx
|
||||
|
||||
# Откат к конкретной ревизии (не поддерживается в текущей реализации)
|
||||
```
|
||||
|
||||
#### `list` - Список релизов
|
||||
|
||||
Показывает список всех установленных Helm релизов.
|
||||
|
||||
```bash
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
**Пример вывода:**
|
||||
```
|
||||
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
|
||||
nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0
|
||||
```
|
||||
|
||||
#### `status` - Статус релиза
|
||||
|
||||
Показывает подробную информацию о статусе релиза.
|
||||
|
||||
```bash
|
||||
make k8s helm status kubernetes my-nginx
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# 1. Установка NGINX Ingress Controller
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 2. Проверка статуса
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
|
||||
# 3. Обновление релиза
|
||||
make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 4. Просмотр списка релизов
|
||||
make k8s helm list kubernetes
|
||||
|
||||
# 5. Откат релиза
|
||||
make k8s helm rollback kubernetes nginx-ingress
|
||||
|
||||
# 6. Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
```
|
||||
|
||||
## Работа с Helm репозиториями
|
||||
|
||||
Команды для управления Helm репозиториями.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s helmrepo [команда] [пресет] [имя] [URL]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `add` - Добавление репозитория
|
||||
|
||||
Добавляет новый Helm репозиторий.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Добавление официального репозитория Helm
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Добавление репозитория Bitnami
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Добавление репозитория NGINX
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Добавление репозитория Prometheus
|
||||
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||
|
||||
# Добавление пользовательского репозитория
|
||||
make k8s helmrepo add kubernetes my-repo https://charts.example.com
|
||||
```
|
||||
|
||||
#### `list` - Список репозиториев
|
||||
|
||||
Показывает список всех добавленных Helm репозиториев.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo list kubernetes
|
||||
```
|
||||
|
||||
**Пример вывода:**
|
||||
```
|
||||
NAME URL
|
||||
stable https://charts.helm.sh/stable
|
||||
bitnami https://charts.bitnami.com/bitnami
|
||||
nginx https://helm.nginx.com/stable
|
||||
```
|
||||
|
||||
#### `delete` - Удаление репозитория
|
||||
|
||||
Удаляет Helm репозиторий.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
#### `update` - Обновление репозиториев
|
||||
|
||||
Обновляет информацию о всех Helm репозиториях.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Обновление всех репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
#### `packages` - Список пакетов
|
||||
|
||||
Показывает список пакетов в указанном репозитории.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Просмотр пакетов в репозитории stable
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# Просмотр пакетов в репозитории nginx
|
||||
make k8s helmrepo packages kubernetes nginx
|
||||
|
||||
# Поиск конкретного пакета
|
||||
make k8s helmrepo packages kubernetes stable | grep nginx
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# 1. Добавление нескольких репозиториев
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# 2. Просмотр списка репозиториев
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# 3. Обновление репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# 4. Поиск пакетов в репозитории
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# 5. Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes my-custom-repo
|
||||
|
||||
# 6. Установка пакета из добавленного репозитория
|
||||
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
## Полный рабочий пример
|
||||
|
||||
```bash
|
||||
# 1. Создание кластера
|
||||
make k8s create kubernetes
|
||||
|
||||
# 2. Добавление Helm репозиториев
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# 3. Обновление репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# 4. Просмотр доступных пакетов
|
||||
make k8s helmrepo packages kubernetes nginx
|
||||
|
||||
# 5. Установка NGINX Ingress Controller
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 6. Проверка статуса
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
|
||||
# 7. Просмотр списка релизов
|
||||
make k8s helm list kubernetes
|
||||
|
||||
# 8. Применение манифеста
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# 9. Откат релиза (если нужно)
|
||||
make k8s helm rollback kubernetes nginx-ingress
|
||||
|
||||
# 10. Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
|
||||
# 11. Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes nginx
|
||||
|
||||
# 12. Удаление кластера
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
## Обработка ошибок
|
||||
|
||||
### Ошибка: Контейнер не запущен
|
||||
|
||||
```
|
||||
❌ Контейнер k8s-kubernetes не запущен
|
||||
💡 Запустите: make k8s create kubernetes
|
||||
```
|
||||
|
||||
**Решение:** Запустите кластер перед выполнением команд.
|
||||
|
||||
### Ошибка: Неизвестная команда
|
||||
|
||||
```
|
||||
❌ Неизвестная команда: unknown
|
||||
💡 Доступные команды: apply, delete, update
|
||||
```
|
||||
|
||||
**Решение:** Используйте правильную команду из списка доступных.
|
||||
|
||||
### Ошибка: Не указаны параметры
|
||||
|
||||
```
|
||||
❌ Ошибка: Укажите имя релиза и чарт
|
||||
💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress
|
||||
```
|
||||
|
||||
**Решение:** Укажите все необходимые параметры команды.
|
||||
|
||||
## Дополнительная информация
|
||||
|
||||
- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]`
|
||||
- Вам не нужно устанавливать kubectl или helm локально
|
||||
- Подключение к кластеру происходит через имя узла control-plane
|
||||
- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
906
docs/kubernetes-full-guide.md
Normal file
906
docs/kubernetes-full-guide.md
Normal file
@@ -0,0 +1,906 @@
|
||||
# Полное руководство по работе с Kubernetes кластерами
|
||||
|
||||
Автор: Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Введение](#введение)
|
||||
- [Создание кластера](#создание-кластера)
|
||||
- [Управление кластером](#управление-кластером)
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Настройка Ingress](#настройка-ingress)
|
||||
- [Мониторинг и аддоны](#мониторинг-и-аддоны)
|
||||
- [Service Mesh с Istio](#service-mesh-с-istio)
|
||||
- [Примеры полных развертываний](#примеры-полных-развертываний)
|
||||
|
||||
## Введение
|
||||
|
||||
DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
|
||||
|
||||
### Основные возможности
|
||||
|
||||
- Создание многоузловых Kubernetes кластеров
|
||||
- Установка и управление Helm чартами
|
||||
- Работа с манифестами YAML
|
||||
- Настройка Ingress контроллеров
|
||||
- Установка систем мониторинга (Prometheus, Grafana)
|
||||
- Развертывание Service Mesh (Istio, Kiali)
|
||||
- Изоляция сети и безопасность
|
||||
|
||||
### Преимущества
|
||||
|
||||
- Не требует установки локального Kubernetes
|
||||
- Быстрое создание и удаление кластеров
|
||||
- Поддержка многоузловых конфигураций
|
||||
- Полная совместимость с production окружениями
|
||||
- Контейнеризация всех инструментов
|
||||
|
||||
## Создание кластера
|
||||
|
||||
### Базовое создание
|
||||
|
||||
Простое создание минимального кластера без дополнительных компонентов:
|
||||
|
||||
```bash
|
||||
make k8s create
|
||||
```
|
||||
|
||||
Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
|
||||
|
||||
### Создание полнофункционального кластера
|
||||
|
||||
Создание кластера с предустановленными компонентами:
|
||||
|
||||
```bash
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
Этот пресет создает кластер со следующими компонентами:
|
||||
- 1 control-plane узел
|
||||
- 2 worker узла
|
||||
- Ingress NGINX Controller
|
||||
- Metrics Server
|
||||
- Istio Service Mesh
|
||||
- Kiali для визуализации Istio
|
||||
- Prometheus Stack (Prometheus + Grafana)
|
||||
|
||||
### Конфигурация пресета
|
||||
|
||||
Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
### Проверка статуса кластера
|
||||
|
||||
```bash
|
||||
# Показать узлы кластера
|
||||
make k8s nodes kubernetes
|
||||
|
||||
# Вывод:
|
||||
# NAME STATUS ROLES AGE VERSION
|
||||
# lab-control-plane Ready control-plane 5m v1.34.0
|
||||
# lab-worker Ready <none> 4m v1.34.0
|
||||
# lab-worker2 Ready <none> 4m v1.34.0
|
||||
|
||||
# Показать подробный статус
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### Подключение к кластеру
|
||||
|
||||
```bash
|
||||
# Получить kubeconfig
|
||||
make k8s config kubernetes
|
||||
|
||||
# Использовать kubeconfig
|
||||
export KUBECONFIG=$(pwd)/kubeconfig
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
## Управление кластером
|
||||
|
||||
### Остановка и запуск
|
||||
|
||||
```bash
|
||||
# Остановить кластер (без удаления)
|
||||
make k8s stop kubernetes
|
||||
|
||||
# Запустить остановленный кластер
|
||||
make k8s start kubernetes
|
||||
|
||||
# Перезапустить кластер
|
||||
make k8s stop kubernetes && make k8s start kubernetes
|
||||
```
|
||||
|
||||
### Удаление кластера
|
||||
|
||||
```bash
|
||||
# Полное удаление кластера и контейнера
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
### Получение shell в контейнере
|
||||
|
||||
```bash
|
||||
# Открыть интерактивный shell
|
||||
make k8s shell kubernetes
|
||||
|
||||
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
|
||||
kubectl get nodes
|
||||
helm list
|
||||
kind get clusters
|
||||
```
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
### Применение манифеста
|
||||
|
||||
Применение манифеста из URL:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
Применение локального манифеста:
|
||||
|
||||
```bash
|
||||
# Создайте файл example-deployment.yaml
|
||||
cat > example-deployment.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.21
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: nginx-service
|
||||
spec:
|
||||
selector:
|
||||
app: nginx
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
type: NodePort
|
||||
EOF
|
||||
|
||||
# Применить манифест
|
||||
make k8s manifest apply kubernetes ./example-deployment.yaml
|
||||
```
|
||||
|
||||
### Удаление ресурсов
|
||||
|
||||
```bash
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Обновление ресурсов
|
||||
|
||||
```bash
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
### Добавление Helm репозиториев
|
||||
|
||||
Список популярных репозиториев:
|
||||
|
||||
```bash
|
||||
# Официальный Helm репозиторий
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Bitnami (большая коллекция чартов)
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# NGINX Inc
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Prometheus Community
|
||||
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||
|
||||
# Istio
|
||||
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||
|
||||
# Информация о репозиториях
|
||||
make k8s helmrepo list kubernetes
|
||||
```
|
||||
|
||||
### Обновление репозиториев
|
||||
|
||||
```bash
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
### Поиск чартов
|
||||
|
||||
```bash
|
||||
# Просмотр всех чартов в репозитории
|
||||
make k8s helmrepo packages kubernetes bitnami
|
||||
|
||||
# Поиск конкретного чарта
|
||||
make k8s helmrepo packages kubernetes bitnami | grep nginx
|
||||
|
||||
# Поиск в нескольких репозиториях
|
||||
make k8s helmrepo packages kubernetes bitnami | grep redis
|
||||
make k8s helmrepo packages kubernetes stable | grep postgresql
|
||||
```
|
||||
|
||||
### Установка Helm чартов
|
||||
|
||||
#### Пример 1: Установка Redis
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Обновить индекс
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# Установить Redis
|
||||
make k8s helm apply kubernetes redis bitnami/redis
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes redis
|
||||
|
||||
# Посмотреть список релизов
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
#### Пример 2: Установка PostgreSQL
|
||||
|
||||
```bash
|
||||
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||
make k8s helm status kubernetes postgres
|
||||
```
|
||||
|
||||
#### Пример 3: Установка Nginx Ingress через Helm
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий (если еще не добавлен)
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Обновить индекс
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# Установить NGINX Ingress
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||
|
||||
# Проверить
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
```
|
||||
|
||||
### Обновление Helm релизов
|
||||
|
||||
```bash
|
||||
# Обновить релиз до последней версии
|
||||
make k8s helm update kubernetes redis bitnami/redis
|
||||
|
||||
# Проверить после обновления
|
||||
make k8s helm status kubernetes redis
|
||||
```
|
||||
|
||||
### Откат Helm релизов
|
||||
|
||||
```bash
|
||||
# Откатить к предыдущей версии
|
||||
make k8s helm rollback kubernetes redis
|
||||
|
||||
# Проверить статус после отката
|
||||
make k8s helm status kubernetes redis
|
||||
```
|
||||
|
||||
### Удаление Helm релизов
|
||||
|
||||
```bash
|
||||
# Удалить релиз
|
||||
make k8s helm delete kubernetes redis
|
||||
make k8s helm delete kubernetes postgres
|
||||
```
|
||||
|
||||
## Настройка Ingress
|
||||
|
||||
### Установка NGINX Ingress Controller
|
||||
|
||||
Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
|
||||
|
||||
```bash
|
||||
# Через манифест
|
||||
make k8s manifest apply kubernetes \
|
||||
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
|
||||
# Или через Helm
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||
```
|
||||
|
||||
### Создание Ingress ресурса
|
||||
|
||||
Создайте файл `example-ingress.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: hello-service
|
||||
spec:
|
||||
selector:
|
||||
app: hello
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 8080
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: hello-deployment
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: hello
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: hello
|
||||
spec:
|
||||
containers:
|
||||
- name: hello
|
||||
image: hashicorp/http-echo:latest
|
||||
args:
|
||||
- "-text=Hello from Kubernetes!"
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hello-ingress
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
rules:
|
||||
- host: hello.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hello-service
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
Примените манифест:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./example-ingress.yaml
|
||||
```
|
||||
|
||||
Проверьте доступность:
|
||||
|
||||
```bash
|
||||
# Добавьте запись в /etc/hosts
|
||||
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
|
||||
|
||||
# Откройте в браузере или проверьте через curl
|
||||
curl http://hello.local:8081
|
||||
```
|
||||
|
||||
### TLS Ingress
|
||||
|
||||
Создайте TLS сертификат и добавьте в Ingress:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hello-tls-ingress
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- hello.local
|
||||
secretName: tls-secret
|
||||
rules:
|
||||
- host: hello.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hello-service
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
## Мониторинг и аддоны
|
||||
|
||||
### Prometheus Stack
|
||||
|
||||
Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||
|
||||
#### Доступ к Grafana
|
||||
|
||||
```bash
|
||||
# 1. Получите пароль администратора
|
||||
kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
|
||||
-n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
|
||||
|
||||
# 2. Откройте браузер
|
||||
# URL: http://localhost:3000
|
||||
# Username: admin
|
||||
# Password: [результат из команды выше]
|
||||
```
|
||||
|
||||
#### Доступ к Prometheus
|
||||
|
||||
```bash
|
||||
# URL: http://localhost:9090
|
||||
# Откройте в браузере для просмотра метрик
|
||||
```
|
||||
|
||||
#### Просмотр метрик
|
||||
|
||||
```bash
|
||||
# Получить список метрик
|
||||
curl http://localhost:9090/api/v1/label/__name__/values
|
||||
|
||||
# Запрос конкретной метрики
|
||||
curl 'http://localhost:9090/api/v1/query?query=up'
|
||||
```
|
||||
|
||||
### Установка дополнительных инструментов мониторинга
|
||||
|
||||
#### Loki для логов
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Grafana
|
||||
make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
|
||||
|
||||
# Установить Loki
|
||||
make k8s helm apply kubernetes loki grafana/loki-stack
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes loki
|
||||
```
|
||||
|
||||
#### Jaeger для трейсинга
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Jaeger
|
||||
make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
|
||||
|
||||
# Установить Jaeger
|
||||
make k8s helm apply kubernetes jaeger jaegertracing/jaeger
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes jaeger
|
||||
```
|
||||
|
||||
## Service Mesh с Istio
|
||||
|
||||
### Установка Istio
|
||||
|
||||
Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||
|
||||
### Ручная установка Istio
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Istio
|
||||
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||
|
||||
# Установить Istio base
|
||||
make k8s helm apply kubernetes istio-base istio/base
|
||||
|
||||
# Установить Istiod (control plane)
|
||||
make k8s helm apply kubernetes istiod istio/istiod \
|
||||
--set values.global.istiod.enableAnalysis=true
|
||||
|
||||
# Установить Istio Ingress Gateway
|
||||
make k8s helm apply kubernetes istio-ingress istio/gateway
|
||||
```
|
||||
|
||||
### Kiali для визуализации Istio
|
||||
|
||||
Kiali устанавливается автоматически с пресетом `kubernetes`.
|
||||
|
||||
#### Доступ к Kiali
|
||||
|
||||
```bash
|
||||
# URL: http://localhost:20001
|
||||
# Откройте в браузере для визуализации Service Mesh
|
||||
|
||||
# Настройки доступа
|
||||
# Username: admin
|
||||
# Password: admin (если используется анонимный доступ)
|
||||
```
|
||||
|
||||
#### Ручная установка Kiali
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Kiali
|
||||
make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
|
||||
|
||||
# Установить Kiali
|
||||
make k8s helm apply kubernetes kiali-server kiali/kiali-server \
|
||||
--set auth.strategy=anonymous \
|
||||
--set deployment.ingress.enabled=true \
|
||||
--set server.web_root="/"
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes kiali-server
|
||||
```
|
||||
|
||||
### Пример приложения с Istio
|
||||
|
||||
Создайте файл `istio-app.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: bookinfo
|
||||
labels:
|
||||
istio-injection: enabled
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: productpage
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
ports:
|
||||
- port: 9080
|
||||
name: http
|
||||
targetPort: 9080
|
||||
selector:
|
||||
app: productpage
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: productpage
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: productpage
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: productpage
|
||||
spec:
|
||||
containers:
|
||||
- name: productpage
|
||||
image: istio/examples-bookinfo-productpage-v1:latest
|
||||
ports:
|
||||
- containerPort: 9080
|
||||
```
|
||||
|
||||
Примените:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./istio-app.yaml
|
||||
```
|
||||
|
||||
## Примеры полных развертываний
|
||||
|
||||
### Пример 1: WordPress с MySQL
|
||||
|
||||
```bash
|
||||
# 1. Установить MySQL через Helm
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helm apply kubernetes mysql bitnami/mysql \
|
||||
--set auth.rootPassword=secretpassword
|
||||
|
||||
# 2. Создать манифест для WordPress
|
||||
cat > wordpress.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: wordpress
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: wordpress
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: wordpress
|
||||
spec:
|
||||
containers:
|
||||
- name: wordpress
|
||||
image: wordpress:latest
|
||||
env:
|
||||
- name: WORDPRESS_DB_HOST
|
||||
value: mysql.default.svc.cluster.local
|
||||
- name: WORDPRESS_DB_USER
|
||||
value: root
|
||||
- name: WORDPRESS_DB_PASSWORD
|
||||
value: secretpassword
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: wordpress
|
||||
spec:
|
||||
selector:
|
||||
app: wordpress
|
||||
ports:
|
||||
- port: 80
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: wordpress-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: wordpress.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: wordpress
|
||||
port:
|
||||
number: 80
|
||||
EOF
|
||||
|
||||
# 3. Применить манифест
|
||||
make k8s manifest apply kubernetes ./wordpress.yaml
|
||||
```
|
||||
|
||||
### Пример 2: Многоуровневое приложение с мониторингом
|
||||
|
||||
```bash
|
||||
# 1. Установить Redis
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helm apply kubernetes redis bitnami/redis
|
||||
|
||||
# 2. Установить PostgreSQL
|
||||
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||
|
||||
# 3. Создать приложение
|
||||
cat > app.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: api-server
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: api
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: api
|
||||
version: v1
|
||||
spec:
|
||||
containers:
|
||||
- name: api
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- containerPort: 80
|
||||
env:
|
||||
- name: REDIS_HOST
|
||||
value: redis-master.default.svc.cluster.local
|
||||
- name: POSTGRES_HOST
|
||||
value: postgresql-postgresql.default.svc.cluster.local
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: api-service
|
||||
spec:
|
||||
selector:
|
||||
app: api
|
||||
ports:
|
||||
- port: 80
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: api-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: api.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: api-service
|
||||
port:
|
||||
number: 80
|
||||
EOF
|
||||
|
||||
# 4. Применить
|
||||
make k8s manifest apply kubernetes ./app.yaml
|
||||
```
|
||||
|
||||
### Пример 3: CI/CD с Jenkins в Kubernetes
|
||||
|
||||
```bash
|
||||
# 1. Установить Jenkins
|
||||
make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
|
||||
make k8s helm apply kubernetes jenkins jenkins/jenkins \
|
||||
--set persistence.enabled=true \
|
||||
--set controller.installPlugins.enabled=true
|
||||
|
||||
# 2. Получить пароль администратора
|
||||
kubectl --kubeconfig kubeconfig exec \
|
||||
-n default svc/jenkins -c jenkins -- \
|
||||
cat /run/secrets/additional/chart-admin-password
|
||||
```
|
||||
|
||||
## Полезные команды и советы
|
||||
|
||||
### Мониторинг ресурсов
|
||||
|
||||
```bash
|
||||
# Просмотр использования ресурсов узлами
|
||||
kubectl --kubeconfig kubeconfig top nodes
|
||||
|
||||
# Просмотр использования ресурсов подами
|
||||
kubectl --kubeconfig kubeconfig top pods
|
||||
|
||||
# Детальная информация о узле
|
||||
kubectl --kubeconfig kubeconfig describe node lab-control-plane
|
||||
```
|
||||
|
||||
### Отладка
|
||||
|
||||
```bash
|
||||
# Просмотр логов пода
|
||||
kubectl --kubeconfig kubeconfig logs <pod-name>
|
||||
|
||||
# Просмотр логов с follow
|
||||
kubectl --kubeconfig kubeconfig logs -f <pod-name>
|
||||
|
||||
# Выполнить команду в поде
|
||||
kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
|
||||
|
||||
# Описание ресурса
|
||||
kubectl --kubeconfig kubeconfig describe pod <pod-name>
|
||||
kubectl --kubeconfig kubeconfig describe service <service-name>
|
||||
```
|
||||
|
||||
### Масштабирование
|
||||
|
||||
```bash
|
||||
# Масштабировать Deployment
|
||||
kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
|
||||
|
||||
# Автомасштабирование (требует metrics-server)
|
||||
kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
|
||||
--cpu-percent=70 --min=2 --max=10
|
||||
```
|
||||
|
||||
### Экспорт конфигурации
|
||||
|
||||
```bash
|
||||
# Экспортировать ресурс в YAML
|
||||
kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
|
||||
|
||||
# Экспортировать все ресурсы namespace
|
||||
kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Использование Secrets
|
||||
|
||||
```bash
|
||||
# Создать Secret из файла
|
||||
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||
--from-file=username=./username.txt \
|
||||
--from-file=password=./password.txt
|
||||
|
||||
# Создать Secret из литерала
|
||||
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||
--from-literal=username=admin \
|
||||
--from-literal=password=secret123
|
||||
```
|
||||
|
||||
### Network Policies
|
||||
|
||||
Создайте файл `network-policy.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: test-network-policy
|
||||
namespace: default
|
||||
spec:
|
||||
podSelector:
|
||||
matchLabels:
|
||||
role: db
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
ingress:
|
||||
- from:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
role: api
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
egress:
|
||||
- to:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
role: api
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
```
|
||||
|
||||
Примените:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./network-policy.yaml
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
|
||||
|
||||
- Создавать и управлять кластерами
|
||||
- Устанавливать и настраивать приложения
|
||||
- Работать с мониторингом и Service Mesh
|
||||
- Тестировать перед развертыванием в production
|
||||
|
||||
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
794
docs/kubernetes-kind.md
Normal file
794
docs/kubernetes-kind.md
Normal file
@@ -0,0 +1,794 @@
|
||||
# Kubernetes Kind Кластеры
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Описание](#описание)
|
||||
- [Требования к системе](#требования-к-системе)
|
||||
- [Возможности](#возможности)
|
||||
- [Быстрый старт](#быстрый-старт)
|
||||
- [Команды управления](#команды-управления)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Управление Ingress](#управление-ingress)
|
||||
- [Проброс портов (Port-forward)](#проброс-портов-port-forward)
|
||||
- [Мониторинг и логи](#мониторинг-и-логи)
|
||||
- [Конфигурация](#конфигурация)
|
||||
- [Архитектура](#архитектура)
|
||||
- [Доступ к приложениям](#доступ-к-приложениям)
|
||||
- [Кроссплатформенность](#кроссплатформенность)
|
||||
- [Подробная документация по скриптам](#подробная-документация-по-скриптам)
|
||||
- [Best Practices](#best-practices)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## Описание
|
||||
|
||||
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
|
||||
|
||||
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
|
||||
|
||||
## Требования к системе
|
||||
|
||||
### Обязательные требования
|
||||
|
||||
1. **Docker** - для запуска Kind кластеров
|
||||
2. **Python 3** - для управления port-forward
|
||||
3. **kubectl** - для работы с кластером
|
||||
|
||||
**Установка на macOS:**
|
||||
```bash
|
||||
brew install docker python3 kubectl
|
||||
```
|
||||
|
||||
**Установка на Ubuntu/Debian:**
|
||||
```bash
|
||||
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
|
||||
```
|
||||
|
||||
**Установка на CentOS/RHEL:**
|
||||
```bash
|
||||
sudo yum install -y docker python3 python3-pip kubectl
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### Проверка установки
|
||||
|
||||
```bash
|
||||
docker --version
|
||||
python3 --version
|
||||
kubectl version --client
|
||||
```
|
||||
|
||||
### Docker группы
|
||||
|
||||
На Linux добавьте пользователя в группу docker:
|
||||
```bash
|
||||
sudo usermod -aG docker $USER
|
||||
# Выйдите и войдите заново
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Возможности
|
||||
|
||||
- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов
|
||||
- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
|
||||
- ✅ **Автоматический port-forward** для доступа к сервисам
|
||||
- ✅ Работа с Helm (установка, удаление, обновление, rollback)
|
||||
- ✅ Работа с Kubernetes манифестами
|
||||
- ✅ Управление Helm репозиториями
|
||||
- ✅ Автоматическое управление `/etc/hosts` для Ingress
|
||||
- ✅ Управление Docker контейнерами в лабораторной сети
|
||||
- ✅ Интеграция с Istio Service Mesh
|
||||
- ✅ Детальный отчет о состоянии кластера
|
||||
|
||||
---
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
### 1. Создание кластера
|
||||
|
||||
```bash
|
||||
# Создание кластера с полным набором аддонов
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### 2. Проверка статуса
|
||||
|
||||
```bash
|
||||
# Детальный отчет о кластере
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### 3. Доступ к аддонам
|
||||
|
||||
После создания кластера автоматически создаются port-forward:
|
||||
- Grafana: http://localhost:3000
|
||||
- Prometheus: http://localhost:9090
|
||||
- Kiali: http://localhost:20001
|
||||
|
||||
### 4. Удаление кластера
|
||||
|
||||
```bash
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Команды управления
|
||||
|
||||
### Создание кластера
|
||||
|
||||
```bash
|
||||
# Минимальный кластер (без аддонов)
|
||||
make k8s create
|
||||
|
||||
# Полный кластер с аддонами
|
||||
make k8s create kubernetes
|
||||
|
||||
# Пользовательский пресет
|
||||
make k8s create my-custom-preset
|
||||
```
|
||||
|
||||
**Что происходит:**
|
||||
1. Создается контейнер `k8s-controller` с инструментами (Kind, kubectl, Helm, Istio CLI)
|
||||
2. Создаются Docker контейнеры из раздела `hosts` (если есть)
|
||||
3. Создается Kind кластер
|
||||
4. Устанавливаются аддоны
|
||||
5. Создается автоматический port-forward
|
||||
6. Добавляются записи в `/etc/hosts` для Ingress
|
||||
|
||||
### Управление жизненным циклом
|
||||
|
||||
```bash
|
||||
# Удаление кластера (с очисткой port-forward и /etc/hosts)
|
||||
make k8s destroy [preset]
|
||||
|
||||
# Остановка кластера (без удаления)
|
||||
make k8s stop [preset]
|
||||
|
||||
# Запуск остановленного кластера
|
||||
make k8s start [preset]
|
||||
|
||||
# Детальный отчет о состоянии
|
||||
make k8s status [preset]
|
||||
|
||||
# Показать узлы кластера
|
||||
make k8s nodes [preset]
|
||||
```
|
||||
|
||||
### Получение kubeconfig
|
||||
|
||||
```bash
|
||||
# Сохранить kubeconfig для подключения
|
||||
make k8s config [preset]
|
||||
|
||||
# Использовать конфиг
|
||||
export KUBECONFIG=kubeconfig
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
### Shell доступ
|
||||
|
||||
```bash
|
||||
# Открыть shell в контейнере k8s-controller
|
||||
make k8s shell [preset]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
Helm - это менеджер пакетов для Kubernetes.
|
||||
|
||||
### Управление релизами
|
||||
|
||||
```bash
|
||||
# Установить чарт
|
||||
make k8s helm apply kubernetes nginx stable/nginx-ingress
|
||||
|
||||
# Обновить релиз
|
||||
make k8s helm update kubernetes nginx stable/nginx-ingress
|
||||
|
||||
# Откатить релиз
|
||||
make k8s helm rollback kubernetes nginx
|
||||
|
||||
# Посмотреть статус релиза
|
||||
make k8s helm status kubernetes nginx
|
||||
|
||||
# Удалить релиз
|
||||
make k8s helm delete kubernetes nginx
|
||||
|
||||
# Список всех релизов
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
### Управление репозиториями
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Обновить репозиторий
|
||||
make k8s helmrepo update kubernetes stable
|
||||
|
||||
# Список репозиториев
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# Показать доступные чарты
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# Удалить репозиторий
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
### Пример: установка MySQL
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Bitnami
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Установить MySQL
|
||||
make k8s helm apply kubernetes mysql bitnami/mysql
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes mysql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
Применение обычных Kubernetes манифестов (без Helm).
|
||||
|
||||
```bash
|
||||
# Применить манифест из URL
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Применить манифест из файла
|
||||
make k8s manifest apply kubernetes /path/to/manifest.yaml
|
||||
|
||||
# Удалить манифест
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Пример: создание Deployment
|
||||
|
||||
```yaml
|
||||
# nginx-deployment.yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
```
|
||||
|
||||
```bash
|
||||
# Применить
|
||||
make k8s manifest apply kubernetes ./nginx-deployment.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Управление Ingress
|
||||
|
||||
### Доступ к приложениям через Ingress
|
||||
|
||||
Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`:
|
||||
|
||||
```bash
|
||||
# Добавить запись в /etc/hosts
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
|
||||
# Очистить DNS кеш macOS
|
||||
sudo killall -HUP mDNSResponder
|
||||
```
|
||||
|
||||
После этого приложение будет доступно по адресу:
|
||||
```
|
||||
http://grafana.local:8081
|
||||
```
|
||||
|
||||
**Пример манифеста Ingress:**
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: grafana-ingress
|
||||
namespace: monitoring
|
||||
spec:
|
||||
rules:
|
||||
- host: grafana.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: monitoring-grafana
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
**Важно:**
|
||||
- Записи в `/etc/hosts` нужно добавлять вручную
|
||||
- Используйте порт 8081 для HTTP и 8443 для HTTPS
|
||||
- Для удаления записей используйте sudo
|
||||
|
||||
---
|
||||
|
||||
## Проброс портов (Port-forward)
|
||||
|
||||
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
|
||||
|
||||
### Автоматический port-forward
|
||||
|
||||
После создания кластера автоматически создаются порты:
|
||||
- Ingress HTTP: `8081:80`
|
||||
- Ingress HTTPS: `8443:443`
|
||||
- Grafana: `3000:80`
|
||||
- Prometheus: `9090:9090`
|
||||
- Kiali: `20001:20001`
|
||||
|
||||
### Управление вручную
|
||||
|
||||
```bash
|
||||
# Создать port-forward
|
||||
make k8s portforward create
|
||||
|
||||
# Список активных портов
|
||||
make k8s portforward list
|
||||
|
||||
# Удалить конкретный порт
|
||||
make k8s portforward delete 3000
|
||||
|
||||
# Очистить все порты
|
||||
make k8s portforward clear
|
||||
|
||||
# Пересоздать порты
|
||||
make k8s portforward recreate
|
||||
```
|
||||
|
||||
### Ручной port-forward для своих сервисов
|
||||
|
||||
```bash
|
||||
# Подключиться к кластеру
|
||||
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||
|
||||
# Создать port-forward
|
||||
kubectl port-forward -n default svc/my-service 8080:80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Мониторинг и логи
|
||||
|
||||
### Детальный статус кластера
|
||||
|
||||
```bash
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
Показывает:
|
||||
- Узлы кластера
|
||||
- Namespaces
|
||||
- Pods
|
||||
- Services
|
||||
- Ingress
|
||||
- Deployments
|
||||
- DaemonSets
|
||||
- StatefulSets
|
||||
- PVC
|
||||
- События
|
||||
- Helm релизы
|
||||
- Использование ресурсов
|
||||
|
||||
### Доступ к аддонам
|
||||
|
||||
**Grafana:**
|
||||
```
|
||||
URL: http://localhost:3000
|
||||
Login: admin
|
||||
Password: admin
|
||||
```
|
||||
|
||||
**Prometheus:**
|
||||
```
|
||||
URL: http://localhost:9090
|
||||
```
|
||||
|
||||
**Kiali:**
|
||||
```
|
||||
URL: http://localhost:20001
|
||||
Login: admin
|
||||
Password: admin
|
||||
```
|
||||
|
||||
### Логи контейнера
|
||||
|
||||
```bash
|
||||
# Логи k8s-controller
|
||||
docker logs k8s-controller
|
||||
|
||||
# Логи в реальном времени
|
||||
docker logs -f k8s-controller
|
||||
```
|
||||
|
||||
### Логи кластера
|
||||
|
||||
```bash
|
||||
# Логи конкретного pod
|
||||
make k8s shell kubernetes
|
||||
kubectl logs -n monitoring <pod-name>
|
||||
|
||||
# Все логи в namespace
|
||||
kubectl logs -n monitoring --all-containers=true --tail=100
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Пресеты
|
||||
|
||||
Пресеты находятся в `molecule/presets/k8s/`:
|
||||
|
||||
**kubernetes.yml** - полный набор аддонов:
|
||||
- Ingress NGINX
|
||||
- Metrics Server
|
||||
- Istio
|
||||
- Kiali
|
||||
- Prometheus + Grafana
|
||||
|
||||
### Структура пресета
|
||||
|
||||
```yaml
|
||||
k8s_cluster:
|
||||
name: lab
|
||||
nodes: 1
|
||||
|
||||
addons:
|
||||
ingress: true
|
||||
metrics_server: true
|
||||
istio: true
|
||||
kiali: true
|
||||
prometheus_stack: true
|
||||
|
||||
addon_ports:
|
||||
ingress_http: 8081
|
||||
ingress_https: 8443
|
||||
prometheus: 9090
|
||||
grafana: 3000
|
||||
kiali: 20001
|
||||
metrics_server: 4443
|
||||
|
||||
hosts:
|
||||
- name: test1
|
||||
image: centos8
|
||||
systemd_defaults:
|
||||
container: true
|
||||
|
||||
images:
|
||||
centos8:
|
||||
name: inecs/ansible-lab:centos8-latest
|
||||
```
|
||||
|
||||
### Пользовательский пресет
|
||||
|
||||
Создайте файл `molecule/presets/k8s/my-preset.yml`:
|
||||
|
||||
```yaml
|
||||
k8s_cluster:
|
||||
name: my-cluster
|
||||
nodes: 2
|
||||
|
||||
addons:
|
||||
ingress: true
|
||||
metrics_server: false
|
||||
istio: false
|
||||
kiali: false
|
||||
prometheus_stack: false
|
||||
```
|
||||
|
||||
Использование:
|
||||
```bash
|
||||
make k8s create my-preset
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Локальная машина │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ Makefile → Python скрипты → Docker API │ │
|
||||
│ │ kubectl (port-forward) │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker: k8s-controller │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ kind, kubectl, helm, istioctl │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker сеть: kind │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ Kind Kubernetes Cluster │ │
|
||||
│ │ • Control Plane (6443) │ │
|
||||
│ │ • Worker Nodes │ │
|
||||
│ │ • Services (ClusterIP) │ │
|
||||
│ │ • Ingress Controller │ │
|
||||
│ │ • Istio Service Mesh │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Компоненты
|
||||
|
||||
1. **k8s-controller** - контейнер с инструментами управления
|
||||
2. **Kind кластер** - Kubernetes кластер в Docker контейнерах
|
||||
3. **Port-forward** - локальные процессы на хосте
|
||||
4. **Ingress** - маршрутизация трафика внутрь кластера
|
||||
|
||||
---
|
||||
|
||||
## Доступ к приложениям
|
||||
|
||||
### Доступ через Ingress
|
||||
|
||||
1. Создайте Ingress манифест
|
||||
2. Примените через `make k8s manifest apply`
|
||||
3. Запись автоматически добавится в `/etc/hosts`
|
||||
4. Приложение доступно по доменному имени
|
||||
|
||||
### Доступ через port-forward
|
||||
|
||||
Для ClusterIP сервисов:
|
||||
```bash
|
||||
kubectl port-forward -n namespace svc/service-name 8080:80
|
||||
```
|
||||
|
||||
Доступ: http://localhost:8080
|
||||
|
||||
### Доступ внутри кластера
|
||||
|
||||
Из другого pod:
|
||||
```bash
|
||||
kubectl exec -it pod-name -- curl http://service-name.namespace:80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Кроссплатформенность
|
||||
|
||||
### Поддерживаемые платформы
|
||||
|
||||
- **macOS (Intel & Apple Silicon)** - полная поддержка
|
||||
- **Linux (amd64 & arm64)** - полная поддержка
|
||||
- **Windows** - через WSL2
|
||||
|
||||
### Проблемы на разных платформах
|
||||
|
||||
**Apple Silicon (M1/M2):**
|
||||
- Используется ARM64 образы
|
||||
- Автоматическое определение архитектуры
|
||||
|
||||
**Linux:**
|
||||
- Требуются права на Docker socket
|
||||
- Возможны проблемы с selinux
|
||||
|
||||
---
|
||||
|
||||
## Подробная документация по скриптам
|
||||
|
||||
Для подробного описания работы всех скриптов управления Kubernetes смотрите:
|
||||
|
||||
📖 [Документация по скриптам Kubernetes](k8s-scripts.md)
|
||||
|
||||
Включает:
|
||||
- Описание каждого скрипта
|
||||
- Принцип работы
|
||||
- Примеры использования
|
||||
- Архитектура взаимодействия
|
||||
- Отладка
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Используйте пресеты
|
||||
|
||||
Не создавайте кластеры вручную, используйте пресеты для консистентности.
|
||||
|
||||
### 2. Очищайте после работы
|
||||
|
||||
```bash
|
||||
# После тестирования
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
### 3. Проверяйте статус
|
||||
|
||||
```bash
|
||||
# Регулярно проверяйте статус
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### 4. Используйте Helm для сложных приложений
|
||||
|
||||
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
|
||||
|
||||
### 5. Логируйте изменения
|
||||
|
||||
Все изменения в кластере через `make k8s` автоматически логируются.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Кластер не создается
|
||||
|
||||
**Проблема:** `kind create cluster` завершается с ошибкой
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте Docker
|
||||
docker ps
|
||||
|
||||
# Перезапустите Docker
|
||||
sudo systemctl restart docker
|
||||
|
||||
# Очистите старые кластеры
|
||||
kind delete cluster --all
|
||||
```
|
||||
|
||||
### Port-forward не работает
|
||||
|
||||
**Проблема:** Невозможно подключиться к порту
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте процессы
|
||||
make k8s portforward list
|
||||
|
||||
# Пересоздайте порты
|
||||
make k8s portforward recreate
|
||||
|
||||
# Проверьте, что порт свободен
|
||||
lsof -i :3000
|
||||
```
|
||||
|
||||
### kubectl не подключается
|
||||
|
||||
**Проблема:** `kubectl get nodes` выдает ошибку
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте контейнер
|
||||
docker ps | grep k8s-controller
|
||||
|
||||
# Зайдите в контейнер
|
||||
make k8s shell kubernetes
|
||||
|
||||
# Проверьте кластер
|
||||
kubectl get nodes
|
||||
|
||||
# Если не работает, пересоздайте кластер
|
||||
make k8s destroy kubernetes
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### Аддоны не устанавливаются
|
||||
|
||||
**Проблема:** Grafana/Prometheus/Kiali не доступны
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте статус кластера
|
||||
make k8s status kubernetes
|
||||
|
||||
# Проверьте pods
|
||||
make k8s shell kubernetes
|
||||
kubectl get pods -n monitoring
|
||||
kubectl logs -n monitoring <pod-name>
|
||||
|
||||
# Пересоздайте кластер
|
||||
make k8s destroy kubernetes
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### Ingress не работает
|
||||
|
||||
**Проблема:** Доменные имена не резолвятся
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте Ingress
|
||||
make k8s shell kubernetes
|
||||
kubectl get ingress --all-namespaces
|
||||
|
||||
# Добавьте запись в /etc/hosts вручную
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
|
||||
# Очистите DNS кеш
|
||||
sudo killall -HUP mDNSResponder
|
||||
|
||||
# Проверьте доступность
|
||||
curl http://grafana.local:8081
|
||||
```
|
||||
|
||||
### Helm чарты не устанавливаются
|
||||
|
||||
**Проблема:** `helm install` завершается с ошибкой
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте репозитории
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# Обновите репозитории
|
||||
make k8s helmrepo update kubernetes stable
|
||||
|
||||
# Проверьте логи
|
||||
make k8s shell kubernetes
|
||||
kubectl logs -l app=<release-name>
|
||||
```
|
||||
|
||||
### Контейнер k8s-controller не запускается
|
||||
|
||||
**Проблема:** `docker: Error response from daemon: ...`
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте образ
|
||||
docker images | grep k8s
|
||||
|
||||
# Пересоберите образ
|
||||
make docker build-image IMAGE=k8s-amd64
|
||||
make docker build-image IMAGE=k8s-arm64
|
||||
|
||||
# Проверьте Docker
|
||||
docker system prune -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Контакты
|
||||
|
||||
- **Автор:** Сергей Антропов
|
||||
- **Сайт:** https://devops.org.ru
|
||||
- **GitHub:** https://github.com/your-repo
|
||||
|
||||
---
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🔍 Диагностика Docker
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 2.0.0
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## Описание
|
||||
|
||||
|
||||
Reference in New Issue
Block a user