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.