Installare k3s su baremetal - guida passo passo e con terraform

Installare little k3s Kubernetes su un cluster homelab

Indice

Ecco un passo-passo per l’installazione di un cluster K3s a 3 nodi su server bare-metal (1 master + 2 worker).

Questo tutorial assume che tu stia iniziando con un’installazione minima di Linux (ad esempio, Ubuntu 22.04 o Debian) su ogni server, e che desideri self-hostare il tuo piano di controllo e i carichi di lavoro.

cluster Kubernetes su server bare-metal

K3s è una versione leggera di Kubernetes, che si adatta bene a questo piccolo laboratorio domestico.

⚙️ Topologia del Cluster

Nome del Nodo Ruolo Hostname/IP
master-1 Server (Piano di Controllo) 192.168.1.100
worker-1 Agente (Nodo Worker) 192.168.1.101
worker-2 Agente (Nodo Worker) 192.168.1.102

✅ Prerequisiti

🧱 Hardware (Minimo):

  • CPU: 2 core
  • RAM: 2GB+ per nodo
  • Disco: 20GB+ per nodo

🛠 Requisiti del Sistema Operativo:

  • Linux (Ubuntu 22.04, Debian 12, ecc.)
  • curl, ssh e sudo installati
  • Accesso root o sudo

🧼 Reti pulite:

  • Assicurati che tutti i nodi possano risolvere e pingare gli altri per IP o hostname.

  • Disattiva lo swap:

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

🚀 Installazione Passo-passo


📍Passo 1: Installa K3s sul piano di controllo (master-1)

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

Dopo l’installazione:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Questo ti fornisce il token di unione necessario per i nodi worker.

Conferma che il cluster è in esecuzione:

sudo kubectl get nodes

k3s include un kubectl installato come k3s kubectl o collegato come kubectl.


📍Passo 2: Installa gli agenti K3s (worker-1 e worker-2)

Ripeti su ogni nodo worker:

Sostituisci <MASTER_IP> e <NODE_TOKEN> con i valori ottenuti nel passo 1.

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

Esempi:

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

📍Passo 3: Verifica il cluster da master-1

kubectl get nodes

Dovresti vedere:

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

🔐 (Opzionale) Abilita alta disponibilità (HA)

Per un’alta disponibilità simile a quella produttiva (opzionale nei laboratori domestici):

  • Utilizza un database esterno (es. MySQL/PostgreSQL/etcd).
  • Esegui più nodi server con il flag --server e un database condiviso.
  • Vedi: Documentazione K3s HA

🧪 Test di un deployment

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

Verifica l’accesso tramite curl http://<worker-ip>:<port> o configura MetalLB per gli indirizzi IP del LoadBalancer esterno.


🧰 Note utili

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

    • Copia sul tuo computer locale e export KUBECONFIG=... per gestire il cluster da lontano.
  • Servizi systemd:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (sui worker)

💡 Extra (Opzionali)

  • K9s: Interfaccia terminale per la gestione di Kubernetes: brew install k9s o sudo snap install k9s

  • Dashboard: Abilita con manifesti:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: Aggiungi supporto per il bilanciamento del carico su server bare-metal:

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

📦 Pulizia

Per rimuovere k3s:

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

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

Installa un cluster K3s a 3 nodi su server bare-metal con Terraform

Ecco un Terraform template che aiuta a fornire un cluster K3s a 3 nodi su server bare-metal assumendo che tu stia gestendo server Linux già configurati (es. in LAN/laboratorio domestico) tramite SSH e Ansible. Terraform invocherà playbook Ansible per installare K3s.


🧱 Assunzioni

  • Hai già:

    • 3 server con IP fissi, accessibili via SSH.
    • Accesso SSH (basato su chiavi).
    • Terraform e Ansible installati localmente.
  • Sistema operativo target: Ubuntu/Debian (può essere personalizzato).

  • Stai utilizzando Terraform local-exec o plugin provisioner Ansible (useremo local-exec qui per portabilità).


📁 Struttura delle directory

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: Installa k3s master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Ottieni node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Unisci il worker al cluster
      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 -        

Nota: Potresti dover modificare l’accesso alle variabili IP o token a seconda delle versioni di Ansible. Puoi anche generare il token sul master e salvarlo in un file prima di eseguire l’installazione dei worker.


🚀 Come eseguire

Dalla directory k3s-cluster/:

terraform init
terraform apply

🧰 Miglioramenti (Opzionali)

  • Utilizza la generazione dinamica dell’inventario (es. da DHCP/dnsmasq).
  • Aggiungi l’installazione di MetalLB tramite Ansible.
  • Aggiungi nomi host e funzionalità HA.
  • Sostituisci con un ruolo Ansible come xanmanning.k3s per una maggiore flessibilità.