Automatisierung der Kubernetes-Host-Verwaltung mit Rancher System-Upgrade-Controller

Erik Kaisler
28. Mai 2025
Lesezeit: 11 min
Automatisierung der Kubernetes-Host-Verwaltung mit Rancher System-Upgrade-Controller

Die Verwaltung von Kubernetes-Clustern im großen Maßstab kann eine Herausforderung sein, insbesondere wenn es darum geht, die zugrunde liegenden Hosts auf dem neuesten Stand zu halten. Der Rancher System-Upgrade-Controller vereinfacht diesen Prozess, indem er Host-Upgrades auf eine Kubernetes-native Weise automatisiert. Dieses Tool nutzt Kubernetes-Ressourcen, um Upgrades zu orchestrieren, und sorgt so für minimale Ausfallzeiten und konsistente Konfigurationen in Ihrem Cluster.

In diesem Artikel erfahren Sie, wie der System-Upgrade-Controller funktioniert, welche Funktionen er hat und wie Sie ihn einrichten können, um Ihre Kubernetes-Host-Verwaltungsaufgaben zu rationalisieren. Unabhängig davon, ob Sie einen kleinen Cluster oder eine große Umgebung verwalten, hilft Ihnen diese Anleitung, Upgrades effizient und sicher zu automatisieren.

Was ist der System-Upgrade-Controller?

Der System-Upgrade-Controller von Rancher ist ein Kubernetes-nativer Controller, mit dem Sie Ihre Kubernetes-Hosts mithilfe von Kubernetes-CRDs verwalten können. Egal, ob Sie Ihre Betriebssystemabhängigkeiten oder die Kubernetes-Version selbst aktualisieren, der System-Upgrade-Controller bietet eine breite Palette an Optionen, um diese Aufgaben zu vereinfachen.

Wie funktioniert der System-Upgrade-Controller?

Der System-Upgrade-Controller überwacht die plans.upgrade.cattle.io CRD. Diese Pläne spezifizieren die durchzuführenden Aktionen und die Zielknoten. Sobald ein Plan auf die in Frage kommenden Knoten angewendet wird, kennzeichnet der Controller die Knoten mit einem Hash der Konfiguration des Plans. Dieser Mechanismus stellt sicher, dass jeder Plan nur einmal pro Knoten für eine bestimmte Konfiguration ausgeführt wird, um redundante Upgrades zu verhindern.

Der System-Upgrade-Controller arbeitet in einem unkomplizierten Arbeitsablauf:

  • Planerstellung: Definieren Sie einen Plan mit dem Plan-CRD, indem Sie den Upgrade-Auftrag z. B. durch Angabe von Image, Version und Knotenauswahlkriterien spezifizieren.
  • Ausführung des Plans: Der Kontrolleur wendet den Plan auf die in Frage kommenden Knoten an und sorgt für ein kontrolliertes Rollout.
  • Knoten-Labeling: Sobald ein Knoten erfolgreich aktualisiert wurde, wird er mit der gehashten Konfiguration des Plans gekennzeichnet, um redundante Ausführungen zu vermeiden.
System-Upgrade-Controller-Workflow

Warum brauche ich es?

Während Sie Upgrades mit Dingen wie Kubernetes Jobs oder Ansible verwalten könnten, bietet der System-Upgrade-Controller einen Kubernetes-nativen Ansatz, der die Dinge einfach hält. Durch die Verwendung von CRDs können Sie Upgrades deklarativ über GitOps-Workflows integrieren. Außerdem erhalten neue Knoten, die dem Cluster hinzugefügt werden, automatisch die entsprechenden Upgrade-Pläne, wodurch die Konsistenz Ihrer gesamten Infrastruktur gewährleistet wird.

Erste Schritte mit SUC

Installation SUC

kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml
kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/crd.yaml

Jetzt können wir mit der Planung beginnen.

Hinweis: Die Pläne müssen in demselben Namespace erstellt werden, in dem die Steuerung bereitgestellt wurde.

Beispiel-Pläne

Aktualisieren von Kubernetes-Versionen

Hier ist ein Beispiel für einen Plan zum Upgrade eines RKE2-Clusters. Dieser Plan aktualisiert die Kubernetes-Kontrollebene und die Arbeitsknoten mithilfe von SUC.

apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: server-plan
  namespace: system-upgrade
  labels:
    rke2-upgrade: server
spec:
  # specify the image and version of the container running the upgrade
  upgrade:
    image: rancher/rke2-upgrade
  version: v1.32.2+rke2r1

  # how many nodes will run the upgrade simultaneously
  concurrency: 1
  # enable/disable cordon on node
  cordon: true
  
  serviceAccountName: system-upgrade
  
  # which nodes the plan is targeted for
  nodeSelector:
    matchExpressions:
      - key: node-role.kubernetes.io/control-plane
        operator: In
        values:
          - "true"
  
  tolerations:
    - effect: NoExecute
      key: CriticalAddonsOnly
      operator: Equal
      value: "true"
    - effect: NoSchedule
      key: node-role.kubernetes.io/control-plane
      operator: Exists
    - effect: NoExecute
      key: node-role.kubernetes.io/etcd
      operator: Exists
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: agent-plan
  namespace: system-upgrade
  labels:
    rke2-upgrade: agent
spec:
  # specify the image and version of the container running the upgrade
  upgrade:
    image: rancher/rke2-upgrade
  version: v1.32.2+rke2r1

  # init-container which will wait for the `server-plan` to be finished before this plan can be applied
  prepare:
    args:
      - prepare
      - server-plan
    image: rancher/rke2-upgrade

  # how many nodes will run the upgrade simultaneously
  concurrency: 1
  # enable/disable cordon on node
  cordon: true
  # pass drain options
  # drain:
  #   force: false
  #   ignoreDaemonSets: true
  #   # ...

  
  serviceAccountName: system-upgrade
  
  # which nodes the plan is targeted for
  nodeSelector:
    matchExpressions:
      - key: beta.kubernetes.io/os
        operator: In
        values:
          - linux
      - key: node-role.kubernetes.io/worker
        operator: In
        values:
          - "true"
      - key: node-role.kubernetes.io/control-plane
        operator: NotIn
        values:
          - "true"

Bei der Anwendung auf den Cluster registriert der Controller die neu erstellten Pläne. Er sammelt alle Knoten, die mit den Selektoren übereinstimmen, und überprüft alle Knoten auf das entsprechende Label plan.upgrade.cattle.io/server-plan (Steuerebenen) / plan.upgrade.cattle.io/agent-plan (Arbeiter). Wenn er sieht, dass der Plan noch nicht angewendet wurde, holt sich der Controller einen nach dem anderen und wendet den Plan durch einen Job auf dem entsprechenden Knoten an. Der Job-Pod führt die Bilder und Skripte aus, die die Arbeit verrichten werden. Danach wird der Node wieder entschlüsselt und mit dem Hash der Plankonfiguration beschriftet. Erst nach diesen Schritten wird der nächste Knoten gepatcht.

Selbst wenn der erste Arbeitsknoten den Job zur gleichen Zeit erhält, wie der erste Kontrollplan-Knoten gepatcht wird, ist der Agentenplan so konfiguriert, dass er auf die Beendigung des Server-Plans wartet, bevor der erste Knoten gecordet und gepatcht wird.

Wenn sich nun der Plan ändert, stellt der Controller eine Fehlanpassung des Hashes fest und der Prozess beginnt von Neuem.

Ausführen von Bash-Skripten

Um ein Beispiel dafür zu geben, wie die Verwendung von benutzerdefinierten Bash-Skripten in Plänen aussehen könnte, hier ein weiteres Beispiel, das ubuntu os-packages aktualisiert.

apiVersion: v1
kind: Secret
metadata:
  name: upgrade-os
  namespace: system-upgrade
type: Opaque
stringData:
  # adding bash script
  # here could be anything
  # ex. adding reboot command if reboot-required
  upgrade.sh: |
    #!/bin/sh
    set -e

    apt update
    apt list --upgradable
    apt upgrade -y
    apt autoclean
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: upgrade-os
  namespace: system-upgrade
spec:
  # how many nodes will run the upgrade simultaneously
  concurrency: 1
  # enable/disable cordon on node
  # if reboot on reboot-required included into script, set this to true
  cordon: false

  # specify the image and version of the container running the upgrade
  # passing arguments to run the script
  upgrade:
    image: alpine:latest # change image tag
    command: ["chroot", "/host"]
    args: ["sh", "/run/cattle-system/secrets/upgrade-os/upgrade.sh"]
  # setting version to current date
  version: "$(date +'%Y-%m-%d-%H%M')"
  
  # mount script using secret
  secrets:
    - name: upgrade-os
      path: /host/run/cattle-system/secrets/upgrade-os

  serviceAccountName: system-upgrade
  
  # which nodes the plan is targeted for
  nodeSelector:
    matchExpressions:
      - key: beta.kubernetes.io/os
        operator: In
        values:
          - linux
  
  tolerations:
    - effect: NoExecute
      key: CriticalAddonsOnly
      operator: Equal
      value: "true"
    - effect: NoSchedule
      key: node-role.kubernetes.io/control-plane
      operator: Exists
    - effect: NoExecute
      key: node-role.kubernetes.io/etcd
      operator: Exists

Wenden Sie diese yaml wie folgt an, um die Datumseinfügung zu verarbeiten.

cat <<EOF | kubectl apply -f -
# yaml
EOF

Anwendungsfälle für SUC

Neben dem Upgrade von Kubernetes-Versionen kann der System-Upgrade-Controller auch für verschiedene Host-Management-Aufgaben eingesetzt werden, darunter:

  • Upgrades von Betriebssystemabhängigkeiten: Halten Sie die Pakete des Betriebssystems auf dem neuesten Stand, indem Sie Upgrade-Skripte oder Befehle zur Paketverwaltung ausführen.
  • Ausführung von benutzerdefinierten Skripten: Unterstützung von Kubernetes-Upgrades mit kubeadm oder anderen benutzerdefinierten Workflows.
  • Verwaltung der Host-Konfiguration: Anwenden von Sicherheitspatches, Aktualisieren von Konfigurationsdateien und Installieren der erforderlichen Softwarepakete auf allen Knoten.

Taking Automation to the Next Level

Um die Automatisierung noch weiter voranzutreiben, können Sie den System-Upgrade-Controller in ein automatisiertes Abhängigkeitsmanagement-Tool wie Renovate integrieren. Renovate kann Ihre Abhängigkeiten überwachen, einschließlich Kubernetes-Versionen und Container-Images, und automatisch Pull Requests oder Updates erstellen, wenn neue Versionen verfügbar sind. Durch die Kombination von Renovate mit SUC können Sie eine vollständig automatisierte Pipeline einrichten, die nicht nur Updates identifiziert, sondern diese auch nahtlos auf Ihre gesamte Infrastruktur anwendet.

Vorteile der Integration

  • Proaktive Updates: Bleiben Sie mit den neuesten Funktionen, Leistungsverbesserungen und Sicherheitspatches auf dem Laufenden, ohne manuell eingreifen zu müssen.
  • Konsistenz in verschiedenen Umgebungen: Stellen Sie sicher, dass auf allen Knoten in Ihrem Cluster dieselben Versionen ausgeführt werden, und verringern Sie so die Konfigurationsabweichung.
  • Geringerer operativer Aufwand: Durch die Automatisierung sowohl der Erkennung als auch der Anwendung von Updates wird der Zeitaufwand für routinemäßige Wartungsaufgaben minimiert.

Beispiel Workflow

  • Überwachung von Abhängigkeiten: Renovate durchsucht Ihre Repositories nach veralteten Abhängigkeiten, einschließlich Kubernetes-Manifesten und Container-Images.
  • Vorschlag zur Aktualisierung: Renovate erstellt Pull Requests mit aktualisierten Versionen, die überprüft und zusammengeführt werden können.
  • Automatisierter Rollout: Nach der Zusammenführung wendet SUC die Updates auf der Grundlage vordefinierter Pläne auf Ihre Clusterknoten an und gewährleistet so ein kontrolliertes und zuverlässiges Rollout.

Durch die Kombination dieser Tools können Sie ein robustes System für die Verwaltung Ihrer Kubernetes-Infrastruktur schaffen, mit dem sich Ihr Team auf höherwertige Aufgaben konzentrieren kann.

Schlussfolgerung

Der Rancher System-Upgrade-Controller ist ein leistungsstarkes Tool, das die Verwaltung von Kubernetes-Hosts automatisiert und gleichzeitig Konsistenz und Effizienz gewährleistet. Durch die Nutzung von Kubernetes-nativen CRDs vereinfacht es den Upgrade-Prozess und reduziert den Bedarf an manuellen Eingriffen. Egal, ob ein kleiner Cluster oder eine große Umgebung verwaltet wird, SUC hilft dabei, eine aktuelle und stabile Infrastruktur zu erhalten.

Benötigen Sie Hilfe bei der Kubernetes-Automatisierung?

Wir unterstützen Unternehmen bei der Konzeption, der Implementierung und dem Betrieb von Kubernetes-Clustern – einschließlich Upgrade-Strategien und GitOps-Integration.

Setzen Sie sich mit uns in Verbindung, um zu besprechen, wie wir Ihre Infrastrukturziele unterstützen können.