Installer k3s sur du baremetal - tutoriel étape par étape et avec Terraform

Installer little k3s Kubernetes sur un cluster homelab

Sommaire

Voici un walkthrough étape par étape de
l’installation d’un cluster K3s à 3 nœuds
sur des serveurs physiques (1 maître + 2 travailleurs).

Ce guide suppose que vous commencez avec une installation minimale
Linux
(p. ex., Ubuntu 22.04 ou Debian) sur chaque serveur,
et que vous souhaitez héberger vous-même votre plan de contrôle et vos charges de travail.

cluster Kubernetes sur serveurs physiques

K3s
est une
version légère de Kubernetes,
qui convient bien à ce petit laboratoire domestique.

⚙️ Topologie du cluster

Nom du nœud Rôle Hôte/IP
master-1 Serveur (Plan de contrôle) 192.168.1.100
worker-1 Agent (Nœud de travail) 192.168.1.101
worker-2 Agent (Nœud de travail) 192.168.1.102

✅ Prérequis

🧱 Matériel (Minimum):

  • CPU : 2 cœurs
  • RAM : 2 Go+ par nœud
  • Disque : 20 Go+ par nœud

🛠 Exigences du système d’exploitation :

  • Linux (Ubuntu 22.04, Debian 12, etc.)
  • curl, ssh et sudo installés
  • Accès root ou sudo

🧼 Réseau propre :

  • Assurez-vous que tous les nœuds peuvent résoudre et pinger les uns les autres par IP ou par nom d’hôte.

  • Désactivez le swap :

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

🚀 Installation étape par étape


📍 Étape 1 : Installer K3s sur le plan de contrôle (master-1)

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

Après l’installation :

sudo cat /var/lib/rancher/k3s/server/node-token
  • Cela vous donne le jeton d’adhésion nécessaire pour les nœuds de travail.

Vérifiez que le cluster fonctionne :

sudo kubectl get nodes

k3s inclut un kubectl installé en tant que k3s kubectl ou lié en tant que kubectl.


📍 Étape 2 : Installer les agents K3s (worker-1 & worker-2)

Répétez sur chaque nœud de travail :

Remplacez <MASTER_IP> et <NODE_TOKEN> par les valeurs de l’étape 1.

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

Exemples :

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

📍 Étape 3 : Vérifier le cluster depuis master-1

kubectl get nodes

Vous devriez voir :

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

🔐 (Optionnel) Activer la haute disponibilité (HA)

Pour une HA similaire à la production (optionnel dans les laboratoires domestiques) :

  • Utilisez une base de données externe (p. ex., MySQL/PostgreSQL/etcd).
  • Exécutez plusieurs nœuds serveurs avec l’indicateur --server et une base de données partagée.
  • Voir : Documentation K3s HA

🧪 Tester un déploiement

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

Vérifiez l’accès via curl http://<worker-ip>:<port> ou configurez MetalLB pour les adresses IP de chargeur externe.


🧰 Notes utiles

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

    • Copiez-le sur votre machine locale et export KUBECONFIG=... pour gérer à distance.
  • Services systemd :

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (sur les nœuds de travail)

💡 Extras (Optionnels)

  • K9s : Interface en terminal pour gérer Kubernetes : brew install k9s ou sudo snap install k9s

  • Tableau de bord : Activez-le avec des manifestes :

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB : Ajoutez le support de balanceur de charge pour les serveurs physiques :

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

📦 Nettoyage

Pour supprimer k3s :

# Sur le maître :
/usr/local/bin/k3s-uninstall.sh

# Sur le travailleur :
/usr/local/bin/k3s-agent-uninstall.sh

Installer un cluster K3s à 3 nœuds sur serveurs physiques avec Terraform

Voici un Terraform modèle
qui aide à provisionner un cluster K3s à 3 nœuds sur serveurs physiques en supposant que vous gérez des serveurs Linux déjà provisionnés (p. ex., dans votre LAN/laboratoire domestique) via SSH et Ansible. Terraform appellera des playbooks Ansible pour installer K3s.


🧱 Hypothèses


📁 Structure du répertoire

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 = "votre_utilisateur"
}

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

- hosts: workers
  become: yes
  tasks:
    - name: Rejoindre le cluster en tant que worker
      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 -        

Note : Vous pourriez avoir besoin d’ajuster l’accès aux variables d’IP ou de jeton selon les versions d’Ansible. Vous pouvez également générer le jeton sur le maître et le sauvegarder dans un fichier avant d’exécuter l’installation des travailleurs.


🚀 Comment exécuter

À partir du répertoire k3s-cluster/ :

terraform init
terraform apply

🧰 Améliorations (Optionnelles)

  • Utiliser une génération dynamique de l’inventaire (p. ex., depuis DHCP/dnsmasq).
  • Ajouter le déploiement de MetalLB via Ansible.
  • Ajouter des noms d’hôte et des fonctionnalités HA.
  • Remplacer avec un rôle Ansible comme xanmanning.k3s pour plus de flexibilité.

Liens utiles