200 lines
5.7 KiB
Markdown
200 lines
5.7 KiB
Markdown
# Terraform Proxmox Talos Cluster
|
||
|
||
Infrastructure as Code для развертывания Kubernetes кластера на базе Talos OS в Proxmox VE с использованием Cilium CNI.
|
||
|
||
## Архитектура
|
||
|
||
- **Control Planes**: 1 нода (talos-cp-1)
|
||
- **Workers**: 2 ноды (talos-worker-1, talos-worker-2)
|
||
- **CNI**: Cilium с L2 Announcements
|
||
- **Версия Talos**: 1.10.6
|
||
- **Версия модуля**: bbtechsys/talos/proxmox 0.1.5
|
||
|
||
## Требования
|
||
|
||
### Система
|
||
|
||
- Terraform >= 1.0
|
||
- kubectl
|
||
- helm
|
||
|
||
### Proxmox VE
|
||
|
||
- Proxmox VE >= 7.0
|
||
- Datastore для образов: `nvme1`
|
||
- Datastore для ISO: `Images`
|
||
- Доступ к API через <https://192.168.8.10:8006/>
|
||
|
||
### Переменные окружения
|
||
|
||
Создайте файл `.env` в корне проекта:
|
||
|
||
```bash
|
||
# Proxmox credentials
|
||
PROXMOX_VE_USERNAME=your_username@pam
|
||
PROXMOX_VE_PASSWORD=your_password
|
||
|
||
# Talos cluster name
|
||
TALOS_CLUSTER_NAME=talos-nsk2
|
||
```
|
||
|
||
## Структура проекта
|
||
|
||
```yaml
|
||
.
|
||
├── main.tf # Основная конфигурация Terraform
|
||
├── start.sh # Скрипт развертывания кластера
|
||
├── destroy.sh # Скрипт удаления кластера
|
||
└── cilium/
|
||
├── values.yaml # Конфигурация Cilium
|
||
├── ippool.yaml # IP Pool для LoadBalancer
|
||
└── l2-announcement-policy.yaml # Политика L2 анонсов
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### Terraform (main.tf)
|
||
|
||
Основная конфигурация включает:
|
||
|
||
- **Провайдеры**: Proxmox (bpg/proxmox ~> 0.75.0), Talos (siderolabs/talos ~> 0.7.1)
|
||
- **Модуль Talos**: автоматическое создание VM, установка Talos OS, настройка кластера
|
||
- **Патчи конфигурации**: отключение CNI по умолчанию, разрешение планирования на control plane
|
||
|
||
### Cilium CNI
|
||
|
||
#### values.yaml
|
||
|
||
- **IPAM**: Kubernetes mode
|
||
- **kube-proxy**: полная замена
|
||
- **L2 Announcements**: включены
|
||
- **Hubble**: UI и relay включены
|
||
- **Security Context**: расширенные capabilities для работы с Talos
|
||
|
||
#### IP Pool (ippool.yaml)
|
||
|
||
- **CIDR**: 192.168.8.11/32
|
||
- **Назначение**: LoadBalancer IP для сервисов
|
||
|
||
#### L2 Announcement Policy
|
||
|
||
- **Область действия**: только worker ноды
|
||
- **Типы IP**: External IPs и LoadBalancer IPs
|
||
|
||
## Скрипты
|
||
|
||
### start.sh - Развертывание кластера
|
||
|
||
Автоматизированный скрипт для полного развертывания:
|
||
|
||
```bash
|
||
./start.sh
|
||
```
|
||
|
||
**Этапы выполнения:**
|
||
|
||
1. **Загрузка переменных** из `.env`
|
||
2. **Terraform Plan** - показ планируемых изменений
|
||
3. **Подтверждение и Apply** - создание инфраструктуры
|
||
4. **Сохранение kubeconfig** в `~/.kube/${TALOS_CLUSTER_NAME}.yaml`
|
||
5. **Установка Cilium** через Helm:
|
||
- Добавление репозитория cilium
|
||
- Обновление репозиториев
|
||
- Установка с кастомными values
|
||
6. **Применение Cilium ресурсов**:
|
||
- IP Pool для LoadBalancer
|
||
- L2 Announcement Policy
|
||
|
||
**Интерактивные подтверждения:**
|
||
|
||
- Apply terraform changes? (y/n)
|
||
- Save kubeconfig? (y/n)
|
||
- Install Cilium? (y/n)
|
||
- Apply Cilium IP Pool and L2 Announcement Policy? (y/n)
|
||
|
||
### destroy.sh - Удаление кластера
|
||
|
||
Полная очистка инфраструктуры:
|
||
|
||
```bash
|
||
./destroy.sh
|
||
```
|
||
|
||
**Действия:**
|
||
|
||
1. Загрузка переменных из `.env`
|
||
2. Автоматическое удаление всех ресурсов (`terraform destroy -auto-approve`)
|
||
3. Удаление kubeconfig файла из `~/.kube/`
|
||
|
||
## Использование
|
||
|
||
### Первоначальное развертывание
|
||
|
||
1. Настройте переменные окружения в `.env`
|
||
2. Инициализируйте Terraform:
|
||
|
||
```bash
|
||
terraform init
|
||
```
|
||
|
||
3. Запустите развертывание:
|
||
|
||
```bash
|
||
./start.sh
|
||
```
|
||
|
||
### Подключение к кластеру
|
||
|
||
После развертывания kubeconfig сохраняется в:
|
||
|
||
```bash
|
||
~/.kube/${TALOS_CLUSTER_NAME}.yaml
|
||
```
|
||
|
||
Использование:
|
||
|
||
```bash
|
||
export KUBECONFIG=~/.kube/${TALOS_CLUSTER_NAME}.yaml
|
||
kubectl get nodes
|
||
```
|
||
|
||
### Проверка Cilium
|
||
|
||
```bash
|
||
# Статус Cilium
|
||
kubectl -n kube-system get pods -l k8s-app=cilium
|
||
|
||
# Hubble UI (если включен)
|
||
kubectl -n kube-system port-forward service/hubble-ui 12000:80
|
||
```
|
||
|
||
### Удаление кластера
|
||
|
||
```bash
|
||
./destroy.sh
|
||
```
|
||
|
||
## Сетевая конфигурация
|
||
|
||
- **Cluster CIDR**: управляется Talos
|
||
- **Pod Network**: управляется Cilium
|
||
- **LoadBalancer IP**: 192.168.8.11
|
||
- **L2 Announcements**: только с worker нод
|
||
|
||
## Troubleshooting
|
||
|
||
### Проблемы с сетью
|
||
|
||
- Проверьте доступность 192.168.8.10:8006
|
||
- Убедитесь в корректности credentials в `.env`
|
||
|
||
### Проблемы с Cilium
|
||
|
||
- Проверьте статус подов: `kubectl -n kube-system get pods -l k8s-app=cilium`
|
||
- Логи Cilium: `kubectl -n kube-system logs -l k8s-app=cilium`
|
||
|
||
### Проблемы с Talos
|
||
|
||
- Проверьте статус нод: `kubectl get nodes`
|
||
- Используйте talosctl для диагностики (требует talos config)
|