HowtoK3s.md

---
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)