When an admission webhook blocks your fix as well as the change that caused the problem, it is doing one of two things. Either the API server could not reach the webhook and applied the webhook’s failurePolicy, or the webhook was reached and explicitly returned a denial. The two produce similar-looking errors, but they need opposite responses. Identify which one you have before you edit anything, because a change that helps one case can do nothing for the other.
This guide gives you that distinction, the commands to find the responsible configuration, and an ordered recovery path. The exact webhook name, Kubernetes version and full error text decide the final fix, so the steps below show how to pin those down first.
As an Amazon Associate I earn from qualifying purchases.
Why a call failure and an explicit denial need different fixes
Kubernetes treats these two conditions differently, and that difference is the most important fact in this problem. The official Dynamic Admission Control documentation states:
“The API server does not apply a failure policy when the webhook is reached successfully, and the webhook implementation has explicitly rejected the request (by specifying allowed: false in the response).”
#1 Best Overall
The same documentation says that “The default failurePolicy for an admission webhooks is Fail.” The table below shows how each condition plays out.
| Condition | What the API server does | Does changing failurePolicy help? |
|---|---|---|
| Webhook cannot be called (timeout, connection failure, malformed response) | Applies failurePolicy: Fail rejects the request; Ignore lets it continue |
Yes. Switching to Ignore can unblock changes while the endpoint is down. |
Webhook is reached and returns allowed: false |
Denies the request whatever the failurePolicy is | No. The denial is an explicit policy decision, not an availability error. |
Read the exact error before changing anything
Reproduce the failing command and capture the complete output, including any text after the webhook name. Then sort it into one of two groups:
- Call failure: the message says the webhook could not be called. Kubernetes reports these as a failed call to a named webhook, typically with a timeout, connection or invalid-response reason. Your next step is the endpoint and failurePolicy path.
- Explicit denial: the webhook was reached and rejected the object. The message usually carries the webhook’s own reason text. Your next step is to change the object, or the webhook’s rules, so that it passes the webhook’s policy.
Exact wording varies between Kubernetes versions and between webhook implementations, so match against the output from your own cluster rather than a template.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Find the webhook that is matching your request
Admission webhooks are registered in two cluster-scoped configuration kinds: ValidatingWebhookConfiguration and MutatingWebhookConfiguration. List both:
kubectl get validatingwebhookconfigurations
kubectl get mutatingwebhookconfigurations
Save the configuration of each candidate before you touch it, because a broken webhook may stop you from reading it later:
kubectl get validatingwebhookconfiguration <name> -o yaml > webhook-backup.yaml
In that YAML, check the fields that decide whether your request is sent to the webhook at all:
- rules: the API groups, versions, resources, operations (CREATE, UPDATE, DELETE, CONNECT) and scope that trigger the call.
- namespaceSelector: which namespaces are in scope. A recovery change in a namespace that matches still reaches the webhook.
- objectSelector: which objects, by label, are in scope.
- matchConditions: CEL expressions that must be true before the webhook is called. They narrow matching further than selectors alone.
- failurePolicy and timeoutSeconds: how call errors are handled and how long the API server waits.
Check whether your fix matches the webhook itself
A repair request can be intercepted by the same webhook it is trying to repair. Whether that happens depends on the rules, not on the intent of the change, so check each recovery action against the configuration you saved.
| Recovery action | Resource the API server sends to the webhook | Likely to be intercepted when |
|---|---|---|
| Restart or scale the webhook Deployment | Pods created or rescheduled in the webhook’s namespace | Rules match Pods and the namespace is not excluded |
| Edit the webhook’s Service or Endpoints | Service objects in the webhook’s namespace | Rules match Services in that namespace |
| Edit the webhook configuration (failurePolicy, selectors) | ValidatingWebhookConfiguration or MutatingWebhookConfiguration objects | Rules match the admissionregistration.k8s.io resources |
| Fix an application workload the webhook validates | The workload’s Pods or controller objects | The webhook’s rules cover that workload’s kind and namespace |
If a recovery action is intercepted, the webhook has to accept it, which it will not do while it is failing. This is why the next two sections matter.
When the webhook endpoint is down: failurePolicy trade-offs
If the error is a call failure, failurePolicy decides whether the request is rejected or allowed through. The choice is an availability and enforcement trade-off, not a bypass for denials.
| Setting | On a call failure | On an explicit denial | Main risk |
|---|---|---|---|
Fail (default) |
Request rejected | Request rejected | An outage of the webhook blocks every matching change, including repairs |
Ignore |
Request continues without the webhook’s check | Request still rejected | Objects that the webhook should have checked get admitted unchecked while it is down |
Kubernetes good-practices guidance for admission webhooks says mutating webhooks should consider failing open, and that validating admission can check the final state of an object. That approach limits how much a temporary mutator outage can block compliant resources. It also means that a mutator outage does not have to become a total cluster change freeze.
Break recovery dependency loops
A webhook can block its own recovery in three common ways. Each one has a different fix.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsSelf-mutation and self-validation
A webhook that intercepts Pods in its own namespace can stop its own Pods from being created or rescheduled, especially when it requires a property those Pods do not have. Exclude the webhook’s namespace with namespaceSelector, or exclude the webhook’s Pods with objectSelector, so that its own components are never sent to it.
Best Value
Two webhooks validating each other
If webhook A validates resources that webhook B needs to start, and B validates resources that A needs, neither can recover once both are down. Break the loop by narrowing the rules of one of them so that it stops matching the other’s dependencies.
Interception of a dependency the webhook needs
A webhook that intercepts a cluster add-on or other component it depends on can deadlock in the same way. Exclude that dependency’s namespace or objects from matching, and document the exclusion in the webhook’s configuration so future changes do not reintroduce it.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Recovery sequence
Work through these steps in order and stop as soon as the request succeeds.
Recommended Free Tools
- Confirm the error category using the reproduction and the distinction in the first section. If the message is an explicit denial, skip to step 6.
- Restore the webhook endpoint first. Check its Deployment, Pods and EndpointSlices in the webhook’s namespace:
kubectl -n <webhook-namespace> get deploy,pods kubectl -n <webhook-namespace> get endpointslices -l kubernetes.io/service-name=<webhook-service>If the Pods are pending because the webhook intercepts their creation, go to step 3.
- Exclude the webhook’s own namespace. Open the saved configuration with
kubectl edit validatingwebhookconfiguration <name>(ormutatingwebhookconfiguration) and add anamespaceSelectorthat excludes the webhook’s namespace. If that edit is itself rejected, the configuration is intercepted, so go to step 5. - Temporarily set failurePolicy to Ignore only if the error is a call failure and you need the blocked change now. Patch the webhook entry with its index from the saved YAML, for example:
kubectl patch validatingwebhookconfiguration <name> --type=json -p='[{"op":"replace","path":"/webhooks/0/failurePolicy","value":"Ignore"}]'Restore
Failonce the endpoint is healthy, and check any objects admitted during the window. - Remove the webhook configuration as a last resort. This disables that webhook’s enforcement across the cluster until you restore it. Confirm you have the backup from earlier, delete the configuration with
kubectl delete validatingwebhookconfiguration <name>, make the repair, then reapply the saved YAML withkubectl apply -f webhook-backup.yaml. - If the error is an explicit denial, do not change failurePolicy. Adjust the object so it satisfies the webhook’s policy, or ask the webhook’s owner to change its rules or its response logic. The denial came from the webhook’s decision, and only that decision can change the outcome.
Prevent the next lockout
- Scope each webhook with rules, namespaceSelector, objectSelector and matchConditions rather than matching broadly.
- Exclude the webhook’s own namespace and any components it depends on.
- Run the webhook with more than one replica and keep its Service healthy, so a single failed Pod does not trigger a call failure across the cluster.
- Choose failurePolicy per webhook, and document why
FailorIgnorewas chosen. - Keep a current backup of every webhook configuration, so recovery does not depend on reading a broken cluster.
“
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

