OpenTofu – Control-Plane mit Worker-Nodes

Erstellt einen k3s Cluster mit einem Control-Plane und n Worker-Nodes. Die Anzahl der Nodes ist über eine Variable konfigurierbar.

main.tf

variable "k3s_agent_token" {
  type    = string
  default = "secret"
}

variable "k3s_node_count" {
  type    = number
  default = 2
}

data "hcloud_ssh_key" "schulung" {
  name = "schulung"
}

resource "hcloud_server" "k3s_control_plane" {
  name        = "k3s-control-plane"
  image       = "debian-13"
  server_type = "cx23"
  location    = "nbg1"
  public_net {
    ipv4_enabled = true
    ipv6_enabled = false
  }
  ssh_keys = [data.hcloud_ssh_key.schulung.name]
  provisioner "remote-exec" {
    inline = [
      "curl -sfL https://get.k3s.io | K3S_AGENT_TOKEN=${var.k3s_agent_token} sh -"
    ]
    connection {
      type        = "ssh"
      host        = self.ipv4_address
      user        = "root"
      private_key = file("../../${data.hcloud_ssh_key.schulung.name}")
    }
  }
}

resource "hcloud_server" "k3s_node" {
  for_each    = { for node in range(1, var.k3s_node_count + 1) : node => "node-${node}" }
  name        = "k3s-${each.value}"
  image       = "debian-13"
  server_type = "cx23"
  location    = "nbg1"
  public_net {
    ipv4_enabled = true
    ipv6_enabled = false
  }
  ssh_keys = [data.hcloud_ssh_key.schulung.name]
  provisioner "remote-exec" {
    inline = [
      "curl -sfL https://get.k3s.io | K3S_URL=https://${hcloud_server.k3s_control_plane.ipv4_address}:6443 K3S_TOKEN=${var.k3s_agent_token} sh -"
    ]
    connection {
      type        = "ssh"
      host        = self.ipv4_address
      user        = "root"
      private_key = file("../../${data.hcloud_ssh_key.schulung.name}")
    }
  }
}

Befehle

cd ~/kubernetes-tutorial/src/opentofu/k3s-installation/k3s-installation-multi
tofu init
tofu plan -var k3s_node_count=3
tofu apply -var k3s_node_count=3

tofu state list
kubectl get nodes
tofu destroy