# 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 через ### Переменные окружения Создайте файл `.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, helm, kubectl 3. **Terraform Plan** - показ планируемых изменений 4. **Подтверждение и Apply** - создание инфраструктуры 5. **Сохранение kubeconfig** в `~/.kube/${TALOS_CLUSTER_NAME}.yaml` 6. **Установка Cilium** через Helm: - Добавление репозитория cilium - Обновление репозиториев - Установка с кастомными values 7. **Применение Cilium ресурсов**: - IP Pool для LoadBalancer - L2 Announcement Policy Скрипт автоматически проверяет наличие необходимых инструментов (terraform, helm, kubectl) и завершается с ошибкой если какой-либо инструмент отсутствует. ### 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)