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

Kubernetes-Kern und Authentifizierung in OpenShift

Die Zeichnungen dazu stehen hier bei den jeweiligen Schritten. Zwei Fragen, die vor allem anderen stehen: welche Teile sind reines Kubernetes und welche sind OpenShift obendrauf – live mit oc api-resources geprüft, nicht behauptet. Und wie kommt ein echter Login zustande, wenn Kubernetes selbst gar keinen Auth-Server mitbringt. EX280-relevant.

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

Voraussetzung: ein Cluster mit oc login als cluster-admin (kubeadmin reicht). Schritt 5 legt einen zweiten Login-Weg an – kubeadmin bleibt danach weiter nutzbar.

1 Kern plus Schicht, kein Fork

OpenShift ist unverändertes Kubernetes, darauf eine feste Schicht aus Operatoren und CRDs.

Kurz: der Kubernetes-Kern bleibt unverändert. Alles, was OpenShift ausmacht, läuft als Operatoren (Controller, die eine Fähigkeit automatisieren) und zusätzliche API-Objekte darauf. OKD (die quelloffene Variante) und OCP (das kommerzielle Produkt von Red Hat) sind zwei Auslieferungen derselben Schicht.

Ein Stapel, kein Fork deine Anwendung Deployment, Service, Ingress, ConfigMap – laufen unverändert die OpenShift-Schicht Operatoren + zusätzliche API-Objekte – ändert den Kern nicht Router + Route OAuth-Server + oc login SCC – kein Root im Container interne Registry Web-Konsole OLM + OperatorHub Monitoring-Stack BuildConfig / ImageStream / S2I CVO + ~30 ClusterOperatoren – der Cluster verwaltet und aktualisiert sich als eine Einheit Project + Quota-Defaults · OVN-Kubernetes · DNS- und Ingress-Operator Kubernetes – unverändert API-Server, etcd, Scheduler, Controller-Manager kubelet, CRI-O (die Container-Runtime), OVN-CNI Node-Betriebssystem SCOS bzw. RHCOS – unveränderlich, vom Machine Config Operator verwaltet. Kein eigenes Ubuntu/Debian – das gehört zum Vertrag. Dieselbe Schicht, zwei Auslieferungen OKD · quelloffen OCP · Red Hat Node-OS Kosten Support Operator-Kataloge Pull-Secret Update SCOS / Fedora CoreOSRHCOS kostenlosSubscription je Core Community, ForenRed Hat, SLA community-operators+ redhat- / certified- Dummy reichtechtes, console.redhat.com OKD-ReleasesRed-Hat-Channels Kern und Schicht sind praktisch gleich Im Job bedienst du meistens OCP – die Konzepte hier gelten 1:1. Der Atlas läuft auf OKD, weil es ohne Subscription geht. Was du lernst, ist trotzdem OpenShift, nicht „nur OKD“. Was noch dazugehört – und im Gespräch oft gefragt wird oc spricht mit jedem Kubernetes – die Extras schalten sich frei, wenn es OpenShift ist Web-Konsole: zwei Perspektiven – Administrator (Cluster) und Developer (ein Project) kubeadmin = temporaerer Notzugang · system:admin = Zertifikat in der kubeconfig, kein Login oc adm = Admin-Aufgaben: Rechte vergeben, Node leeren, Upgrades fahren oc new-app, oc debug, oc rsh, oc rollout – Abkürzungen für häufige Abläufe OpenShift-Objekte kommen über einen aggregierten API-Server – derselbe Port 6443, andere Pfade oc api-resources / oc explain route zeigen, was dieser Cluster kann OpenShift ist kein Fork von Kubernetes. Der Kern ist unverändert – alles Zusätzliche läuft als Operatoren und CRDs darauf. Deployment, Service, Ingress laufen unverändert. Eine Route kennt nur OpenShift (portabel = Ingress). oc ist ein Superset von kubectl. Die einzelnen Objekte – Project, oc/CRDs, OAuth, RBAC, ServiceAccount, SCC – klappen die Diagramme A2 bis A7 auf.
OpenShift ist Kubernetes plus eine feste Schicht Operatoren. Der Kern – API-Server, etcd, Scheduler, kubelet – ist unverändertes Kubernetes. Darauf sitzen Router, OAuth, SCC, Registry, Konsole, OLM, das Monitoring und die Build-Kette, alle als Operatoren verwaltet. OKD und OCP liefern dieselbe Schicht – sie unterscheiden sich in Node-OS, Kosten, Support und den Operator-Katalogen, nicht in den Konzepten.
  • OpenShift ist unverändertes Kubernetes, darauf eine feste Schicht aus Operatoren und CRDs, kein Fork
  • der Kern bleibt gleich: API-Server, etcd, Scheduler, Controller-Manager, kubelet, CRI-O, OVN-CNI
  • die OpenShift-Schicht sind lauter Operatoren: Router und Route, OAuth-Server, SCC, interne Registry, Web-Konsole, OLM und OperatorHub, Monitoring, dazu BuildConfig, ImageStream und S2I
  • der CVO und rund 30 ClusterOperatoren verwalten den Cluster als eine versionierte Einheit und aktualisieren ihn (G5, G6)
  • ebenfalls Teil der Schicht: Project mit Quota-Vorgaben, OVN-Kubernetes, der DNS- und der Ingress-Operator
  • das Node-Betriebssystem ist SCOS oder RHCOS, unveränderlich und vom MCO verwaltet (G4), kein eigenes Ubuntu oder Debian
  • deine Anwendung (Deployment, Service, Ingress, ConfigMap) läuft unverändert
  • OKD ist die quelloffene Variante: SCOS oder Fedora CoreOS, kostenlos, Community-Support, community-operators, Dummy-Pull-Secret
  • OCP ist das Produkt von Red Hat: RHCOS, Subscription je Core, SLA, dazu redhat- und certified-operators, echtes Pull-Secret von console.redhat.com
  • Kern und Schicht sind praktisch gleich – im Job meist OCP, die Konzepte gelten eins zu eins. Dieser Atlas läuft auf OKD (SNO auf Hetzner), OCP-Unterschiede stehen inline
  • oc ist ein Superset von kubectl – dieselbe Binary redet mit jedem Kubernetes (auch dem k3s aus biblio.yaml), die OpenShift-Extras schalten sich frei, sobald es OpenShift ist
  • oc adm bündelt Admin-Aufgaben, oc new-app, oc debug, oc rsh und oc rollout sind Abkürzungen
  • die OpenShift-Objekte kommen über einen aggregierten API-Server, gleicher Port 6443, andere Pfade – oc api-resources und oc explain route zeigen, was dieser Cluster kann
  • Folge: ein Helm-Chart mit reinen Kubernetes-Objekten läuft auf beiden. Eine Route kennt nur OpenShift – wer portabel bleiben will, schreibt stattdessen ein Ingress
  • die Web-Konsole hat zwei Perspektiven: Administrator für den Cluster, Developer für ein einzelnes Project
KernAPI-Server, etcd, Scheduler, Controller-Manager, kubelet, CRI-O, OVN-CNI – identisch zu jedem Kubernetes
Schichtlauter Operatoren obendrauf: Router/Route, OAuth-Server, SCC, interne Registry, Web-Konsole, OLM/OperatorHub, Monitoring, BuildConfig/ImageStream/S2I
Node-OSSCOS oder RHCOS – unveränderlich, vom MCO verwaltet (G4), kein eigenes Ubuntu/Debian

Der CVO und rund 30 ClusterOperatoren (G6) verwalten den Cluster als eine versionierte Einheit. OKD ist die quelloffene Variante (SCOS/Fedora CoreOS, kostenlos, community-operators, Dummy-Pull-Secret), OCP das Red-Hat-Produkt (RHCOS, Subscription je Core, SLA, echtes Pull-Secret von console.redhat.com). Kern und Schicht sind praktisch gleich – im Job meist OCP, die Konzepte gelten eins zu eins.

2 Die OpenShift-Schicht live trennen

Nicht behaupten, nachsehen: welche API-Gruppen kommen von Kubernetes, welche von OpenShift?

Laptop · Bash
# alle API-Gruppen dieses Clusters:
oc api-resources -o wide | awk '{print $NF}' | grep -oE '[a-z0-9.-]+\.[a-z]+$' | sort -u | head -40

# gezielt die OpenShift-eigenen Gruppen herausfiltern:
oc api-resources | grep '\.openshift\.io'

# eine davon im Detail:
oc explain route.spec.tls
oc explain route.spec.tls.termination

# zum Vergleich: dieselbe Frage auf einem reinen Kubernetes gestellt
# (falls ein k3s/kind-Kontext existiert, sonst diesen Schritt auslassen):
# KUBECONFIG=~/.kube/biblio.yaml kubectl api-resources | grep '\.openshift\.io'
# -> leer, kein Treffer

oc ist ein Superset von kubectl – dieselbe Binary redet mit jedem Kubernetes, die OpenShift-Extras (oc adm, oc new-app, oc debug, oc rsh, oc rollout als Abkürzungen) schalten sich frei, sobald es OpenShift ist. Die OpenShift-Objekte laufen über einen aggregierten API-Server – gleicher Port 6443, andere Pfade, für dich unsichtbar.

3 Was portabel bleibt, was nicht

Die Konsequenz aus Schritt 2 für einen Helm-Chart oder ein Manifest.

Objektläuft auf reinem Kubernetes?
Deployment, Service, ConfigMap, Secret, Ingressja, unverändert – reines Kubernetes
Routenein, kennt nur OpenShift – wer portabel bleiben will, schreibt ein Ingress (F3)
BuildConfig, ImageStreamnein – ein Chart mit ImageStreamTag-Referenzen läuft auf k3s nicht (C1)
DeploymentConfig, SecurityContextConstraintsnein – OpenShift-eigen (B2, A7)

Die Web-Konsole hat zwei Perspektiven: Administrator für den Cluster, Developer für ein einzelnes Project – beide schreiben nur dieselben Objekte, die auch oc schreibt.

4 Das OAuth-Modell

OpenShift bringt einen eigenen OAuth-Server mit – Kubernetes hat keinen.

Kubernetes hat keinen Benutzerspeicher. OpenShift bringt einen eigenen OAuth-Server mit, der gegen einen konfigurierten Identity Provider prüft und ein Bearer-Token ausstellt. kubeadmin und system:admin sind zwei Wege daran vorbei.

du am Laptop oc login -u alice --server=https://api.<cluster>:6443 Passwort interaktiv eingeben oder oc login → Browser Web-Konsole nutzt denselben Server (OAuthClient console) OAuth-Server ClusterOperator authentication · Namespace openshift-authentication eigene Route oauth-openshift.apps.<cluster> liest oauth/cluster – die einzige IdP-Konfig, clusterweit aktiver IdP: HTPasswd Secret htpass-secret in openshift-config · htpasswd -bB users alice pw Änderung → der Operator rollt den OAuth-Server neu weitere Typen: LDAP · GitHub / GitLab / Google · OpenID Connect · Keystone · RequestHeader mehrere gleichzeitig möglich – Login-Auswahl im Browser Token-Ablauf: oauth/clustertokenConfig (Vorgabe ~24 h) API-Server · 6443 jede Anfrage: Authorization: Bearer <token> validiert per TokenReview beim OAuth-Server dann greift RBAC – siehe A5 1 · well-known wo ist der OAuth-Server? 2 · Passwort gegen den IdP 3 · Token 4 · Token in die kubeconfig ↗ User-Eintrag, oc whoami -t beim ersten Login entstehen User · Identity (<idp>:<idp-user>) · UserIdentityMapping – davor kein User in etcd zwei Wege am OAuth-Server vorbei kubeadmin Secret kubeadmin in kube-system (bcrypt-Hash) – kein IdP, Voll-Admin nach eigenem IdP: oc delete secret kubeadmin -n kube-system · Passwort aus cfg/auth/kubeadmin-password system:admin x509-Client-Zertifikat in der Install-kubeconfig (cfg/auth/kubeconfig) – der API-Server prüft es selbst geht am OAuth vorbei → funktioniert auch, wenn der authentication-Operator kaputt ist ServiceAccount – paralleler Auth-Weg ↗ kein OAuth, kein User – ein Token je Pod Diagramm A6 Authentifizierung ≠ Autorisierung ↗ der IdP sagt wer, RBAC sagt was ein frischer User darf erstmal fast nichts – Diagramm A5 oc logout widerruft das Token · oc whoami --show-console · ein abgelaufenes Token sieht aus wie ein falscher (401) HTPasswd liefert keine Gruppen – Gruppen kommen per LDAP-Sync (oc adm groups sync) oder von Hand (oc adm groups) Bibliothek / cloud-host: kein eigener IdP eingerichtet – oc login -u kubeadmin fragt das Passwort interaktiv ab (CRC / SNO) ein eigener IdP (htpasswd/OIDC) wäre der Schritt, sobald mehr als eine Person am Cluster arbeitet OCP-Unterschied: identisch – nur bringt OCP zusätzlich die Möglichkeit, den Cluster gegen Red-Hat-SSO / cluster.redhat.com-Identitäten zu binden.
Ein Server für die Frage „wer bist du“. oc login tauscht Benutzer und Passwort beim OAuth-Server gegen ein Bearer-Token, das dann in der kubeconfig steht und bei jeder Anfrage mitgeht. Welchen Speicher der OAuth-Server befragt, steht in genau einem Objekt (oauth/cluster). kubeadmin ist der Notzugang ohne IdP, system:admin das Zertifikat, das auch dann noch geht, wenn der Auth-Stack streikt.
  • OpenShift bringt einen eigenen OAuth-Server mit, Kubernetes hat keinen
  • bis zum ersten Login gibt es keinen User in etcd – danach entstehen ein User, eine Identity und das Mapping dazwischen
  • IdP-Typen: HTPasswd, LDAP, GitHub, GitLab, Google, OIDC, Keystone, RequestHeader – konfiguriert in genau einem Objekt, oauth/cluster
  • HTPasswd ist ein Secret mit einer htpasswd-Datei, referenziert in oauth/cluster
  • oc login -u <user> --server=https://api.<cluster>:6443 holt ein Bearer-Token vom OAuth-Server – das Passwort wird interaktiv eingegeben, das Token läuft nach einer Weile ab und steht dann in der kubeconfig
  • kubeadmin ist temporär – ein Secret in kube-system, das man nach dem eigenen IdP löscht
  • system:admin ist ein x509-Client-Zertifikat in der Install-kubeconfig, ganz ohne OAuth
  • zwei Token-Arten: ein OAuthAccessToken für die Nutzer-Session, ein ServiceAccount-Token für einen Pod (A6)
  • Gruppen kommen nicht automatisch – per LDAP-Sync (oc adm groups sync) oder von Hand (oc adm groups new <name>)
  • Rechte kommen nicht vom IdP – erst oc adm policy bindet Rollen an einen User oder eine Gruppe (A5)
  • im Projekt ist kein eigener IdP eingerichtet – der Zugang läuft komplett über oc login -u kubeadmin -p $(cat cfg/auth/kubeadmin-password), dasselbe für CRC. Für ein Bewerbungsgespräch wäre HTPasswd der erste Ausbau
  • die SNO-API ist nur übers Tailnet erreichbaroc login von einem Rechner ohne Tailscale und ohne den hosts-Eintrag scheitert am Zertifikat, nicht am Passwort (Diagramm 03)
  • Token weg oder abgelaufen: oc whoami sagt Unauthorized – neu oc login, oder oc whoami -t zeigt das aktuelle Token
bis zum ersten Loginkein User in etcd – danach entstehen ein User, eine Identity und das Mapping dazwischen
IdP-TypenHTPasswd, LDAP, GitHub, GitLab, Google, OIDC, Keystone, RequestHeader – konfiguriert in genau einem Objekt, oauth/cluster
Tokenzwei Arten: OAuthAccessToken für die Nutzer-Session, ein ServiceAccount-Token für einen Pod (A6)

kubeadmin ist temporär – ein Secret in kube-system, gelöscht sobald ein eigener IdP steht. system:admin ist ein x509- Client-Zertifikat in der Install-kubeconfig, ganz ohne OAuth. Rechte kommen nicht vom IdP – erst oc adm policy bindet Rollen an einen User oder eine Gruppe (A5).

5 Einen HTPasswd-IdP live anlegen

Der einfachste IdP – ein Secret mit einer htpasswd-Datei.

Laptop · Bash
htpasswd -c -B -b users.htpasswd demo-user 'ein-langes-testpasswort'

oc create secret generic htpass-secret -n openshift-config \
  --from-file=htpasswd=users.htpasswd

oc patch oauth cluster --type=merge -p '{
  "spec": {
    "identityProviders": [{
      "name": "demo-htpasswd",
      "mappingMethod": "claim",
      "type": "HTPasswd",
      "htpasswd": { "fileData": { "name": "htpass-secret" } }
    }]
  }
}'

# der OAuth-Server-Operator rollt sich selbst neu - kurz abwarten:
oc get co authentication -w

# anmelden mit dem neuen IdP:
oc login -u demo-user -p 'ein-langes-testpasswort'
oc whoami
oc whoami --show-console

SNO nur übers TailnetEin oc login von einem Rechner ohne Tailscale und ohne den hosts-Eintrag scheitert am Zertifikat, nicht am Passwort (Diagramm 03).

6 Rechte binden, Gruppen pflegen

demo-user existiert jetzt, darf aber noch nichts.

Laptop · Bash
# zurueck als Admin einloggen, um Rechte zu vergeben:
oc login -u kubeadmin -p $(cat cfg/auth/kubeadmin-password)

oc auth can-i get pods --as=demo-user -n library   # no
oc adm policy add-role-to-user view demo-user -n library
oc auth can-i get pods --as=demo-user -n library   # yes

# Gruppen entstehen nicht automatisch - von Hand:
oc adm groups new demo-team demo-user
oc adm policy add-role-to-group edit demo-team -n library

# per LDAP kaeme das ueber einen Sync statt von Hand:
# oc adm groups sync --sync-config=ldap-sync.yaml --confirm

Token weg oder abgelaufen: oc whoami sagt Unauthorized – neu oc login, oder oc whoami -t zeigt das aktuelle Token.

7 Typische Fallen

Symptommeist
ein Helm-Chart läuft auf k3s nichter referenziert eine Route oder einen ImageStream – beides OpenShift-eigen
oc login scheitert mit Zertifikatsfehlerkein Tailscale/hosts-Eintrag auf der SNO – nicht das Passwort
neuer User darf trotz Login nichtsIdP-Login gibt Identität, nicht Rechte – oc adm policy fehlt noch
Gruppen-Mitgliedschaft wirkt nichtRolle ist an die falsche Gruppe oder den falschen Namespace gebunden
kubeadmin geht nach IdP-Wechsel nicht mehrerwartet, sobald das Secret in kube-system gelöscht wurde

8 Wie das Projekt es macht

Im Projekt ist kein eigener IdP eingerichtet – der Zugang läuft komplett über oc login -u kubeadmin -p $(cat cfg/auth/kubeadmin-password), dasselbe für CRC. Für ein Bewerbungsgespräch wäre HTPasswd (Schritt 5) der erste Ausbau – genau das Muster, das diese Anleitung durchspielt. Dieser Atlas läuft auf OKD (SNO auf Hetzner), OCP-Unterschiede stehen wo nötig inline.

+ Die Kurzfassung

Kern + Schichtreines Kubernetes plus eine feste Operator-Schicht – oc api-resources zeigt live, was dazukommt
PortabelDeployment/Service/ConfigMap ja, Route/BuildConfig/ImageStream/DC/SCC nein
AuthLogin gibt Identität, nicht Rechte – oc adm policy bindet die Rolle danach separat