terraform { required_providers { proxmox = { source = "Telmate/proxmox" version = "3.0.2-rc04" } random = { source = "hashicorp/random" version = "3.7.2" } kubernetes = { source = "hashicorp/kubernetes" version = "2.38.0" } helm = { source = "hashicorp/helm" version = "3.0.2" } } } provider "proxmox" { pm_api_url = var.proxmox_url pm_user = var.proxmox_user pm_password = var.proxmox_password pm_tls_insecure = var.proxmox_tls_insecure } # ---------------------- # Generate k3s token # ---------------------- resource "random_password" "k3s_token" { length = 32 special = false } # ---------------------- # Controller VM # ---------------------- resource "proxmox_vm_qemu" "controller" { name = "k3s-controller" target_node = var.target_nodes["controller"] clone_id = var.template_id full_clone = true cpu { cores = 2 sockets = 1 } memory = 1024 scsihw = "virtio-scsi-pci" os_type = "cloud-init" disks { scsi { scsi0 { disk { storage = var.storage size = "20G" } } } ide { ide1 { cloudinit { storage = var.storage } } } } network { id = 0 model = "virtio" bridge = var.bridge } ipconfig0 = "ip=${var.controller_ip}/${var.netmask},gw=${var.gateway}" ciuser = var.admin_user cipassword = var.admin_password sshkeys = var.ssh_public_key connection { type = "ssh" user = var.admin_user private_key = var.ssh_public_key host = var.controller_ip port = 22 } provisioner "remote-exec" { inline = [ "curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=\"server --cluster-init --token=${random_password.k3s_token.result} --write-kubeconfig-mode=644\" sh -" ] } } # ---------------------- # Worker 1 VM # ---------------------- resource "proxmox_vm_qemu" "worker1" { name = "k3s-worker1" target_node = var.target_nodes["worker1"] clone_id = var.template_id full_clone = true os_type = "cloud-init" cpu { cores = 2 sockets = 1 } memory = 1024 scsihw = "virtio-scsi-pci" disks { scsi { scsi0 { disk { storage = var.storage size = "20G" } } } ide { ide1 { cloudinit { storage = var.storage } } } } network { id = 0 model = "virtio" bridge = var.bridge } ipconfig0 = "ip=${var.worker1_ip}/${var.netmask},gw=${var.gateway}" ciuser = var.admin_user cipassword = var.admin_password sshkeys = var.ssh_public_key connection { type = "ssh" user = var.admin_user private_key = var.ssh_public_key host = var.worker1_ip port = 22 } provisioner "remote-exec" { inline = [ "curl -sfL https://${var.controller_ip}:6443 | K3S_URL=https://${var.controller_ip}:6443 K3S_TOKEN=${random_password.k3s_token.result} sh -" ] } } # ---------------------- # Worker 2 VM # ---------------------- resource "proxmox_vm_qemu" "worker2" { name = "k3s-worker2" target_node = var.target_nodes["worker2"] clone_id = var.template_id full_clone = true os_type = "cloud-init" cpu { cores = 2 sockets = 1 } memory = 1024 scsihw = "virtio-scsi-pci" disks { scsi { scsi0 { disk { storage = var.storage size = "20G" } } } ide { ide1 { cloudinit { storage = var.storage } } } } network { id = 0 model = "virtio" bridge = var.bridge } ipconfig0 = "ip=${var.worker2_ip}/${var.netmask},gw=${var.gateway}" ciuser = var.admin_user cipassword = var.admin_password sshkeys = var.ssh_public_key connection { type = "ssh" user = var.admin_user private_key = var.ssh_public_key host = var.worker2_ip port = 22 } provisioner "remote-exec" { inline = [ "curl -sfL https://${var.controller_ip}:6443 | K3S_URL=https://${var.controller_ip}:6443 K3S_TOKEN=${random_password.k3s_token.result} sh -" ] } } # ---------------------- # Kubernetes & Helm Providers (after cluster is ready) # ---------------------- provider "kubernetes" { config_path = "~/.kube/config" } provider "helm" { kubernetes = { config_path = "~/.kube/config" } } # ---------------------- # Namespaces # ---------------------- resource "kubernetes_namespace" "infra" { metadata { name = "infra" } } resource "kubernetes_namespace" "devops" { metadata { name = "devops" } } resource "kubernetes_namespace" "monitoring" { metadata { name = "monitoring" } } # ---------------------- # Ingress # ---------------------- resource "helm_release" "nginx_ingress" { name = "nginx-ingress" namespace = kubernetes_namespace.infra.metadata[0].name repository = "https://kubernetes.github.io/ingress-nginx" chart = "ingress-nginx" version = "4.10.0" } # ---------------------- # cert-manager # ---------------------- resource "helm_release" "cert_manager" { name = "cert-manager" namespace = kubernetes_namespace.infra.metadata[0].name repository = "https://charts.jetstack.io" chart = "cert-manager" version = "v1.15.1" values = [<