Kubernetes Admission Controller is a Kubernetes control plane component that checks requests to the Kubernetes API before the API server saves them to etcd. It can allow a request, reject it, or modify it first, which makes it useful for enforcing security, configuration, and operational rules across a cluster.
An admission controller runs after authentication and authorization, but before the requested object is persisted. For example, a user may have permission to create a Pod, but an admission controller can still block that Pod if it runs as root, uses a forbidden image registry, or lacks required labels.
Admission controllers commonly handle:
When a client sends a request to the Kubernetes API server, the request goes through several steps:
Kubernetes includes built-in admission controllers, such as NamespaceLifecycle, ResourceQuota, and LimitRanger. Teams can also run their own admission logic through admission webhooks.
Admission webhooks let you extend Kubernetes admission behavior with custom services. The API server sends an admission review request to the webhook service, and the service returns a decision.
Tools such as OPA Gatekeeper, Kyverno, and custom webhook services use this pattern to enforce cluster policy. For example, a platform team might require every workload created through GitOps, Terraform, or Crossplane to include an owner label and a cost-center label. If you manage workloads with infrastructure as code, admission controls can complement workflows such as deploying Kubernetes resources using Terraform.
Suppose a developer creates this Deployment without resource limits. A validating admission controller can reject it with a clear error message:
containers:
- name: api
image: example.com/api:1.2.3
The controller might return:
Denied: container "api" must define cpu and memory requests and limits
A mutating admission controller could take a different approach and add default values automatically, such as:
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
Role-Based Access Control, or RBAC, decides whether a user or service account can perform an action, such as creating a Deployment. An admission controller decides whether the specific object being created or changed is acceptable.
For example, RBAC may allow a CI/CD service account to create Deployments in the production namespace. An admission controller can still reject a Deployment that uses the latest image tag, lacks resource limits, or tries to mount the host filesystem.
Admission controllers work well as a final cluster-side guardrail. They should not replace code review, CI checks, security scanning, or infrastructure testing. Instead, they catch unsafe or non-compliant changes at the Kubernetes API boundary, including changes made by automation.
This is useful when teams manage clusters through multiple paths, such as Helm charts, GitOps, Terraform, or Crossplane. For example, if a platform team lets application teams provision cloud dependencies through Kubernetes APIs, admission policies can help control which claims and managed resources are allowed. This pattern often appears in setups that deploy a Kubernetes app with AWS resources using Crossplane.