← Übersicht  ·  Skripte & Dateien  ·  cloud-host · OpenShift · Betrieb

Cluster-Betrieb in OpenShift

Das Modell steht in den Atlas-Diagrammen G1, G3, G5 und G6. Vier Admin-Themen, ein roter Faden: oc get co ist der erste Griff bei jeder Störung. Hier spielst du ihn von Hand durch – dazu einen ServiceMonitor live anlegen, ein PVC binden sehen, und verstehen, wie ein Upgrade auf einer OKD-SNO wirklich abläuft. EX280-relevant.

Stand: 4. September 2026 OKD 4.x / OCP 4.x ns library

Voraussetzung: ein Cluster mit oc login als Admin, Namespace library. Das User-Workload-Monitoring muss eingeschaltet sein (Schritt 3 zeigt wie).

1 oc get co lesen

Jede Kern-Fähigkeit – auth, ingress, dns, image-registry, monitoring, network, etcd, kube-apiserver… – ist ein ClusterOperator-Objekt, rund 30 Stück, verwaltet vom Cluster Version Operator.

Laptop · Bash
oc get co
oc get co -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.conditions[?(@.type=="Available")].status}{"\t"}{.status.conditions[?(@.type=="Degraded")].status}{"\n"}{end}'
Bedingungbedeutet
Availableist die Funktion nutzbar? False = Ausfall (z. B. ingress False → keine Route erreichbar)
Degradeddie Funktion geht noch, ist aber nicht im Sollzustand – True heisst untersuchen, wird oft zu Available: False
Progressingder Operator rollt gerade etwas aus – normal beim Upgrade, stundenlang True heisst es hängt
UpgradeableFalse = erst etwas tun, dann upgraden

gesund im RuhezustandAvailable=True, Degraded=False, Progressing=False. Der CVO blockiert Upgrades (Schritt 7), solange irgendein CO Degraded ist. OLM-Operatoren (Block D) sind eine separate Ebene – sie erscheinen nicht in oc get co.

2 Einen kaputten ClusterOperator debuggen

Hier fängt jede „der Cluster fühlt sich komisch an“-Untersuchung an.

Laptop · Bash
# wer ist nicht True/False/False?
oc get co | grep -v "True.*False.*False"

# die message lesen:
oc describe co image-registry

# dann in den Related-Objects-Namespace:
oc get pods -n openshift-image-registry
oc logs deployment/cluster-image-registry-operator -n openshift-image-registry --tail=50
oc get events -n openshift-image-registry --sort-by=.lastTimestamp | tail -20

nach sno.ps1 upsteht image-registry oft auf Progressing oder Degraded – der Operator hängt an einer Leader-Lease von vor dem Snapshot. sno-wsl.sh remediate (in sno.ps1 up eingebaut) räumt das automatisch auf.

Alarme zum selben Zustand landen im Alertmanager: ClusterOperatorDown / ClusterOperatorDegraded (Schritt 3).

3 Der Monitoring-Stack

Zwei getrennte Stacks: Plattform-Monitoring (immer an) und User-Workload-Monitoring (opt-in).

Plattformopenshift-monitoring: Prometheus-Paar scrapt die Steuerungsebene, jeden Operator, node-exporter – nicht abschaltbar, nur tunen
ThanosQuerier fächert eine Abfrage über alle Prometheus-Instanzen, Ruler wertet Regeln aus
User-Workloadopt-in über die ConfigMap cluster-monitoring-config – erst danach zählen eigene ServiceMonitore
Laptop · Bash
cat <<'YAML' | oc apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |
    enableUserWorkload: true
YAML

oc get pods -n openshift-user-workload-monitoring -w

4 Einen ServiceMonitor live anlegen

Anmelden bei Prometheus, dann eine eigene Alarmregel.

Laptop · Bash
oc create deployment demo-metrics -n library --image=registry.access.redhat.com/ubi9/httpd-24
oc expose deployment demo-metrics -n library --port=8080

cat <<'YAML' | oc apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: demo-metrics
  namespace: library
spec:
  selector:
    matchLabels: { app: demo-metrics }
  endpoints:
    - port: 8080-tcp
      path: /metrics
      interval: 30s
YAML

cat <<'YAML' | oc apply -f -
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: demo-metrics-alerts
  namespace: library
spec:
  groups:
    - name: demo.rules
      rules:
        - alert: DemoTargetDown
          expr: up{job="demo-metrics"} == 0
          for: 5m
          labels: { severity: warning }
          annotations: { summary: "demo-metrics antwortet nicht" }
YAML

oc get servicemonitor,prometheusrule -n library

Im Konsolen-Tab Observe: Metrics (PromQL), Alerts (+ Silences), Dashboards, Targets (up/down – genau hier sieht man, ob der ServiceMonitor wirklich scrapt). Rechte dafür: die Rolle monitoring-edit im Namespace. Merksatz: ServiceMonitor = „scrap diese Pods“, PrometheusRule = „alarmiere bei diesem Ausdruck“.

5 Storage: PVC, StorageClass, RWO/RWX

Ein PersistentVolumeClaim ist der Antrag, eine StorageClass die clusterweite Vorlage.

Begriffist
PVCAntrag: Grösse, accessModes, optional storageClassName – namespaced
StorageClassprovisioner (der CSI-Treiber), reclaimPolicy, volumeBindingMode, allowVolumeExpansion
RWOein Node zur Zeit – die meiste Blockspeicherung. RWOP = genau ein Pod
RWXviele Nodes schreibend – braucht ein Netzwerk-Dateisystem (NFS, CephFS, ODF). Cloud-Blockspeicher (EBS, Hetzner Volume) kann das nicht

volumeBindingMode: WaitForFirstConsumer wartet, bis der Pod geschedult ist – sonst landet das PV in der falschen Zone und der Pod scheduled nie (B6). reclaimPolicy: Delete löscht das PV mit dem PVC, Retain behält es (Released) für manuelle Rettung.

6 Ein PVC anlegen und binden sehen

Ein Deployment mit zwei Replicas an einem RWO-PVC – und live sehen, warum nur ein Pod läuft.

Laptop · Bash
cat <<'YAML' | oc apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-data
  namespace: library
spec:
  accessModes: [ReadWriteOnce]
  resources: { requests: { storage: 1Gi } }
YAML

oc get pvc demo-data -n library -w
# Pending -> Bound (mit WaitForFirstConsumer erst, sobald ein Pod ihn nutzt)

oc get pv $(oc get pvc demo-data -n library -o jsonpath='{.spec.volumeName}')

Falleein Deployment mit replicas: 2, das denselben RWO-PVC mountet, lässt nur den ersten Pod laufen – der zweite bleibt dauerhaft Pending (oc describe pod zeigt multi-attach error oder „volume is already used“).

PVC vergrössern geht nur grösser, nie kleiner, und nur bei allowVolumeExpansion: true an der StorageClass. VolumeSnapshot/VolumeSnapshotClass sind die Basis für Point-in-Time-Kopien (Velero-Backups, E4).

7 Cluster-Upgrades

Ein Upgrade ist ein Release-Image – der Cluster Version Operator (CVO) gleicht den Cluster darauf ab: erst die ClusterOperatoren in Abhängigkeitsreihenfolge, dann die Nodes (G4).

Laptop · Bash
oc get clusterversion
oc adm upgrade
# zeigt aktuelle Version und verfuegbare Ziele
oc adm upgrade --to=4.16.7
oc get clusterversion -w

Vorbedingung: kein ClusterOperator Degraded (Schritt 1), sonst blockiert der CVO. admin-acks bestätigen für bekannte Breaking Changes zwischen Minors, deprecated APIs vorher prüfen. Kein Rollback – nur vorwärts. Nach dem Start nicht abbrechen, ein halb-upgradeter Cluster ist der schlechteste Zustand.

real auf der SNOOKD-SCOS-Update-Graphen sind community-gepflegt und dünn – oft ist der Weg nicht oc adm upgrade, sondern sno.ps1 destroy und dann install mit der neueren Version (der Rebuild aus dem Plan). Wenn doch: erst sno.ps1 down als Sicherung, dann oc adm upgrade --to, rund 40 Min – der eine Node rebootet, die API ist während des Control-Plane-Reboots kurz weg.

OCP-Unterschied: OCP hat Subscription-Channels und den OpenShift Update Service (disconnected). OKD nutzt community-gepflegte Update-Graphen. etcd-Backup vorher (G7).

8 Typische Fallen

Symptommeist
Upgrade startet nichtein ClusterOperator ist Degraded – erst Schritt 2
Targets zeigen „down“falscher Port/Selektor im ServiceMonitor, oder eine NetworkPolicy sperrt den Scrape (F2)
zweiter Replica bleibt PendingRWO-PVC von zwei Pods gleichzeitig verlangt – braucht RWX oder nur 1 Replica
PV in falscher ZonevolumeBindingMode: Immediate statt WaitForFirstConsumer
hohe RAM-Last durch Prometheuszu hohe Kardinalität in eigenen Metrik-Labels

9 Wie die Bibliothek es macht

Bausteinreal
Monitoringein ServiceMonitor je Spring-Dienst auf /actuator/prometheus (Micrometer) – die Bitnami-Charts von Postgres, Kafka und Redis bringen je einen metrics-Exporter mit, den ein eigener ServiceMonitor abholt
StoragePostgres, Kafka und Redis wollen je ein RWO-Block-PVC über ihre StatefulSets – auf der SNO ein local-path-Provisioner statt echtem CSI (Daten am Node, keine HA)
Storage-Stolpersteinder image-registry-Operator will eine RWX-PVC, local-path kann nur RWO – die image-registry-storage-PVC von Hand als RWO vorab anlegen, sonst startet die Registry nicht
SNO ohne HAbei G1/G3/G6 läuft der ganze Stack normal – nur das Prometheus-Paar und echte Ausfallsicherheit fehlen. Bei G5 fehlt vor allem der EUS-Worker-Pool-Tanz, den es ohne Worker-Nodes nicht gibt

Fehlschlag-Reflex: schlägt ein helm upgrade mit wirren Fehlern fehl, ist der erste Blick oc get co – ist ingress oder authentication Degraded, weil der Cluster nach einem sno.ps1 up noch nicht ganz durch ist?

+ Die Kurzfassung

ClusterOperators~30 Objekte, der Gesundheitszustand des Clusters – erster Griff bei jeder Störung
MonitoringServiceMonitor = wen scrapen, PrometheusRule = wann alarmieren – User-Workload ist opt-in
StorageRWO reicht fast immer, RWX nur mit Netzwerk-Dateisystem – WaitForFirstConsumer vor Zonen-Fallen
Upgradesder CVO blockiert bei Degraded, kein Rollback – auf OKD-SNO oft eher ein Rebuild als ein oc adm upgrade