OpenTofu – HA Kubernetes-Installation

Eine hochverfügbare (HA) Kubernetes-Installation besteht aus mindestens drei Control-Plane Nodes, deren State in einer replizierten etcd-Datenbank (Raft-Konsensus) gespeichert wird.

main.tf (Auszug)

# Token für die Verbindung zwischen den Control-Planes
variable "k3s_server_token" {
  type    = string
  default = "secret-master"
}

# Token für die Verbindung der Worker-Nodes zum Control-Plane
variable "k3s_agent_token" {
  type    = string
  default = "secret-agents"
}

# Erster Control-Plane (master-0) – initialisiert den Cluster
resource "hcloud_server" "k3s-master-0" {
  name        = "k3s-master-0"
  image       = "debian-13"
  server_type = "cx23"
  location    = "nbg1"
  # ...
  provisioner "remote-exec" {
    inline = [
      "curl -sfL https://get.k3s.io | K3S_TOKEN=${var.k3s_server_token} K3S_AGENT_TOKEN=${var.k3s_agent_token} sh -s - server --cluster-init"
    ]
  }
}

# Weitere Control-Planes (master-1, master-2) – verbinden sich mit master-0
resource "hcloud_server" "k3s-master" {
  for_each = { for server in range(1, 3) : server => "master-${server}" }
  # ...
  provisioner "remote-exec" {
    inline = [
      "curl -sfL https://get.k3s.io | K3S_TOKEN=${var.k3s_server_token} sh -s - server --server https://${hcloud_server.k3s-master-0.ipv4_address}:6443"
    ]
  }
}

Befehle

cd ~/kubernetes-tutorial/src/opentofu/k3s-installation/k3s-installation-ha-load-balancer
tofu init
tofu plan
tofu apply

tofu state list
tofu state show hcloud_server.k3s-master-0 | grep "ipv4_address"
ssh -i ../../schulung root@[ip-master-0]
kubectl get nodes
exit

kubeconfig einrichten

scp -i ../../schulung root@[ip-master-0]:/etc/rancher/k3s/k3s.yaml ~/.kube/config
vim ~/.kube/config   # server: https://[ip-master-0]:6443 eintragen
kubectl get nodes
tofu destroy