failurePolicy: bewusst entscheiden
Default Fail (fail-closed): ist Kyverno down, lehnt der API-Server alle gematchten Requests ab. Sicher, aber ein Verfügbarkeits-Risiko, HA-Replicas und PDB einplanen.
Fail-open global per
--forceFailurePolicyIgnore, besser pro
Policy abwägen: Security-Gates Fail,
Komfort-Mutationen Ignore.
Neustart-Deadlock:
--excludeBootstrapResources (seit 1.19, Default
aus) nimmt Node und CSR aus den Fail-Webhooks, damit ein Cluster
ohne laufende Kyverno-Pods wieder hochkommt. Policies auf diese
Kinds greifen dann nicht.
Performance-Tuning
Webhook-Timeout: Default 10s (1–30s), knapp halten, hängende Admission bremst jedes Deployment.
Namespace-Filter:
webhooks.namespaceSelector in der Kyverno-ConfigMap;
kube-system und kyverno sind default
ausgenommen. resourceFilters
[Kind,Namespace,Name]: letzte Verteidigungslinie
hinter dem Webhook. Background-Reports ignorieren sie per
Default (--skipResourceFilters=true), CEL-generate
und -mutateExisting beachten sie seit 1.19.
Match-Blöcke eng schneiden: was nicht matcht, erzeugt keinen Admission-Call.
Egress aus Policies: CEL
http.Get/Post und apiCall.service
laufen gegen --httpBlocklist (Default:
Cloud-Metadaten 169.254.169.254,
metadata.google.internal, Loopback; ein eigener Wert
ersetzt die Defaults, also mitführen) und optional
--httpAllowlist (URL-Präfixe). In
Namespaced-Policies ist HTTP per Default aus
(--allowHTTPInNamespacedPolicies=false). Für
Legacy-apiCall und GlobalContextEntry gilt die
Blocklist erst ab 1.19.1.