Kubernetes : kured

Bonjour à tous,

Aujourd'hui, un billet portant sur la mise en place de Kured.

Kured permet de pouvoir rebooter un working node proprement en faisant un drain des pods présent en fonction d'un planning configuré.

Documentation officielle : https://kured.dev/

Context : j'ai fais cette première configuration avec des worker nodes sous Ubuntu 22.04 puis passage sous Flatcar.

Le fonctionnement est assez simple : si le fichier surveillé (ici /var/run/reboot-required) est présent alors suivant la configuration faite, le reboot est appliqué après avoir purgé les conteneurs présents sur le node.

Pour commencer, il faut récupérer la dernière version du yaml d'installation de Kured :

latest=$(curl -s https://api.github.com/repos/kubereboot/kured/releases | jq -r '.[0].tag_name')
wget https://github.com/kubereboot/kured/releases/download/$latest/kured-$latest-dockerhub.yaml

On peut alors modifier les valeurs comme on le souhaite, de mon côté j'ai modifié ces entrées :

- --period=15m
- --reboot-sentinel=/var/run/reboot-required
- --reboot-command=/bin/systemctl reboot
- --reboot-days=sun
- --start-time=0:00
- --time-zone=Europe/Paris
- --log-format=text
- --metrics-port=8080

ATTENTION! Le paramètre reboot-sentinel est à changer en fonction des OS ou des configurations. Sous ubuntu c'est /var/run/reboot-required et sous Flatcar (exemple depuis la documentation) c'est /run/reboot-required.

Il faut appliquer le yaml pour effectuer l'installation :

root@k8s-master:~/k8s_yaml# kubectl apply -f k8s_kured/kured-1.14.0-dockerhub.yaml 
clusterrole.rbac.authorization.k8s.io/kured created
clusterrolebinding.rbac.authorization.k8s.io/kured created
role.rbac.authorization.k8s.io/kured created
rolebinding.rbac.authorization.k8s.io/kured created
serviceaccount/kured created
daemonset.apps/kured created

On vérifie que l'on a bien les pods :

root@k8s-master:~/k8s_yaml# kubectl get pods -n kube-system
NAME                                                  READY   STATUS    RESTARTS       AGE
coredns-5d78c9869d-dfg4j                              1/1     Running   2 (4d4h ago)   31d
coredns-5d78c9869d-q6qjd                              1/1     Running   2 (4d4h ago)   31d
etcd-k8s-master.adm.securmail.fr                      1/1     Running   2 (4d4h ago)   31d
kube-apiserver-k8s-master.adm.securmail.fr            1/1     Running   2 (4d4h ago)   31d
kube-controller-manager-k8s-master.adm.securmail.fr   1/1     Running   2 (4d4h ago)   31d
kube-proxy-bh789                                      1/1     Running   2 (4d4h ago)   31d
kube-proxy-h2bn9                                      1/1     Running   2 (4d4h ago)   31d
kube-proxy-srdbf                                      1/1     Running   2 (4d4h ago)   31d
kube-scheduler-k8s-master.adm.securmail.fr            1/1     Running   2 (4d4h ago)   31d
kured-6rcbf                                           1/1     Running   0              83s
kured-lcw5h                                           1/1     Running   0              83s
kured-z8qjh                                           1/1     Running   0              83s
metrics-server-75f45b4dd4-qfxjr                       1/1     Running   0              5h12m
openebs-lvm-controller-0                              5/5     Running   2 (4d4h ago)   4d4h

La configuration est en daemon set :

kubectl describe daemonset kured -n kube-system
Name:           kured
Selector:       name=kured
Node-Selector:  <none>
Labels:         <none>
Annotations:    deprecated.daemonset.template.generation: 2
Desired Number of Nodes Scheduled: 3
Current Number of Nodes Scheduled: 3
Number of Nodes Scheduled with Up-to-date Pods: 3
Number of Nodes Scheduled with Available Pods: 3
Number of Nodes Misscheduled: 0
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:           name=kured
  Service Account:  kured
  Containers:
   kured:
    Image:      ghcr.io/kubereboot/kured:1.14.0
    Port:       8080/TCP
    Host Port:  0/TCP
    Command:
      /usr/bin/kured
      --period=15m
      --reboot-sentinel=/var/run/reboot-required
      --reboot-command=/bin/systemctl reboot
      --reboot-days=sun
      --start-time=0:00
      --time-zone=Europe/Paris
      --log-format=text
      --metrics-port=8080
    Environment:
      KURED_NODE_ID:   (v1:spec.nodeName)
    Mounts:           <none>
  Volumes:            <none>
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulDelete  17s   daemonset-controller  Deleted pod: kured-rxls9
  Normal  SuccessfulCreate  16s   daemonset-controller  Created pod: kured-qq6cd
  Normal  SuccessfulDelete  15s   daemonset-controller  Deleted pod: kured-lcw5h
  Normal  SuccessfulCreate  15s   daemonset-controller  Created pod: kured-vsltt
  Normal  SuccessfulDelete  14s   daemonset-controller  Deleted pod: kured-g57wp
  Normal  SuccessfulCreate  14s   daemonset-controller  Created pod: kured-qnph4

Si on veut faire évoluer la configuration, soit on rejoue le fichier yaml soit on peut éditer le daemon set :

kubectl edit daemonset kured -n kube-system

Ce qui va recréer les pods kured.

Il reste maintenant à faire les upgrade côté OS et attendre que Kured fasse le nécessaire.

Normalement, vous avez un cycle d'update/upgrade propre et automatique.

Have fun.