From ec321d8e8a307cf09d7566e16dd1c457e911b215 Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Sun, 10 Aug 2025 21:15:19 +0700 Subject: [PATCH] init --- .env.example | 4 + .gitignore | 9 ++ README.md | 199 +++++++++++++++++++++++++++++ cilium/ippool.yaml | 7 + cilium/l2-announcement-policy.yaml | 11 ++ cilium/values.yaml | 34 +++++ destroy.sh | 12 ++ main.tf | 73 +++++++++++ start.sh | 40 ++++++ 9 files changed, 389 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 cilium/ippool.yaml create mode 100644 cilium/l2-announcement-policy.yaml create mode 100644 cilium/values.yaml create mode 100755 destroy.sh create mode 100644 main.tf create mode 100755 start.sh diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..70f3732 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +PROXMOX_VE_USERNAME="root@pam" +PROXMOX_VE_PASSWORD="password" + +TALOS_CLUSTER_NAME=talos-nsk2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a8afec --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.env + +.terraform/ + +terraform.tfstate +terraform.tfstate.backup +.terraform.lock.hcl +.terraform.tfstate.lock.info +tfplan diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b9c8d1 --- /dev/null +++ b/README.md @@ -0,0 +1,199 @@ +# 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 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) diff --git a/cilium/ippool.yaml b/cilium/ippool.yaml new file mode 100644 index 0000000..0f4a7a4 --- /dev/null +++ b/cilium/ippool.yaml @@ -0,0 +1,7 @@ +apiVersion: cilium.io/v2alpha1 +kind: CiliumLoadBalancerIPPool +metadata: + name: pool +spec: + blocks: + - cidr: 192.168.8.11/32 diff --git a/cilium/l2-announcement-policy.yaml b/cilium/l2-announcement-policy.yaml new file mode 100644 index 0000000..3c294bf --- /dev/null +++ b/cilium/l2-announcement-policy.yaml @@ -0,0 +1,11 @@ +apiVersion: cilium.io/v2alpha1 +kind: CiliumL2AnnouncementPolicy +metadata: + name: policy1 +spec: + nodeSelector: + matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: DoesNotExist + externalIPs: true + loadBalancerIPs: true diff --git a/cilium/values.yaml b/cilium/values.yaml new file mode 100644 index 0000000..c95df54 --- /dev/null +++ b/cilium/values.yaml @@ -0,0 +1,34 @@ +ipam: + mode: kubernetes +kubeProxyReplacement: true +securityContext: + capabilities: + ciliumAgent: + - CHOWN + - KILL + - NET_ADMIN + - NET_RAW + - IPC_LOCK + - SYS_ADMIN + - SYS_RESOURCE + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + cleanCiliumState: + - NET_ADMIN + - SYS_ADMIN + - SYS_RESOURCE +cgroup: + autoMount: + enabled: false + hostRoot: /sys/fs/cgroup +k8sServiceHost: 127.0.0.1 +k8sServicePort: 7445 +l2announcements: + enabled: true +hubble: + relay: + enabled: true + ui: + enabled: true diff --git a/destroy.sh b/destroy.sh new file mode 100755 index 0000000..eb330d9 --- /dev/null +++ b/destroy.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +source .env + +export PROXMOX_VE_USERNAME=${PROXMOX_VE_USERNAME} +export PROXMOX_VE_PASSWORD=${PROXMOX_VE_PASSWORD} + +terraform destroy -auto-approve + +if [ -f ~/.kube/${TALOS_CLUSTER_NAME}.yaml ]; then + rm ~/.kube/${TALOS_CLUSTER_NAME}.yaml +fi diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..3c39097 --- /dev/null +++ b/main.tf @@ -0,0 +1,73 @@ +terraform { + required_providers { + proxmox = { + source = "bpg/proxmox" + version = "~> 0.75.0" + } + talos = { + source = "siderolabs/talos" + version = "~> 0.7.1" + } + } +} + +provider "proxmox" { + endpoint = "https://192.168.8.10:8006/" + insecure = true +} + +module "talos" { + source = "bbtechsys/talos/proxmox" + version = "0.1.5" + talos_cluster_name = "talos-nsk2" + talos_version = "1.10.6" + + proxmox_image_datastore = "nvme1" + proxmox_iso_datastore = "Images" + + worker_machine_config_patches = [ +< ~/.kube/${TALOS_CLUSTER_NAME}.yaml +fi + +read -p "Install Cilium? (y/n): " install_cilium +if [ "$install_cilium" == "y" ]; then + helm repo add cilium https://helm.cilium.io/ + helm repo update + helm upgrade \ + --kubeconfig ~/.kube/${TALOS_CLUSTER_NAME}.yaml \ + --install \ + cilium \ + cilium/cilium \ + --namespace kube-system \ + --values cilium/values.yaml \ + --set cluster.name=${TALOS_CLUSTER_NAME} \ + --set cluster.id=1 +fi + +read -p "Apply Cilium IP Pool and L2 Announcement Policy? (y/n): " apply_ip_pool +if [ "$apply_ip_pool" == "y" ]; then + kubectl apply -f cilium/ippool.yaml + kubectl apply -f cilium/l2-announcement-policy.yaml +fi