Packaging & Config

Kured

DaemonSet Kubernetes pour redémarrages automatiques coordonnés des nœuds après mises à jour OS - drain, cordon, reboot, fenêtres de maintenance. Apache 2.0.

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

ComposantValeur
TypeDaemonSet (un pod par nœud)
DéclencheurFichier sentinel sur le nœud (configurable)
Sentinel Ubuntu/Debian/var/run/reboot-required
CoordinationAnnotation sur le pod du DaemonSet (verrou distribué)
Séquencecordon → drain → reboot → uncordon
NotificationsSlack, Teams, Prometheus alert

Prérequis

RessourceValeur
Kubernetes1.18+
OS nœudsUbuntu/Debian (sentinel natif) ou OS avec script personnalisé
Droits RBACnodes 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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic