init
This commit is contained in:
4
.env.example
Normal file
4
.env.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
PROXMOX_VE_USERNAME="root@pam"
|
||||||
|
PROXMOX_VE_PASSWORD="password"
|
||||||
|
|
||||||
|
TALOS_CLUSTER_NAME=talos-nsk2
|
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal 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
199
README.md
Normal 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
7
cilium/ippool.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: cilium.io/v2alpha1
|
||||||
|
kind: CiliumLoadBalancerIPPool
|
||||||
|
metadata:
|
||||||
|
name: pool
|
||||||
|
spec:
|
||||||
|
blocks:
|
||||||
|
- cidr: 192.168.8.11/32
|
11
cilium/l2-announcement-policy.yaml
Normal file
11
cilium/l2-announcement-policy.yaml
Normal 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
34
cilium/values.yaml
Normal 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
12
destroy.sh
Executable 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
73
main.tf
Normal 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
40
start.sh
Executable 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
|
Reference in New Issue
Block a user