Compare commits

...

2 Commits

6 changed files with 38 additions and 60 deletions

View File

@ -1,51 +1,51 @@
Что содержит проект
Модуль OpenTofu для создания Kubernetes-нод в Proxmox.
Генерацию cloud-init конфигураций.
Параметризованную выдачу VMID, IP, hostname.
Готовый root-конфиг, использующий модуль k8s-node.
Возможность добавлять и удалять конкретные ноды без count.
Подготовку виртуальных машин к установке Kubernetes.
Структура репозитория
├── README.md
├── locals.tf
├── main.tf
├── modules
│ └── k8s-node
│ ├── cloud-config
│ ├── locals.tf
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── outputs.tf
├── providers.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── terraform.tfvars
└── variables.tf
Быстрый старт
1. Инициализация проекта
tofu init
2. Проверка плана
tofu plan
3. Создание инфраструктуры
tofu apply
1. Инициализация проекта
```
tofu init
```
2. Проверка плана
```
tofu plan
```
3. Создание инфраструктуры
```
tofu apply
```
После выполнения этой команды Proxmox создаст виртуальные машины, сгенерирует userdata для cloud-init и развернёт требуемые ноды.
Управление нодами
Модуль принимает объект вида:
```
nodes = {
master1 = { role = "master", cpu = 2, memory = 4096 }
worker1 = { role = "worker", cpu = 2, memory = 4096 }
worker2 = { role = "worker", cpu = 2, memory = 4096 }
}
master1 = { role = "master", cpu = 2, memory = 4096 }
worker1 = { role = "worker", cpu = 2, memory = 4096 }
worker2 = { role = "worker", cpu = 2, memory = 4096 }
}
```
Вы можете:
Добавить новую ноду, просто вписав её в map.
Удалить ноду, удалив её ключ из map.
Иметь несколько кластеров, копируя модуль в разные окружения.

View File

@ -4,6 +4,7 @@ locals {
nodes = {
master1 = {
role = "master"
index = 1
cpu = var.master_cpu
memory = var.master_memory
disk = var.master_disk
@ -12,6 +13,7 @@ locals {
}
worker1 = {
index = 1
role = "worker"
cpu = var.worker_cpu
memory = var.worker_memory
@ -20,16 +22,8 @@ locals {
ip_offset = var.worker_ip_offset
}
# worker2 = {
# role = "worker"
# cpu = var.worker_cpu
# memory = var.worker_memory
# disk = var.worker_disk
# datastore = var.worker_datastore
# ip_offset = var.worker_ip_offset
# }
worker3 = {
index = 3
role = "worker"
cpu = var.worker_cpu
memory = var.worker_memory

View File

@ -1,37 +1,18 @@
locals {
# ssh-ключ приходит снаружи, файл не читаем
ssh_public_key = var.ssh_key
nodes = var.nodes
# Разделяем ноды по ролям
masters = {
for name, node in var.nodes :
for name, node in local.nodes :
name => node if node.role == "master"
}
workers = {
for name, node in var.nodes :
for name, node in local.nodes :
name => node if node.role == "worker"
}
# Даём каждой ноде индекс внутри своей роли (master1, master2, worker1...)
# Индекс определяется по отсортированным именам, чтобы был стабильным.
indexed_masters = {
for name, node in local.masters :
name => merge(node, {
index = index(sort(keys(local.masters)), name) + 1
})
}
indexed_workers = {
for name, node in local.workers :
name => merge(node, {
index = index(sort(keys(local.workers)), name) + 1
})
}
# Общая карта нод
nodes = merge(local.indexed_masters, local.indexed_workers)
# IP-адреса
ip_map = {
for name, node in local.nodes :

View File

@ -5,6 +5,7 @@ variable "ssh_key" {
variable "nodes" {
type = map(object({
role = string
index = number
cpu = number
memory = number
disk = number

1
terraform.tfstate Normal file

File diff suppressed because one or more lines are too long

1
terraform.tfstate.backup Normal file

File diff suppressed because one or more lines are too long