Installation av k3s på bare metal - steg-för-steg genomgång och med Terraform

Installera liten k3s Kubernetes på hemma-labkluster

Sidinnehåll

Här är en steg-för-steg-guide för installation av en 3-nod K3s-kluster på bare-metal servrar (1 master + 2 workers).

Den här guiden antar att du börjar med en minimal Linux-installation (t.ex. Ubuntu 22.04 eller Debian) på varje server, och vill själv värdhosta ditt kontrollplan och arbetsbelastningar.

kubernetes baremetal cluster

K3s är en lättviktsvariant av Kubernetes, som passar bra för detta lilla hemma-lab.

⚙️ Klustertopologi

Nodnamn Roll Värdnamn/IP
master-1 Server (Kontrollplan) 192.168.1.100
worker-1 Agent (Worker Node) 192.168.1.101
worker-2 Agent (Worker Node) 192.168.1.102

✅ Förutsättningar

🧱 Hårdvara (Minimum):

  • CPU: 2 kärnor
  • RAM: 2GB+ per nod
  • Disk: 20GB+ per nod

🛠 OS-krav:

  • Linux (Ubuntu 22.04, Debian 12, etc.)
  • curl, ssh, och sudo installerat
  • Root- eller sudo-åtkomst

🧼 Rent nätverk:

  • Se till att alla noder kan lösa och pinga varandra via IP eller värdnamn.

  • Stäng av swap:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 Steg-för-steg installation


📍Steg 1: Installera K3s på kontrollplanet (master-1)

curl -sfL https://get.k3s.io | sh -

Efter installationen:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Detta ger dig anslutningstoken som behövs för worker-noderna.

Bekräfta att klustret körs:

sudo kubectl get nodes

k3s inkluderar en kubectl installerad som k3s kubectl eller länkad som kubectl.


📍Steg 2: Installera K3s-agenter (worker-1 & worker-2)

Upprepa på varje worker-nod:

Ersätt <MASTER_IP> och <NODE_TOKEN> med värden från steg 1.

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -

Exempel:

K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"

📍Steg 3: Verifiera klustret från master-1

kubectl get nodes

Du bör se:

NAME        STATUS   ROLES    AGE   VERSION
master-1    Ready    control  5m    v1.29.2+k3s1
worker-1    Ready    <none>   2m    v1.29.2+k3s1
worker-2    Ready    <none>   2m    v1.29.2+k3s1

🔐 (Valfritt) Aktivera hög tillgänglighet (HA)

För produktionsliknande HA (valfritt i hemma-lab):

  • Använd en extern databas (t.ex. MySQL/PostgreSQL/etcd).
  • Kör flera server-noder med --server flagga och delad databas.
  • Se: K3s HA Doc

🧪 Testa en distribution

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

Kontrollera åtkomst via curl http://<worker-ip>:<port> eller konfigurera MetalLB för externa LoadBalancer-IP:er.


🧰 Användbara anteckningar

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • Kopiera till din lokala maskin och export KUBECONFIG=... för att hantera på distans.
  • Systemd-tjänster:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (på workers)

💡 Extras (Valfritt)

  • K9s: Terminalgränssnitt för hantering av Kubernetes: brew install k9s eller sudo snap install k9s

  • Dashboard: Aktivera med manifest:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: Lägg till lastbalanseringsstöd för bare-metal:

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

📦 Rensning

För att ta bort k3s:

# På master:
/usr/local/bin/k3s-uninstall.sh

# På worker:
/usr/local/bin/k3s-agent-uninstall.sh

Installera 3-nod bare-metal K3s-kluster med Terraform

Här är en Terraform mall som hjälper till att tillhandahålla en 3-nod bare-metal K3s-kluster under antagandet att du hanterar redan tillhandahållna Linux-servrar (t.ex. i ditt LAN/hemma-lab) via SSH och Ansible. Terraform kommer att anropa Ansible playbooks för att installera K3s.


🧱 Antaganden

  • Du har redan:

    • 3 servrar med fasta IP-adresser, tillgängliga via SSH.
    • SSH-åtkomst (nyckelbaserad).
    • Terraform och Ansible installerat lokalt.
  • Mål-OS: Ubuntu/Debian (kan anpassas).

  • Du använder Terraform local-exec eller Ansible provisioner plugin (vi kommer att använda local-exec här för portabilitet).


📁 Katalogstruktur

k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│   └── install_k3s.yml
└── variables.tf

📄 variables.tf

variable "master_ip" {
  default = "192.168.1.100"
}

variable "worker_ips" {
  default = ["192.168.1.101", "192.168.1.102"]
}

variable "ssh_user" {
  default = "your_user"
}

variable "ssh_private_key" {
  default = "~/.ssh/id_rsa"
}

📄 main.tf

provider "null" {}

resource "null_resource" "install_k3s" {
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

📄 inventory.ini

[masters]
192.168.1.100

[workers]
192.168.1.101
192.168.1.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

📄 ansible/install_k3s.yml

---
- hosts: masters
  become: yes
  tasks:
    - name: Installera k3s master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Hämta node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Anslut worker till klustret
      shell: |
        curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -        

Notera: Du kan behöva justera IP eller token-variabelåtkomst beroende på Ansible-versioner. Du kan också generera token på master och spara den i en fil innan du kör worker-installationen.


🚀 Hur man kör

Från k3s-cluster/ katalogen:

terraform init
terraform apply

🧰 Förbättringar (Valfritt)

  • Använd dynamisk inventering (t.ex. från DHCP/dnsmasq).
  • Lägg till MetalLB-distribution via Ansible.
  • Lägg till värdnamn och HA-funktioner.
  • Byta mot Ansible roll som xanmanning.k3s för mer flexibilitet.

Användbara länkar