---
categories: sysadmin
title: HowtoK3s
...
* Documentation : <https://docs.k3s.io/>
K3s est une distribution de Kubernetes légère et facile à installer (packagé dans un seul binaire).
On peut installer Kubernetes avec different composants, avec K3s, Rancher a fait un certain nombre de choix par défaut sur pour ses composant ce qui va grandement simplifier l'installation.
## Installation
Documentation : <https://docs.k3s.io/quick-start> et <https://docs.k3s.io/installation>
Prérequis :
* Il faut avoir un noyau récent qui supporte les CGroupv2 >= 5.8
* Vérifier la version de Iptable installée https://docs.k3s.io/known-issues#iptables
* Désactiver ufw si présent (les règles iptables de k3s passerons devant)
* Il faut mettre minifirewall à DOCKER='on'
> Attention k3s rajoutera ses règles iptables par-dessus ; il faut faire attention à ce qu'on expose si la machine est sur internet.
Pour installer, on peut simplement jouer le script d'installation qui va récupérer le binaire et mettre en place l'unité systemd ou openrc.
~~~{.bash}
### Installer
# curl -sfL https://get.k3s.io | sh -
### Installer, configurer et lancer avec des arguement (exemple)
curl -sfL https://get.k3s.io | K3S_TOKEN=12345 sh -s - server --flannel-backend none
~~~
On peut ensuite lancer k3s en mode server ou agent avec des options de configurations
~~~{.bash}
k3s server ...
~~~
### Mise à jour
On peut rejouer le script d'installation ou installer le binaire d'une version en particulier :
> **Attention** : si à l'installation, on a joué le script d'installation avec des arguments, il ne faut pas en donner cette fois-ci ! autrement, ils écraseront les anciens argument.
~~~{.bash}
# Jouer le script d'installation sans arguments ...
curl -sfL https://get.k3s.io | sh -
# Installer le binaire d'une version https://github.com/k3s-io/k3s/releases
$ tag=v1.29.0+k3s1
$ curl -Lo /usr/local/bin/k3s https://github.com/k3s-io/k3s/releases/download/${tag}/k3s; chmod a+x /usr/local/bin/k3s
~~~
## Configuration
Selon les besoins, on peut configurer K3s de différente manière en même temps :
* Au lancement avec des ENVs et argument
* Avec un fichier de configuration dans `/etc/rancher/k3s/config.yaml` ou des fichiers dans `/etc/rancher/k3s/config.yaml.d/*.yaml` (lu et appliqué dans l'ordre alphabétique : la dernière valeur lue pour une clef sera appliqué).
~~~{.ini}
$vim /etc/rancher/k3s/config.yaml
write-kubeconfig-mode: "0644"
disable:
- servicelb
# - traefik
# flannel-backend: none
# disable-kube-proxy: true
# disable-network-policy: true
~~~
On peut désactiver les composants par défaut de k3s comme :
* Traefik qui sert d'ingress, si on veut l'installer à la main, voir [/HowtoTraefik]() ou en utiliser un autre
* ServiceLB, qui va proxyfier les requêtes reçues pour les services de type LoabBalancer. Il va faire de regle iptables de DNAT vers les services pour cela
* Flannel, le CNI par défaut qui utilise VXLAN et iptables, on peut vouloir utiliser cilium à la place, auquel cas, il faut aussi désactiver kube-proxy et les network-policy.
## Administration
On peut relancer k3s avec systemctl, cela ne vas pas tuer les conteneurs qui y tourne mais seulement relancer le binaire.
Si on veut éteidre tout ce qui tourne dans k3s, il faut lancer le script dans `/usr/local/bin/k3s-killall.sh`
Afficher la liste des pods et les ressources qu'ils consomment : `# kubectl top pod --all-namespaces`.
On peut surveiller les events avec `kubectl get events -w`
## Optimisation
## Monitoring
### Nagios
### Munin
## Plomberie
### Rotation des certificats
* Documentation : <https://docs.k3s.io/cli/certificate>
Les certificats client et servers généré par K3S pour les composant kube sont valide un ans.
Il sont automatiquement renouvelé s'il sont à moins de 120 jours d'expirer lorsque k3s est redémarré.
Des warning sont visible dans les events de kube lorsque des certificats expire bientôt.
~~~
root@node01:~# kubectl get events
[…]
39m Warning CertificateExpirationWarning node/node01 Node certificates require attention - restart k3s on this node to trigger automatic rotation: supervisor/client-supervisor.crt: certificate CN=system:k3s-supervisor,O=system:masters expired at 2025-11-28T10:52:58Z, k3s-controller/client-k3s-controller.crt: certificate CN=system:k3s-controller expired at 2025-11-28T10:52:58Z, admin/client-admin.crt: certificate CN=system:admin,O=system:masters expired at 2025-11-28T10:52:58Z, cloud-controller/client-k3s-cloud-controller.crt: certificate CN=k3s-cloud-controller-manager expired at 2025-11-28T10:52:58Z, controller-manager/client-controller.crt: certificate CN=system:kube-controller-manager expired at 2025-11-28T10:52:58Z, etcd/client.crt: certificate CN=etcd-client expired at 2025-11-28T10:52:58Z, scheduler/client-scheduler.crt: certificate CN=system:kube-scheduler expired at 2025-11-28T10:52:58Z, kube-proxy/client-kube-proxy.crt: certificate CN=system:kube-proxy expired at 2025-11-28T10:52:58Z, api-server/client-kube-apiserver.crt: certificate CN=system:apiserver,O=system:masters expired at 2025-11-28T10:52:58Z, auth-proxy/client-auth-proxy.crt: certificate CN=system:auth-proxy expired at 2025-11-28T10:52:58Z
~~~
On peut vérifier l'état des certificats :
~~~
root@node01:~# k3s certificate check --output table
INFO[0000] Server detected, checking agent and server certificates
CERTIFICATE SUBJECT STATUS EXPIRES
----------- ------- ------ -------
client-scheduler.crt CN=system:kube-scheduler EXPIRED 2025-11-28T10:52:58Z
client-scheduler.crt CN=k3s-client-ca@1704731035 OK 2034-01-05T16:23:55Z
[…]
~~~
On peut forcer la rotation des certificats :
~~~
# Stop K3s
systemctl stop k3s
# Rotate certificates
k3s certificate rotate
# Start K3s
systemctl start k3s
~~~
## FAQ
### Activer le GC des images
Par défaut, kubernetes ne nettoie pas les anciennes images de conteneurs qui ont été tiré sur un noeud.
On peut vite arriver à saturer l'espace disque utilisé.
On peut activer le GC "garbage collection" des images de conteneurs.
Documentation <https://kubernetes.io/docs/concepts/architecture/garbage-collection/#containers-images>
Pour cela, il faut configurer le kubelet avec des arguments supplémentaire `/etc/rancher/k3s/config.yaml` :
~~~
"kubelet-arg":
- "image-gc-low-threshold=70"
- "image-gc-high-threshold=90"
- "feature-gates=ImageMaximumGCAge=true"
~~~
`high-threshold` correspond au seuil de remplissage a partir duquel le GC va se mettre en route, en supprimant les images les plus anciennes et non utilisé jusqu'a arriver au `low-threshold`.
### déplacer le databir de k3s
On peut vouloir déplacer le datadir de k3s, pour cela on pourra simplement creer un lien symbolique
~~~
# systemctl stop k3s
# /usr/local/bin/k3s-killall.sh
# mv /var/lib/rancher /home/
# ln -s /home/rancher /var/lib/rancher
# systemctl start k3s.service
~~~
> il faudra s'assurer d'avoir les bonnes options de montage pour /home dans cet exemple (les mêmes que pour /var)