← Übersicht  ·  Skripte & Dateien  ·  OpenShift · Betrieb · Backup

Cluster-Innereien: Logging, MachineConfig und etcd

Du verfolgst eine Logzeile durch ihre möglichen Speicherorte, ordnest einem Node seine gerenderte MachineConfig zu und erzeugst ein echtes etcd-Backup. Dabei bleibt klar getrennt, was du selbst anlegst, was der Cluster generiert und was du nur kennen oder sichern musst.

Stand: 5. September 2026OKD / OCP 4.xLogging 6.xAtlas G2, G4, G7ca. 45 Minuten

1 Drei Zustandsketten

Alle drei Themen beantworten dieselbe Betriebsfrage: Wo entsteht Zustand, wer hält ihn und wie kommst du im Fehlerfall wieder daran?

LoggingContainer schreibt nach Standardausgabe. CRI-O hält den lokalen Logstrom. Vector sammelt ihn optional ein. Ein ClusterLogForwarder leitet ihn an Loki oder ein externes Ziel weiter.
MachineConfigMehrere MachineConfig-Objekte beschreiben den Sollzustand. Der MCO erzeugt daraus eine rendered-master-…-Konfiguration. Der Machine Config Daemon wendet sie am Node an.
etcdDer API-Server speichert Kubernetes-Objekte in etcd. Das Skript cluster-backup.sh erzeugt Snapshot und Static-Pod-Ressourcen. Erst die externe Kopie macht daraus ein belastbares Backup.

Begriffe: Ein Daemon ist ein ständig laufender Hintergrundprozess. Ein MachineConfigPool, kurz MCP, fasst Nodes mit derselben Betriebssystem-Konfiguration zusammen. etcd ist die verteilte Schlüssel-Wert-Datenbank für alle API-Objekte des Clusters.

2 Gesundheit vor der Diagnose prüfen

Das Lab benötigt cluster-admin. Alle Befehle in diesem Abschnitt lesen nur.

Laptop · PowerShell oder Bash · nur lesen
oc whoami
oc auth can-i '*' '*' --all-namespaces
oc get nodes
oc get co machine-config etcd
oc get mcp
oc get pods -n openshift-etcd -o wide

Startzustand: Die ClusterOperatoren machine-config und etcd sollten Available=True und Degraded=False melden. Ein MCP ist vollständig abgeglichen, wenn UPDATED=True und UPDATING=False ist.

3 Einen Logpfad untersuchen

OpenShift kann aktuelle Container-Logs ohne zentralen Logging-Stack anzeigen. Diese Logs liegen zunächst am Node und verschwinden mit Rotation, Pod-Löschung oder Node-Verlust.

Laptop · PowerShell oder Bash · Anwendung
oc get pods -n library
oc logs -n library deployment/catalog-service --tail=50
oc logs -n library deployment/catalog-service --since=10m --timestamps

# nach einem Container-Neustart den vorherigen Container lesen
oc logs -n library pod/<pod-name> --previous --tail=50

oc logs fragt über den API-Server den Kubelet des Nodes ab. Der Kubelet ist der Node-Prozess, der Pods startet und ihren Zustand meldet. Er ist keine dauerhafte Logdatenbank.

Node- und Plattform-Logs

Laptop · PowerShell · Node
$node = oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}'
oc adm node-logs $node --unit=kubelet --tail=50
oc adm node-logs $node --unit=crio --tail=50
Bash-Variante anzeigen
Laptop · Bash · Node
node=$(oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}')
oc adm node-logs "$node" --unit=kubelet --tail=50
oc adm node-logs "$node" --unit=crio --tail=50
QuellezeigtÜberlebensgrenze
oc logsStandardausgabe eines aktuellen oder vorherigen Containerslokale Rotation und Node-Lebensdauer
kubelet-JournalPod-Start, Mounts, Probes und Node-AusführungJournal-Rotation am Node
crio-JournalImage, Sandbox und Container-RuntimeJournal-Rotation am Node
Loki oder externes Zielzentral gesammelte Anwendungs-, Infrastruktur- und Audit-LogsAufbewahrungsregel des Zielsystems

4 Erkennen, ob zentrales Logging installiert ist

OpenShift Logging ist nicht automatisch Bestandteil jedes Clusters. In Logging 6 verwaltet der Logging Operator Sammlung und Weiterleitung, der Loki Operator den Speicher und der Cluster Observability Operator die Anzeige.

Laptop · PowerShell · nur lesen
oc api-resources | Select-String -Pattern 'ClusterLogForwarder|LokiStack'
oc get csv -A | Select-String -Pattern 'logging|loki|observability'
oc get clusterlogforwarder -A
oc get lokistack -A
oc get pods -n openshift-logging
Bash-Variante anzeigen
Laptop · Bash · nur lesen
oc api-resources | grep -E 'ClusterLogForwarder|LokiStack'
oc get csv -A | grep -Ei 'logging|loki|observability'
oc get clusterlogforwarder -A
oc get lokistack -A
oc get pods -n openshift-logging

Versionsgrenze: Logging 6 verwendet für ClusterLogForwarder die API-Gruppe observability.openshift.io und Vector als Collector. Ältere Beispiele mit logging.openshift.io, ClusterLogging, Fluentd oder Elasticsearch gehören zur früheren Architektur. Prüfe immer zuerst oc api-resources | Select-String ClusterLogForwarder und oc explain clusterlogforwarder.spec.

Auf der kleinen SNO ist kein Logging-Stack die vernünftige Vorgabe. Loki benötigt dauerhaften Objektspeicher und zusätzliche Ressourcen. Für kurze Diagnose reicht oc logs. Für Aufbewahrung oder Audit muss ein zentraler Zielpfad geplant werden.

5 Node-Konfiguration zum Ursprung zurückverfolgen

Der Machine Config Operator, kurz MCO, verwaltet das Betriebssystem der RHCOS- oder SCOS-Nodes. Direkte SSH-Änderungen sind Drift und keine dauerhafte Konfiguration.

Laptop · PowerShell · nur lesen
oc get co machine-config
oc get mcp
oc get mc -o 'custom-columns=NAME:.metadata.name,GENERATED-BY:.metadata.ownerReferences[0].kind'

$node = oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}'
oc get node $node -o jsonpath='{.metadata.annotations.machineconfiguration\.openshift\.io/currentConfig}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/desiredConfig}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/state}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/reason}{"\n"}'

$rendered = oc get mcp master -o jsonpath='{.status.configuration.name}'
oc get mc $rendered -o yaml
Bash-Variante anzeigen
Laptop · Bash · nur lesen
oc get co machine-config
oc get mcp
oc get mc -o 'custom-columns=NAME:.metadata.name,GENERATED-BY:.metadata.ownerReferences[0].kind'

node=$(oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}')
oc get node "$node" -o jsonpath='{.metadata.annotations.machineconfiguration\.openshift\.io/currentConfig}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/desiredConfig}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/state}{"\n"}{.metadata.annotations.machineconfiguration\.openshift\.io/reason}{"\n"}'

rendered=$(oc get mcp master -o jsonpath='{.status.configuration.name}')
oc get mc "$rendered" -o yaml
KategorieBeispieldeine Aufgabe
du legst anmachineconfig-mco-lab.yamlgewollte Node-Änderung als deklaratives Manifest beschreiben
wird generiertrendered-master-…nur lesen. Der MCO kombiniert alle zur Rolle passenden MachineConfigs
wichtig/etc/mco-lab-marker am NodeWirkung prüfen, aber nicht per SSH als dauerhafte Konfiguration anlegen

6 Eine MachineConfig sicher proben

Du legst lokal ein Manifest an und lässt nur API-Schema und Admission prüfen. Der Dry-Run erzeugt kein Clusterobjekt und löst keinen Node-Neustart aus.

Laptop · PowerShell · erzeugt lokale Datei
@'
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  name: 99-master-mco-lab
  labels:
    machineconfiguration.openshift.io/role: master
spec:
  config:
    ignition:
      version: 3.4.0
    storage:
      files:
        - path: /etc/mco-lab-marker
          mode: 420
          overwrite: true
          contents:
            source: data:text/plain;charset=utf-8,mco-lab%0A
'@ | Set-Content -LiteralPath .\machineconfig-mco-lab.yaml -Encoding utf8

oc apply --dry-run=server -f .\machineconfig-mco-lab.yaml
oc diff -f .\machineconfig-mco-lab.yaml
Bash-Variante anzeigen
Laptop · Bash · erzeugt lokale Datei
cat > machineconfig-mco-lab.yaml <<'EOF'
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  name: 99-master-mco-lab
  labels:
    machineconfiguration.openshift.io/role: master
spec:
  config:
    ignition:
      version: 3.4.0
    storage:
      files:
        - path: /etc/mco-lab-marker
          mode: 420
          overwrite: true
          contents:
            source: data:text/plain;charset=utf-8,mco-lab%0A
EOF

oc apply --dry-run=server -f machineconfig-mco-lab.yaml
oc diff -f machineconfig-mco-lab.yaml

machineconfig-mco-lab.yaml ist eine Datei, die du anlegst. /etc/mco-lab-marker würde erst bei einem echten Apply vom MCO generiert. Der Rückgabecode 1 von oc diff bedeutet normalerweise „Unterschied gefunden“ und ist hier kein Fehler.

Nicht im Lab ausführen: Ein echtes Apply auf die Rolle master erzeugt eine neue gerenderte Konfiguration. Der MCO kann den Node entleeren und neu starten. Auf einer SNO bedeutet das vollständige Unterbrechung. Ein pausierter MCP verhindert den sofortigen Rollout, sammelt aber ausstehende Änderungen, die beim Entpausieren gemeinsam wirksam werden.

Die lokale Übungsdatei kannst du danach mit Remove-Item -LiteralPath .\machineconfig-mco-lab.yaml oder unter Bash mit rm -- machineconfig-mco-lab.yaml entfernen.

7 etcd vor dem Backup untersuchen

Ein etcd-Snapshot schützt Kubernetes- und OpenShift-API-Objekte. Er enthält keine Daten aus Persistent Volumes und ersetzt kein Anwendungsbackup.

Laptop · PowerShell oder Bash · nur lesen
oc get co etcd
oc get etcd cluster -o yaml
oc get pods -n openshift-etcd -l app=etcd -o wide
oc get --raw='/readyz?verbose'
oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}'

Vorbedingungen für das Backup: Der Cluster muss gesund sein. Die erste Zertifikatsrotation 24 Stunden nach der Installation muss abgeschlossen sein. Das Backup wird nur auf einem Control-Plane-Node und möglichst außerhalb hoher Last erzeugt. Ein Restore benötigt dieselbe z-Stream-Version.

8 Ein echtes etcd-Backup erzeugen

Das offizielle Skript ist Teil des etcd Cluster Operators. Es erzeugt einen Datenbank-Snapshot und ein Archiv mit den Static-Pod-Ressourcen.

Control-Plane-Node ermitteln

Laptop · PowerShell
$node = oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}'
$node
oc debug --as-root node/$node
Bash-Variante anzeigen
Laptop · Bash
node=$(oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}')
printf '%s\n' "$node"
oc debug --as-root "node/$node"

Im Debug-Pod ausführen

Debug-Pod · schreibt auf die Node-Disk
chroot /host
mkdir -p /home/core/assets/etcd-backup
/usr/local/bin/cluster-backup.sh /home/core/assets/etcd-backup
ls -lh /home/core/assets/etcd-backup
exit
exit
DateiHerkunftBedeutung
snapshot_<zeit>.dbwird generiertetcd-Datenbank mit dem Clusterzustand
static_kuberesources_<zeit>.tar.gzwird generiertStatic-Pod-Ressourcen, die der Restore zusätzlich benötigt
/home/core/assets/etcd-backup/wichtigZwischenablage auf der Node-Disk. Noch keine externe Sicherung

9 Backup außerhalb des Clusters sichern

Eine Datei auf derselben SNO hilft nicht bei Node- oder Disk-Verlust. Kopiere beide erzeugten Dateien auf den Laptop und danach in deinen verschlüsselten Backup-Speicher.

Laptop · PowerShell · benötigt Node-SSH
$node = oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}'
$nodeIp = oc get node $node -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'
$destination = ".\backups\etcd-$(Get-Date -Format yyyyMMdd-HHmmss)"
New-Item -ItemType Directory -Path $destination -Force
scp -r "core@${nodeIp}:/home/core/assets/etcd-backup/*" $destination
Get-ChildItem -LiteralPath $destination
Get-FileHash -Algorithm SHA256 -Path "$destination\*"
Bash-Variante anzeigen
Laptop · Bash · benötigt Node-SSH
node=$(oc get node -l node-role.kubernetes.io/control-plane -o jsonpath='{.items[0].metadata.name}')
node_ip=$(oc get node "$node" -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}')
destination="./backups/etcd-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$destination"
scp -r "core@${node_ip}:/home/core/assets/etcd-backup/." "$destination/"
find "$destination" -maxdepth 1 -type f -print
sha256sum "$destination"/*

Falls die ermittelte InternalIP vom Laptop nicht erreichbar ist, verwendest du stattdessen die erreichbare Tailscale- oder Host-Adresse desselben Nodes. Der Node-Name und die Zieladresse müssen weiterhin zum gleichen Control-Plane-Node gehören.

Der Ordner backups/etcd-<zeit>/ wird von dir angelegt. Er gehört nicht ins Git-Repository. Der Snapshot enthält Clusterobjekte und damit möglicherweise Secrets. Verschlüssele und schütze ihn wie Zugangsdaten.

Restore hier nicht üben: cluster-restore.sh ersetzt den Zustand der Steuerungsebene und startet Static Pods neu. Das ist ein Disaster-Recovery-Vorgang für ein Wartungsfenster oder einen isolierten Übungscluster, kein Gesundheitstest für die laufende SNO.

10 Die drei Sicherungsarten nicht verwechseln

Sicherungenthältenthält nichttypischer Zweck
etcd-BackupAPI-Objekte und Static-Pod-RessourcenPV-Inhalte, externe Datenbanken und Registry-BlobsControl-Plane-Restore derselben z-Stream-Version
gestoppter Hetzner-Disk-Snapshotgesamte Node-Disk einschließlich etcd und lokaler PVsexterne Systeme und spätere Änderungenpragmatisches Wiederaufwecken der SNO mit sno.ps1
AnwendungsbackupDatenbank-Dumps, Objekte und fachliche DatenClusterkonfigurationeinzelne Anwendung wiederherstellen oder migrieren
  • Logs sind keine Backups. Sie erklären Ereignisse, stellen aber keinen Zustand wieder her.
  • MachineConfig ist gewünschte Node-Konfiguration. Sie sichert keine Daten und gehört als selbst angelegtes Manifest ins Git.
  • etcd-Backup ist versionsgebunden. Dokumentiere die genaue Cluster-Version zusammen mit den Prüfsummen.
  • Ein SNO-Snapshot ersetzt keine externe Kopie. Provider-, Konto- oder Regionsverlust bleibt sonst derselbe Ausfallbereich.

11 Lernkontrolle

  • Du kannst erklären, warum oc logs auch ohne Loki funktioniert und wann die Logzeile verloren geht.
  • Du erkennst Logging-6-Ressourcen und verwechselst sie nicht mit der früheren Fluentd- und Elasticsearch-Architektur.
  • Du kannst currentConfig, desiredConfig und rendered-master-… eines Nodes zusammenführen.
  • Du weißt, warum ein echtes MachineConfig-Apply auf einer SNO einen Wartungsfall auslösen kann.
  • Du kannst die zwei erzeugten etcd-Backup-Dateien benennen und ihren Speicherort außerhalb des Clusters nachweisen.
  • Du kannst etcd-, Disk- und Anwendungsbackup voneinander abgrenzen.