1 Das Reconcile-Modell
Ein Operator führt nicht nur einmal Befehle aus. Er vergleicht fortlaufend Soll und Ist und korrigiert Abweichungen.
Service-Annotation, später optional eine ArgoCD-CR.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.
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.
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
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"
EOFFü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.
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
| Eingabe | vom Operator erzeugtes Ergebnis | entscheidende Daten |
|---|---|---|
Service-Annotation serving-cert-secret-name | Secret echo-tls vom Typ kubernetes.io/tls | tls.crt, tls.key |
ConfigMap-Annotation inject-cabundle | aktualisierte ConfigMap service-ca-bundle | service-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
oc get secret echo-tls -n operator-reconcile-lab --watch
Terminal 2: UID merken und Secret löschen
$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
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?
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.
| Ebene | Frage | Befehl |
|---|---|---|
| ClusterOperator | Ist die Plattformfunktion verfügbar oder degradiert? | oc get co service-ca |
| Namespace | Welche Objektänderungen wurden sichtbar? | oc get events -n operator-reconcile-lab |
| Controller | Warum 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:
oc api-resources | Select-String -Pattern 'argocd' oc explain argocd oc explain argocd.spec.server.route
Bash-Variante anzeigen
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:
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 --watchHier 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.
oc get argocd lab -n argocd-reconcile-lab -o jsonpath='{.metadata.generation}{"\n"}{.status}{"\n"}'
oc get deployment -n argocd-reconcile-lab -o yamlVersionsgrenze: 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 Annahme | Einordnung |
|---|---|
| „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.
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.keyundservice-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-resourcesundoc explainprüfen.