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

Project, oc und ServiceAccount in OpenShift

Das Modell steht in den Atlas-Diagrammen A2, A3 und A6. Hier spielst du die drei Fundament-Bausteine von Hand durch: ein oc new-project live verfolgt, wie viel mehr dabei entsteht als ein blosser Namespace – dann die API selbst erkunden, ohne Doku – und zuletzt eine eigene ServiceAccount anlegen, binden und ihr Token prüfen. EX280-relevant.

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

Voraussetzung: ein Cluster mit oc login. Diese Anleitung legt selbst ein frisches Project an, du brauchst also nichts vorzubereiten.

1 Project vs Namespace

Ein Namespace ist in reinem Kubernetes nur eine Hülle. Ein Project ist dieselbe Hülle plus Selbstbedienung.

Befehllegt andu bist danach
kubectl create namespace foonur den Namespacenicht automatisch berechtigt
oc new-project libraryNamespace + admin-RoleBinding + Annotationenadmin auf dem eigenen Project

oc new-project erzeugt zuerst einen ProjectRequest – das einzige Objekt, das ein Nicht-Admin anlegen darf. Das project-request-Template (liegt in openshift-config, editierbar) legt daraufhin den Namespace plus die admin-RoleBinding für dich an. Ein Project ist keine stärkere Isolation als ein Namespace – nur ein paar Annotationen plus die automatische Bindung. Echte Netz-Trennung kommt separat über NetworkPolicy (F2).

2 oc new-project live verfolgen

Ein frisches Project, und alles ansehen, was dabei automatisch entsteht.

Laptop · Bash
oc new-project demo-fundament
oc whoami
oc get rolebinding -n demo-fundament
# -> admin-Binding auf dich, plus system:image-builder/system:deployer fuer builder/deployer

oc get sa -n demo-fundament
# -> default, builder, deployer - schon da, ohne dass du etwas getan hast

oc get ns demo-fundament -o yaml | grep -A5 annotations

Die ServiceAccounts kommen nicht aus dem Template, sondern von Cluster-Controllern nach der Namespace-Erstellung (A6). Wichtige Annotationen am Namespace: openshift.io/sa.scc.uid-range, .mcs, .supplemental-groups (setzt die zufällige UID für Pods, A7), dazu openshift.io/description, display-name und requester. Der Namespace bekommt automatisch Zugriff auf die SCC restricted-v2 – über die clusterweite Gruppe system:authenticated, nicht extra pro Project.

3 Was bewusst nicht entsteht

FehltFolge ohne es
LimitRangePods ohne Requests/Limits laufen unbegrenzt
ResourceQuotakein Deckel – ein Project kann den ganzen Node füllen
NetworkPolicyjeder Pod erreicht jeden – ein frisches Project ist nach aussen offen (F2)

Wer das für alle Projects will, trägt es ins project-request-Template ein. Über mehrere Projects hinweg geht eine ClusterResourceQuota per Label-Selektor.

Selbstbedienung abschaltenDie Rolle self-provisioner (an system:authenticated:oauth) erlaubt jedem angemeldeten Nutzer oc new-project – Admins entfernen diese Bindung oft, damit Projects nur kontrolliert entstehen.

Bleibt ein gelöschter Namespace ewig in Terminating, klemmt meist ein Finalizer – nachsehen mit oc get ns demo-fundament -o yaml im Feld spec.finalizers.

4 oc, kubectl und die API-Gruppen

oc ist kubectl plus die OpenShift-eigenen Verben – dieselbe Binary redet auch mit reinem Kubernetes.

oc extranew-app, expose, rollout, rsh, debug, adm, login, project – auf reinem Kubernetes (k3s) fehlen nur die *.openshift.io-Objekte, der Rest funktioniert gleich
API-Gruppenein Port 6443, viele Gruppen: core/v1, benannte (apps, batch, rbac...), *.openshift.io und CRD-gestützte
Aggregationdie OpenShift-Gruppen laufen über den aggregierten API-Server, einen Extra-Prozess hinter denselben Pfaden – für dich unsichtbar, ein oc get route sieht aus wie jeder andere Aufruf

Eine CRD registriert einen neuen Typ – danach ist kind: PostgresCluster gleichwertig zu Pod und wird genauso mit oc get bedient (D2). Genau so kommen Operatoren zu neuen Ressourcentypen.

5 Die API selbst erkunden

Ohne Doku herausfinden, was ein Cluster kann – drei Befehle.

Laptop · Bash
# alle Typen: Kurzname, apiVersion, NAMESPACED, KIND
oc api-resources
oc api-resources --namespaced=false   # nur Cluster-Objekte

# Schema-Referenz direkt aus DIESEM Cluster, nicht aus der Doku:
oc explain route.spec.tls
oc explain route.spec.tls.termination

# eine kubeconfig hat drei Teile: Cluster, User, Context
oc config view --minify
echo $KUBECONFIG

Eine kubeconfig besteht aus Cluster (Adresse und CA), User (Token oder x509-Zertifikat) und Context (welcher Cluster, welcher Namespace). oc login schreibt die Datei, oc project <name> setzt darin den Namespace.

Web-Konsole = dieselben ObjekteDie Route console-openshift-console.apps.<cluster> mit den Perspektiven Administrator und Developer tut nichts, was oc nicht auch könnte – sie schreibt nur dieselben Objekte. Adresse mit oc whoami --show-console. Die Klick-Wege stehen in okd-konfiguration-nachschauen.html.

6 Das ServiceAccount-Modell

Drei Identitätsarten, alle drei RBAC-Subjekte (A5): User (aus dem IdP, A4), Group, und ServiceAccount.

SAist
defaultjeder Pod ohne serviceAccountName läuft hiermit – jeder App-Pod hat immer eine SA
builderOpenShift-eigen, darf in die interne Registry pushen (system:image-builder)
deployerOpenShift-eigen, steuert DeploymentConfig-Rollouts (system:deployer)

Der Pod bekommt ein projiziertes Volume unter /var/run/secrets/kubernetes.io/serviceaccount/ mit den Dateien token, ca.crt und namespace. Das Bound Token ist kurzlebig (etwa eine Stunde), an eine audience gebunden, wird über die TokenRequest-API geholt und automatisch rotiert – nicht anfassen. Früher (bis OCP 4.15) hatte jede SA ein nie ablaufendes Token-Secret in etcd.

7 Eine ServiceAccount live anlegen

Anlegen, binden, Token prüfen – der Weg, den auch die Bibliothek-Pipeline geht.

Laptop · Bash
oc create sa demo-sa -n demo-fundament
oc describe sa demo-sa -n demo-fundament

# startet ohne jedes Recht:
oc auth can-i get pods --as=system:serviceaccount:demo-fundament:demo-sa -n demo-fundament   # no

# Rolle binden (-z = ServiceAccount im aktuellen Namespace):
oc adm policy add-role-to-user edit -z demo-sa -n demo-fundament
oc auth can-i get pods --as=system:serviceaccount:demo-fundament:demo-sa -n demo-fundament   # yes

# ein statisches Token nur fuer externe Nutzer (z.B. eine CI ausserhalb):
oc create token demo-sa -n demo-fundament --duration=1h

# Pull-Secret anhaengen:
oc secrets link demo-sa <secret> --for=pull -n demo-fundament

automountServiceAccountToken: false an SA oder Pod setzen, wenn der Pod die API gar nicht ruft – die meisten App-Pods brauchen kein Token. Die SCC kommt von der SA, nicht vom Useroc adm policy add-scc-to-user anyuid -z demo-sa steuert den erlaubten securityContext (A7).

8 Typische Fallen

Symptommeist
frisches Project ist von aussen erreichbarerwartet – keine NetworkPolicy ist Vorgabe, nicht Bug (F2)
Pods laufen ohne Limits den Node vollkeine LimitRange/ResourceQuota im Project
Namespace hängt in Terminatingein Finalizer wartet – spec.finalizers prüfen
oc new-project schlägt fehl (Forbidden)die self-provisioner-Bindung wurde entfernt – ein Admin muss anlegen (oc adm new-project)
ein Pod kann die API nicht erreichenfehlende RBAC-Bindung auf seiner SA, nicht auf einem User – oc auth can-i --as=system:serviceaccount:... prüft es direkt

9 Wie die Bibliothek es macht

Bausteinreal
Projectoc new-project library ist der erste Schritt des Deploys – danach hängt Jenkins die pipeline-SA und ihre Bindungen dran (A5), Helm installiert die Bitnami-Infra
ServiceAccountJenkins meldet sich extern als system:serviceaccount:library:pipeline an – genau so ein Secret wie pipeline-token in library ist der statische Token-Weg (Annotation kubernetes.io/service-account.name: pipeline)
Bekannte Störungdas pipeline-token-Secret verschwindet nach jedem sno.ps1 up (Snapshot-Restore) – der Post-up-Hook (sno-wsl.sh remediate) legt es automatisch neu an
kubeconfigzwei getrennte Dateien – ~/.kube/okd-sno-hetzner.yaml (SNO) und ~/.kube/biblio.yaml (k3s), $KUBECONFIG wählt

OCP-Unterschied bei allen dreien: keiner – Project-Selbstbedienung, oc/API-Gruppen/Konsole und das ServiceAccount-Modell sind Kern-OpenShift bzw. Kern-Kubernetes, identisch auf OKD und OCP.

+ Die Kurzfassung

ProjectNamespace + admin-Binding + Annotationen – keine stärkere Isolation, nur Selbstbedienung
oc= kubectl + OpenShift-Verben, redet auch mit reinem Kubernetes – api-resources/explain erkunden das Cluster-Schema live
ServiceAccountjeder Pod hat immer eine – Rechte und SCC kommen von der SA, nicht vom User