Configurazione iniziale per cluster k8s su Proxmox
This commit is contained in:
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# File di stato locali
|
||||
*.tfstate
|
||||
*.tfstate.*
|
||||
|
||||
# Cartella che contiene i plugin
|
||||
.terraform/
|
||||
|
||||
# File di crash
|
||||
crash.log
|
||||
24
.terraform.lock.hcl
generated
Normal file
24
.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,24 @@
|
||||
# This file is maintained automatically by "tofu init".
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.opentofu.org/telmate/proxmox" {
|
||||
version = "3.0.1-rc2"
|
||||
constraints = "3.0.1-rc2"
|
||||
hashes = [
|
||||
"h1:FoQkRJvBaRnfmHbDQAuwdvd9sSoFM+UKDkX5UBg6fdc=",
|
||||
"zh:0158ecead8265f79ca069fcb7e9c07283545f90a09abe8a28a5944c2c9b8dc89",
|
||||
"zh:04731d141b77b0072bf650ee91670594f3ec93cf01c2612a5a3eecbda01e745e",
|
||||
"zh:06460b2b32b06684f3ce8416d328868cdc26f88c1e0379522fdf797ba7072ccf",
|
||||
"zh:15e9ece8a8106e32fa842f84494952298a24883b6dc164acdc375594ed4c3840",
|
||||
"zh:2ff19ed9d1b36d4890b3c036fa027f831889535e9e9c6bf7aa185423e620d93c",
|
||||
"zh:45efb6d48df0cab681677fa58557b964cbaec6b5a5acc5ff19f446760670c4ea",
|
||||
"zh:554351399ef605a708653d7d716ecc36d39e85088c37435b7f391a841e1bee93",
|
||||
"zh:5b78fe1f4e796cb56cbc6fc7e43e95d2ad0f46f86cb2a4795c617c73681f5374",
|
||||
"zh:61a379c5380f69d474b8a22fedd68f34e7df57ab24fdfcd0336a3a88e9d1706a",
|
||||
"zh:73cf31280728ee48b645c537de89881788c6e6aa6a9a2a9a09ec4510f594db2e",
|
||||
"zh:85e2f22617fa1450deeaefffe6d455f26054ab8a9a6a1eb1a5c50b51703304ec",
|
||||
"zh:a0cc2bd9581fcddc1f64692c9c431c652e4e0edc035a357aa1279788a8d580d0",
|
||||
"zh:b99a25084d77075dce5b32604953e4266fc8cdda9ec00cbb06f886331743b492",
|
||||
"zh:bcaace9bec999f869ecc308075c98139a5762b4a4f45541c7b59aa3df4f7484d",
|
||||
]
|
||||
}
|
||||
35
cloud-init-control-plane.yaml
Normal file
35
cloud-init-control-plane.yaml
Normal file
@@ -0,0 +1,35 @@
|
||||
#cloud-config
|
||||
package_update: true
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- apt-transport-https
|
||||
- ca-certificates
|
||||
- curl
|
||||
- containerd
|
||||
|
||||
runcmd:
|
||||
# Disabilita swap (richiesto da kubelet)
|
||||
- swapoff -a
|
||||
- sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
||||
|
||||
# Carica moduli del kernel e imposta sysctl
|
||||
- modprobe overlay
|
||||
- modprobe br_netfilter
|
||||
- echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
|
||||
- echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
|
||||
- sysctl -p
|
||||
|
||||
# Installa Kubernetes
|
||||
- curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
||||
- echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
|
||||
- apt-get update
|
||||
- apt-get install -y kubelet=${k8s_version} kubeadm=${k8s_version} kubectl=${k8s_version}
|
||||
- apt-mark hold kubelet kubeadm kubectl
|
||||
|
||||
# Inizializza il cluster con kubeadm
|
||||
- kubeadm init --pod-network-cidr=${pod_network_cidr} --apiserver-advertise-address=${advertise_ip}
|
||||
|
||||
# Configura kubectl per l'utente 'ubuntu' (o il tuo utente di default nel template)
|
||||
- mkdir -p /home/ubuntu/.kube
|
||||
- cp -i /etc/kubernetes/admin.conf /home/ubuntu/.kube/config
|
||||
- chown -R ubuntu:ubuntu /home/ubuntu/.kube
|
||||
25
cloud-init-script.yaml
Normal file
25
cloud-init-script.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
#cloud-config
|
||||
runcmd:
|
||||
- swapoff -a
|
||||
- sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
||||
- apt-get update -y
|
||||
- apt-get install -y apt-transport-https ca-certificates curl containerd
|
||||
- modprobe overlay
|
||||
- modprobe br_netfilter
|
||||
- |
|
||||
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
|
||||
net.bridge.bridge-nf-call-iptables = 1
|
||||
net.ipv4.ip_forward = 1
|
||||
net.bridge.bridge-nf-call-ip6tables = 1
|
||||
EOF
|
||||
- sysctl --system
|
||||
- curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
||||
- echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
|
||||
- apt-get update -y
|
||||
%{ if is_control_plane ~}
|
||||
- apt-get install -y kubelet=${k8s_version} kubeadm=${k8s_version} kubectl=${k8s_version}
|
||||
- apt-mark hold kubelet kubeadm kubectl
|
||||
%{ else ~}
|
||||
- apt-get install -y kubelet=${k8s_version} kubeadm=${k8s_version}
|
||||
- apt-mark hold kubelet kubeadm
|
||||
%{ endif ~}
|
||||
27
cloud-init-worker.yaml
Normal file
27
cloud-init-worker.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
#cloud-config
|
||||
package_update: true
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- apt-transport-https
|
||||
- ca-certificates
|
||||
- curl
|
||||
- containerd
|
||||
|
||||
runcmd:
|
||||
# Disabilita swap
|
||||
- swapoff -a
|
||||
- sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
||||
|
||||
# Carica moduli del kernel e imposta sysctl
|
||||
- modprobe overlay
|
||||
- modprobe br_netfilter
|
||||
- sysctl -p
|
||||
|
||||
# Installa Kubernetes
|
||||
- curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
||||
- echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
|
||||
- apt-get update
|
||||
- apt-get install -y kubelet=${k8s_version} kubeadm=${k8s_version}
|
||||
- apt-mark hold kubelet kubeadm
|
||||
|
||||
# Il passo finale (kubeadm join) andrà eseguito manualmente.
|
||||
144
main.tf
Normal file
144
main.tf
Normal file
@@ -0,0 +1,144 @@
|
||||
# main.tf
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "telmate/proxmox"
|
||||
version = "3.0.1-rc2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "proxmox" {
|
||||
pm_api_url = "https://192.168.178.11:8006/api2/json"
|
||||
pm_tls_insecure = true
|
||||
}
|
||||
|
||||
# --- Variabili Locali per una facile configurazione ---
|
||||
locals {
|
||||
proxmox_node = "Covenant"
|
||||
template_name = "debian-12-cloudinit"
|
||||
ssh_user = "debian"
|
||||
k8s_version = "1.29.3-1.1"
|
||||
gateway_ip = "10.66.99.254"
|
||||
dns_server = "10.66.99.254"
|
||||
ssh_public_key = file("~/.ssh/id_ecdsa.pub")
|
||||
ssh_private_key = file("~/.ssh/id_ecdsa")
|
||||
|
||||
control_planes = {
|
||||
Alessandro = { ip = "10.66.99.171", vmid = 451 }
|
||||
Rene = { ip = "10.66.99.172", vmid = 452 }
|
||||
Arianna = { ip = "10.66.99.173", vmid = 453 }
|
||||
}
|
||||
|
||||
workers = {
|
||||
Stanis = { ip = "10.66.99.175", vmid = 455 }
|
||||
Itala = { ip = "10.66.99.176", vmid = 456 }
|
||||
Duccio = { ip = "10.66.99.177", vmid = 457 }
|
||||
}
|
||||
}
|
||||
|
||||
# --- Nodi Control Plane ---
|
||||
resource "proxmox_vm_qemu" "k8s_control_planes" {
|
||||
for_each = local.control_planes
|
||||
|
||||
vmid = each.value.vmid
|
||||
name = each.key
|
||||
target_node = local.proxmox_node
|
||||
clone = local.template_name
|
||||
os_type = "cloud-init"
|
||||
agent = 1
|
||||
|
||||
cores = 2
|
||||
sockets = 1
|
||||
memory = 4096
|
||||
|
||||
# Blocco "disks" corretto (plurale)
|
||||
disks {
|
||||
scsi {
|
||||
scsi0 {
|
||||
disk {
|
||||
storage = "MD-3"
|
||||
size = 40
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
network {
|
||||
model = "virtio"
|
||||
bridge = "vmbr0"
|
||||
}
|
||||
|
||||
# Argomenti "flat" per la configurazione iniziale
|
||||
ipconfig0 = "ip=${each.value.ip}/24,gw=${local.gateway_ip}"
|
||||
nameserver = local.dns_server
|
||||
sshkeys = local.ssh_public_key
|
||||
|
||||
# Provisioner per eseguire lo script di setup
|
||||
provisioner "remote-exec" {
|
||||
connection {
|
||||
type = "ssh"
|
||||
user = local.ssh_user
|
||||
private_key = local.ssh_private_key
|
||||
host = self.default_ipv4_address
|
||||
}
|
||||
inline = split("\n", templatefile("cloud-init-script.yaml", {
|
||||
k8s_version = local.k8s_version
|
||||
is_control_plane = true
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
# --- Nodi Worker ---
|
||||
resource "proxmox_vm_qemu" "k8s_workers" {
|
||||
for_each = local.workers
|
||||
|
||||
vmid = each.value.vmid
|
||||
name = each.key
|
||||
target_node = local.proxmox_node
|
||||
clone = local.template_name
|
||||
os_type = "cloud-init"
|
||||
agent = 1
|
||||
|
||||
cores = 2
|
||||
sockets = 1
|
||||
memory = 2048
|
||||
|
||||
# Blocco "disks" corretto (plurale)
|
||||
disks {
|
||||
scsi {
|
||||
scsi0 {
|
||||
disk {
|
||||
storage = "MD-3"
|
||||
size = 25
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
network {
|
||||
model = "virtio"
|
||||
bridge = "vmbr0"
|
||||
}
|
||||
|
||||
# Argomenti "flat" per la configurazione iniziale
|
||||
ipconfig0 = "ip=${each.value.ip}/24,gw=${local.gateway_ip}"
|
||||
nameserver = local.dns_server
|
||||
sshkeys = local.ssh_public_key
|
||||
|
||||
# Provisioner per eseguire lo script di setup
|
||||
provisioner "remote-exec" {
|
||||
connection {
|
||||
type = "ssh"
|
||||
user = local.ssh_user
|
||||
private_key = local.ssh_private_key
|
||||
host = self.default_ipv4_address
|
||||
}
|
||||
inline = split("\n", templatefile("cloud-init-script.yaml", {
|
||||
k8s_version = local.k8s_version
|
||||
is_control_plane = false
|
||||
}))
|
||||
}
|
||||
depends_on = [proxmox_vm_qemu.k8s_control_planes]
|
||||
}
|
||||
Reference in New Issue
Block a user