This commit is contained in:
2025-08-10 21:15:19 +07:00
commit ec321d8e8a
9 changed files with 389 additions and 0 deletions

4
.env.example Normal file
View File

@@ -0,0 +1,4 @@
PROXMOX_VE_USERNAME="root@pam"
PROXMOX_VE_PASSWORD="password"
TALOS_CLUSTER_NAME=talos-nsk2

9
.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
.env
.terraform/
terraform.tfstate
terraform.tfstate.backup
.terraform.lock.hcl
.terraform.tfstate.lock.info
tfplan

199
README.md Normal file
View File

@@ -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 через <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)

7
cilium/ippool.yaml Normal file
View File

@@ -0,0 +1,7 @@
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
name: pool
spec:
blocks:
- cidr: 192.168.8.11/32

View File

@@ -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

34
cilium/values.yaml Normal file
View File

@@ -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

12
destroy.sh Executable file
View File

@@ -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

73
main.tf Normal file
View File

@@ -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 = [
<<EOT
cluster:
allowSchedulingOnControlPlanes: true
network:
cni:
name: none
proxy:
disabled: true
EOT
]
control_machine_config_patches = [
<<EOT
cluster:
allowSchedulingOnControlPlanes: true
network:
cni:
name: none
proxy:
disabled: true
EOT
]
proxmox_control_vm_disk_size = 30
proxmox_worker_vm_disk_size = 30
control_nodes = {
"talos-cp-1" = "pve2-nsk"
}
worker_nodes = {
"talos-worker-1" = "pve2-nsk"
"talos-worker-2" = "pve2-nsk"
}
}
output "talos_config" {
description = "Talos configuration file"
value = module.talos.talos_config
sensitive = true
}
output "kubeconfig" {
description = "Kubeconfig file"
value = module.talos.kubeconfig
sensitive = true
}

40
start.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
source .env
export PROXMOX_VE_USERNAME=${PROXMOX_VE_USERNAME}
export PROXMOX_VE_PASSWORD=${PROXMOX_VE_PASSWORD}
tfplan=$(terraform plan -out=tfplan)
echo "$tfplan"
read -p "Apply? (y/n): " apply
if [ "$apply" == "y" ]; then
terraform apply tfplan
fi
read -p "Save kubeconfig? (y/n): " save_kubeconfig
if [ "$save_kubeconfig" == "y" ]; then
terraform output -raw kubeconfig > ~/.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