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.
| Befehl | legt an | du bist danach |
|---|---|---|
kubectl create namespace foo | nur den Namespace | nicht automatisch berechtigt |
oc new-project library | Namespace + admin-RoleBinding + Annotationen | admin 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.
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
| Fehlt | Folge ohne es |
|---|---|
LimitRange | Pods ohne Requests/Limits laufen unbegrenzt |
ResourceQuota | kein Deckel – ein Project kann den ganzen Node füllen |
NetworkPolicy | jeder 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.
new-app, expose, rollout, rsh, debug, adm, login, project – auf reinem Kubernetes (k3s) fehlen nur die *.openshift.io-Objekte, der Rest funktioniert gleichcore/v1, benannte (apps, batch, rbac...), *.openshift.io und CRD-gestützteoc get route sieht aus wie jeder andere AufrufEine 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.
# 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.
| SA | ist |
|---|---|
default | jeder Pod ohne serviceAccountName läuft hiermit – jeder App-Pod hat immer eine SA |
builder | OpenShift-eigen, darf in die interne Registry pushen (system:image-builder) |
deployer | OpenShift-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.
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 User –
oc adm policy add-scc-to-user anyuid -z demo-sa steuert den erlaubten
securityContext (A7).
8 Typische Fallen
| Symptom | meist |
|---|---|
| frisches Project ist von aussen erreichbar | erwartet – keine NetworkPolicy ist Vorgabe, nicht Bug (F2) |
| Pods laufen ohne Limits den Node voll | keine LimitRange/ResourceQuota im Project |
Namespace hängt in Terminating | ein 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 erreichen | fehlende 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
| Baustein | real |
|---|---|
| Project | oc 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 |
| ServiceAccount | Jenkins 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örung | das pipeline-token-Secret verschwindet nach jedem sno.ps1 up (Snapshot-Restore) – der Post-up-Hook (sno-wsl.sh remediate) legt es automatisch neu an |
| kubeconfig | zwei 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
api-resources/explain erkunden das Cluster-Schema live