Die API sagt nein
Zwei verschiedene Mechanismen lehnen Dinge ab, und sie sehen unterschiedlich aus. Lies die erste Zeile des Fehlers, dann weißt du, mit welchem du es zu tun hast.
Forbiddenheißt RBAC: Du darfst diese Art von Objekt überhaupt nicht anfassen.denied the requestheißt Plattformregel: Dein YAML ist in Ordnung, aber was es verlangt, ist nicht erlaubt.
Das Zweite ist wichtig, weil es am Manifest nichts zu reparieren gibt. Du brauchst einen anderen Ansatz, und die Meldung sagt, welche Regel gegriffen hat.
Forbidden bei einem kubectl-Befehl
Drei Ursachen, in der Reihenfolge, in der sie tatsächlich vorkommen.
Dein Standard-Namespace ist nicht gesetzt. Der Befehl lief gegen default, worauf du keinen Zugriff hast. Prüf, was der aktuelle Kontext mitbringt:
kubectl config view --minify | grep namespaceSteht da nichts, setz ihn einmal, siehe Zugang und kubectl.
Die Ressource gehört nicht zu denen, die du anfassen darfst. Dein Namespace gibt eine bestimmte Liste frei, alles andere ist verboten. Frag direkt, statt zu raten:
kubectl auth can-i create scaledobjects
kubectl auth can-i list nodesDie vollständige Liste steht unter Berechtigungen und Richtlinien. Manche Berechtigungen sind nur lesend, insbesondere dein Kontingent und die LimitRanges. get kann also durchgehen, während edit am selben Objekt abgelehnt wird.
Cluster-weite Lesezugriffe werden immer abgelehnt, auch harmlos wirkende:
Error from server (Forbidden): nodes is forbidden: User "..." cannot list
resource "nodes" in API group "" at the cluster scopeDas ist so gewollt und kein kaputtes Setup. Es heißt auch, dass du kubectl get storageclass nicht ausführen kannst; die beiden Klassennamen stehen unter Storage.
KUBECONFIG zeigt woanders hin. Prüf, wo du bist:
kubectl config current-contextdenied the request beim Apply
Eine Plattformregel hat gegriffen. Die Form ist immer gleich:
Error from server: error when creating "app.yaml": admission webhook denied the
request: <die Regel, die gegriffen hat, und warum>Die vollständige Liste der Regeln steht unter Berechtigungen und Richtlinien. Die häufigsten:
| Die Meldung nennt | Was gemeint ist | Was zu tun ist |
|---|---|---|
| Volume type not allowed | Ein Inline-Volume im Pod-Spec | Fordere Speicher über ein PersistentVolumeClaim an |
| Only ClusterIP Services are permitted | NodePort, LoadBalancer oder ExternalName | Bleib bei ClusterIP und veröffentliche über eine HTTPRoute |
| may not create Certificate | Ein selbst geschriebenes Certificate | Lass es über die Annotation an deiner HTTPRoute entstehen |
| Hostname is not allowed in namespace | Ein Hostname, den dein Namespace nicht ausliefern darf | Siehe unten |
| must declare at least one hostname | Eine HTTPRoute ohne hostnames | Trag einen ein |
| Free-tier namespaces may only use the nfs-rwx StorageClass | Blockspeicher im Free Tier | Nimm nfs-rwx, siehe Free Tier |
| may not tolerate | Eine Toleration, die auf alles passt | Nimm sie raus und überlass die Platzierung dem Scheduler |
| may not set spec.nodeName | Ein handverlesener Node | Nimm es raus |
| body.maxSize | Ein Body-Limit über der Grenze oder auf null | Setz eine explizite Größe bis maximal 512 MiB |
Hostname is not allowed in namespace
Hostname is not allowed in namespace 'tenant-7'. Tenant namespaces may only use
*.tenant-7.itsh.dev (paid) or *.tenant-7.itsh-apps.dev (free) subdomains or
hostnames listed in the itsh.dev/allowed-hostnames namespace annotation.Dein Namespace besitzt eine Subdomain und kann jeden Namen darunter sofort ausliefern. Alles andere musst du zuerst im Portal eintragen und per DNS-Eintrag nachweisen, dass die Domain dir gehört.
Free-Tier-Namespaces können überhaupt keine eigene Domain nutzen. Die vollständigen Regeln stehen unter Gateway API.
Exec/attach is only allowed into gVisor-sandboxed pods
Du hast versucht, eine Shell in einem verwalteten PostgreSQL-Pod zu bekommen. Die laufen außerhalb der Sandbox, und exec ist nur in sandboxed Pods erlaubt. Diese Kombination wird also abgelehnt.
Das betrifft nur PostgreSQL. In MariaDB- und Dragonfly-Pods kommst du wie überall sonst hinein. Um SQL auszuführen, leite den Port weiter und nimm einen lokalen Client, das ist nicht betroffen. Siehe Datenbanken.
Wie es weitergeht
- Berechtigungen und Richtlinien für die vollständige Liste
- Ein Pod startet nicht, wenn das Manifest durchging, aber nichts hochkam