Kured (KUbernetes REboot Daemon) est un DaemonSet Kubernetes qui orchestre les redémarrages de nœuds nécessaires après les mises à jour système (patches de sécurité, kernel updates). Sur chaque nœud, Kured surveille la présence du fichier sentinel /var/run/reboot-required (Ubuntu/Debian) ou d'un fichier configurable. Quand un nœud doit redémarrer, Kured coordonne la séquence : il acquiert un verrou distribué (via une annotation sur son pod propre), cordon le nœud, drain les pods, déclenche le reboot, attend le retour du nœud, puis uncordon - en s'assurant qu'un seul nœud redémarre à la fois.
Informations essentielles
Origine : Weaveworks → kubereboot (communauté) · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases
Support : Communauté active (org kubereboot). Projet transféré depuis weaveworks/kured.
Stack par défaut
| Composant | Valeur |
|---|---|
| Type | DaemonSet (un pod par nœud) |
| Déclencheur | Fichier sentinel sur le nœud (configurable) |
| Sentinel Ubuntu/Debian | /var/run/reboot-required |
| Coordination | Annotation sur le pod du DaemonSet (verrou distribué) |
| Séquence | cordon → drain → reboot → uncordon |
| Notifications | Slack, Teams, Prometheus alert |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.18+ |
| OS nœuds | Ubuntu/Debian (sentinel natif) ou OS avec script personnalisé |
| Droits RBAC | nodes get/patch, pods/eviction create |
Installation
helm repo add kubereboot https://kubereboot.github.io/charts
helm repo update
helm install kured kubereboot/kured \
--namespace kube-system \
--set configuration.rebootSentinel=/var/run/reboot-required
# Vérifier - un pod par nœud
kubectl get daemonset -n kube-system kured
kubectl get pods -n kube-system -l app.kubernetes.io/name=kured
Configuration Helm (valeurs courantes)
# values.yaml
configuration:
# Fichier sentinel à surveiller
rebootSentinel: /var/run/reboot-required
# Fenêtre de maintenance (ex: reboots autorisés entre 2h et 5h du matin)
startTime: "2:00"
endTime: "5:00"
timeZone: Europe/Paris
# Jours autorisés (lundi à vendredi uniquement)
rebootDays: [mon,tue,wed,thu,fri]
# Délai avant de redémarrer après un drain réussi
rebootDelay: 5s
# Délai entre chaque vérification du fichier sentinel
period: 1h
# Empêcher le reboot si des pods sont NotReady dans le cluster
blockingPodSelector:
- matchLabels:
critical: "true"
# Notification Slack
# slackHookUrl: https://hooks.slack.com/services/xxx
# slackUsername: kured
helm install kured kubereboot/kured \
--namespace kube-system \
-f values.yaml
Contrôle manuel du reboot
# Empêcher Kured de redémarrer un nœud spécifique
kubectl annotate node my-node \
weave.works/kured-reboot-blocked=true
# Retirer le blocage
kubectl annotate node my-node \
weave.works/kured-reboot-blocked-
# Forcer immédiatement le reboot (ignorer fenêtre de maintenance)
# Créer le fichier sentinel sur le nœud via DaemonSet ou connexion SSH
ssh my-node "sudo touch /var/run/reboot-required"
# Suspendre tous les reboots (mode lock global)
kubectl annotate daemonset kured \
-n kube-system \
weave.works/kured-node-lock="manual-lock"
Prometheus metrics
Kured expose des métriques sur le port 8080 :
# Métriques disponibles
# kured_reboot_required_nodes - Nœuds nécessitant un reboot
# kured_reboot_in_progress - Reboot en cours (0 ou 1)
# kured_blocked_reboots_total - Total des reboots bloqués
# prometheus.yml - scrape kured
scrape_configs:
- job_name: kured
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
action: keep
regex: kured
Mise à jour
helm repo update
helm upgrade kured kubereboot/kured \
--namespace kube-system \
--reuse-values
Troubleshooting
# Logs d'un pod Kured (choisir le pod sur le nœud concerné)
kubectl logs -n kube-system kured-xxxxx
# Vérifier si le verrou est tenu (nœud en cours de reboot)
kubectl get pod -n kube-system -l app.kubernetes.io/name=kured \
-o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations}{"\n"}{end}'
# Nœud drainé mais pas redémarré
# Vérifier les logs pour "Failed to drain node" ou "eviction failed"
# Des PodDisruptionBudgets peuvent bloquer le drain
# Vérifier les PDB qui bloquent
kubectl get poddisruptionbudget -A
kubectl describe poddisruptionbudget <nom> -n <ns>
# Sentinel présent mais Kured ne réagit pas
# Vérifier la fenêtre de maintenance (startTime/endTime)
# Vérifier que period ne bloque pas (attente entre checks)
Ressources
- Site officiel : https://kured.dev
- Documentation : https://kured.dev/docs/
- GitHub : https://github.com/kubereboot/kured
- Releases : https://github.com/kubereboot/kured/releases