← Übersicht  ·  Skripte & Dateien  ·  OpenShift · Operatoren · TLS

Operator-Reconcile und Service-Zertifikate

Du erzeugst mit einer Service-Annotation einen internen TLS-Schlüssel, löschst ihn absichtlich und beobachtest, wie der eingebaute Service-CA-Operator den Sollzustand wiederherstellt. Danach injizierst du die passende CA in eine eigene ConfigMap. Optional folgt eine echte ArgoCD-Custom-Resource.

Stand: 5. September 2026OKD / OCP 4.xAtlas D1, D5, F5ca. 35 Minuten

1 Das Reconcile-Modell

Ein Operator führt nicht nur einmal Befehle aus. Er vergleicht fortlaufend Soll und Ist und korrigiert Abweichungen.

SollEin Kubernetes-Objekt beschreibt das gewünschte Ergebnis: hier eine Service-Annotation, später optional eine ArgoCD-CR.
WatchDer Controller beobachtet passende Objekte und Ereignisse.
VergleichExistiert das angeforderte Secret? Ist die CA-ConfigMap befüllt?
ReconcileFehlt etwas, erzeugt oder aktualisiert der Controller es. Danach beginnt die Schleife erneut.

Warum zwei Teile? Der Service-CA-Operator ist bereits Teil von OpenShift und zeigt die Schleife ohne zusätzliche Installation. Er nutzt hier eine normale Service-Annotation statt einer CRD. Der optionale ArgoCD-Teil ergänzt anschließend das klassische Muster CRD → Custom Resource → Operator.

2 Cluster prüfen

Du brauchst einen angemeldeten Benutzer, der ein Projekt anlegen darf. Prüfe zuerst den ClusterOperator und seine Namespaces.

Laptop · PowerShell oder Bash
oc whoami
oc get co service-ca
oc get pods -n openshift-service-ca
oc get pods -n openshift-service-ca-operator

Erwartung: service-ca ist Available=True und Degraded=False. Bei einem anderen Zustand erst mit Schritt 6 diagnostizieren.

3 Sollzustand anlegen

Der Service fordert über eine Annotation ein Serving-Certificate an. Eine getrennte ConfigMap fordert das Trust-Bundle an.

Laptop · PowerShell
oc new-project operator-reconcile-lab

@'
apiVersion: v1
kind: Service
metadata:
  name: echo-tls
  annotations:
    service.beta.openshift.io/serving-cert-secret-name: echo-tls
spec:
  selector:
    app: echo
  ports:
    - name: https
      port: 8443
      targetPort: 8443
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: service-ca-bundle
  annotations:
    service.beta.openshift.io/inject-cabundle: "true"
'@ | oc apply -f -
Bash-Variante anzeigen
Laptop · Bash
oc new-project operator-reconcile-lab

oc apply -f - <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: echo-tls
  annotations:
    service.beta.openshift.io/serving-cert-secret-name: echo-tls
spec:
  selector:
    app: echo
  ports:
    - name: https
      port: 8443
      targetPort: 8443
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: service-ca-bundle
  annotations:
    service.beta.openshift.io/inject-cabundle: "true"
EOF

Für die Zertifikaterzeugung muss hinter dem Service noch kein Pod laufen. Der leere Selector ist für dieses Lab in Ordnung. Echte TLS-Verbindungen benötigen später natürlich einen Endpoint und einen Prozess, der tls.crt und tls.key einliest.

Wichtig: Verwende für inject-cabundle eine eigene ConfigMap. Beim Injizieren ersetzt der Operator vorhandene Daten in dieser ConfigMap.

4 Ergebnis lesen

Aus zwei Annotationen entstehen zwei verwaltete Ergebnisse. Lies Metadaten und Schlüssel, aber gib den privaten Schlüssel nicht aus.

Laptop · PowerShell oder Bash
oc get service,secret,configmap -n operator-reconcile-lab
oc describe secret echo-tls -n operator-reconcile-lab
oc get configmap service-ca-bundle -n operator-reconcile-lab -o yaml
oc get service echo-tls -n operator-reconcile-lab -o yaml
Eingabevom Operator erzeugtes Ergebnisentscheidende Daten
Service-Annotation serving-cert-secret-nameSecret echo-tls vom Typ kubernetes.io/tlstls.crt, tls.key
ConfigMap-Annotation inject-cabundleaktualisierte ConfigMap service-ca-bundleservice-ca.crt

Das Zertifikat ist für den internen Servicenamen gedacht, zum Beispiel echo-tls.operator-reconcile-lab.svc. Die CA-ConfigMap kommt in den Client-Pod. Das TLS-Secret wird in den Server-Pod gemountet.

5 Drift erzeugen und Rotation beobachten

Das Secret ist abgeleiteter Ist-Zustand. Löschen ist hier eine kontrollierte Störung und löst eine neue Abstimmung aus.

Terminal 1: beobachten

Laptop · PowerShell oder Bash
oc get secret echo-tls -n operator-reconcile-lab --watch

Terminal 2: UID merken und Secret löschen

Laptop · PowerShell
$before = oc get secret echo-tls -n operator-reconcile-lab -o jsonpath='{.metadata.uid}'
oc delete secret echo-tls -n operator-reconcile-lab
for ($i = 0; $i -lt 60; $i++) {
  $after = oc get secret echo-tls -n operator-reconcile-lab -o jsonpath='{.metadata.uid}' 2>$null
  if ($LASTEXITCODE -eq 0 -and $after) { break }
  Start-Sleep -Seconds 1
}
if (-not $after) { throw "Secret wurde nicht innerhalb von 60 Sekunden neu erzeugt." }
"vorher: $before"
"nachher: $after"
Bash-Variante anzeigen
Laptop · Bash
before=$(oc get secret echo-tls -n operator-reconcile-lab -o jsonpath='{.metadata.uid}')
oc delete secret echo-tls -n operator-reconcile-lab
after=''
for i in $(seq 1 60); do
  after=$(oc get secret echo-tls -n operator-reconcile-lab -o jsonpath='{.metadata.uid}' 2>/dev/null) && break
  sleep 1
done
test -n "$after" || { echo 'Secret wurde nicht innerhalb von 60 Sekunden neu erzeugt.' >&2; exit 1; }
printf 'vorher: %s\nnachher: %s\n' "$before" "$after"

Beweis: Das Secret erscheint wieder und hat eine andere UID. Du hast keinen Erzeugungsbefehl wiederholt. Der Operator hat die fehlende Realität aus dem weiterhin vorhandenen Sollzustand rekonstruiert. Das ist zugleich die manuelle Rotation eines Service-Zertifikats.

6 Vom Ergebnis zum Controller zurückverfolgen

Status, Events und Logs beantworten drei verschiedene Fragen: Ist der ClusterOperator gesund? Was geschah im Projekt? Was meldet der Controller selbst?

Laptop · PowerShell oder Bash
oc get co service-ca -o yaml
oc get events -n operator-reconcile-lab --sort-by=.lastTimestamp
oc get deploy,pods -n openshift-service-ca
oc logs -n openshift-service-ca deployment/service-ca --since=10m

Falls der Deployment-Name in deiner Version abweicht, zuerst mit oc get deploy -n openshift-service-ca ermitteln und dann an oc logs deployment/<name> übergeben.

EbeneFrageBefehl
ClusterOperatorIst die Plattformfunktion verfügbar oder degradiert?oc get co service-ca
NamespaceWelche Objektänderungen wurden sichtbar?oc get events -n operator-reconcile-lab
ControllerWarum konnte ein Reconcile nicht abgeschlossen werden?oc logs -n openshift-service-ca deployment/service-ca --since=10m

7 Optional: eine echte Custom Resource

Nur ausführen, wenn OpenShift GitOps bereits installiert ist. Dieser Teil kann auf einer kleinen SNO zusätzliche CPU und RAM belegen.

Die Installation des Operators steht in Einen Operator installieren mit OLM. Prüfe anschließend API und Schema, statt eine Version blind anzunehmen:

Laptop · PowerShell
oc api-resources | Select-String -Pattern 'argocd'
oc explain argocd
oc explain argocd.spec.server.route
Bash-Variante anzeigen
Laptop · Bash
oc api-resources | grep -i argocd
oc explain argocd
oc explain argocd.spec.server.route

Wenn argocds.argoproj.io vorhanden ist und oc explain die Felder bestätigt, lege eine minimale CR an:

Laptop · PowerShell
oc new-project argocd-reconcile-lab

@'
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: lab
  namespace: argocd-reconcile-lab
spec:
  server:
    route:
      enabled: false
'@ | oc apply -f -

oc get argocd lab -n argocd-reconcile-lab -o yaml
oc get deploy,pods,service -n argocd-reconcile-lab --watch

Hier ist die ArgoCD-CR der Sollzustand. Der GitOps-Operator erzeugt daraus Deployments, Pods, Services, Secrets und Statusbedingungen. Vergleiche metadata.generation mit status und prüfe die ownerReferences eines erzeugten Objekts.

Laptop · PowerShell oder Bash
oc get argocd lab -n argocd-reconcile-lab -o jsonpath='{.metadata.generation}{"\n"}{.status}{"\n"}'
oc get deployment -n argocd-reconcile-lab -o yaml

Versionsgrenze: CRD-Schema und erzeugte Namen können sich zwischen GitOps-Versionen ändern. Deshalb sind oc api-resources und oc explain Teil des Labs und kein optionales Beiwerk.

8 Grenzen und typische Fallen

Symptom oder AnnahmeEinordnung
„Das Zertifikat kann ich an einer öffentlichen Route verwenden.“Nein. Es ist für clusterinterne Service-DNS-Namen und die OpenShift Service CA gedacht, nicht für öffentliche Browser-Vertrauensketten.
Die ConfigMap enthält meine alten Schlüssel nicht mehr.Die CA-Injektion ersetzt vorhandene Daten. Immer eine dedizierte ConfigMap verwenden.
Ich editiere das generierte Secret direkt.Das ist Ist-Zustand. Ändere den anfordernden Service oder rotiere durch Löschen des Secrets.
Der Service hat keine Endpoints.Für die Zertifikaterzeugung okay. Für eine echte Verbindung muss der Selector passende Pods finden.
Service CA wurde über OLM installiert.Nein. Sie ist ein eingebauter ClusterOperator der OpenShift-Plattform.
Eine ArgoCD-CR bleibt ohne Pods.CRD, Operator-Pods, Namespace-Scope, CR-Status und Operator-Logs prüfen.

9 Sauber aufräumen

Beide Labs sind in eigenen Projekten isoliert. Das Löschen der Projekte entfernt ihre erzeugten Ressourcen.

Laptop · PowerShell oder Bash
oc delete project operator-reconcile-lab

# nur falls der optionale ArgoCD-Teil ausgeführt wurde:
oc delete project argocd-reconcile-lab

Der OpenShift-GitOps-Operator selbst bleibt installiert. Wenn du auch ihn entfernen möchtest, folge dem Aufräumabschnitt der OLM-Anleitung.

10 Lernkontrolle

  • Du kannst Sollzustand, Watch, Ist-Vergleich und Reconcile an den konkreten Objekten zeigen.
  • Du kannst erklären, warum das gelöschte Secret wiederkommt und warum sich seine UID ändert.
  • Du kennst die Rollen von tls.crt, tls.key und service-ca.crt.
  • Du verwechselst interne Serving-Certificates nicht mit öffentlichem Route-TLS.
  • Du kannst vor dem Anlegen einer CR API-Ressource und Schema mit oc api-resources und oc explain prüfen.