Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

The safest Kubernetes configuration for an AI agent is layered: give it a dedicated identity with a namespace-scoped Role, disable credentials it does not need, enforce Pod Security Admission, default-deny network traffic, reject unsafe manifests at admission, isolate powerful workloads, cap resource use, and audit every policy and authorization change. No single control is a sandbox. RBAC limits Kubernetes API actions, NetworkPolicy limits connectivity, and pod-security and admission controls constrain what a workload may ask the cluster to run.

1. Give every agent a narrow identity

Create one ServiceAccount for each agent or trust domain. Do not let an agent use the namespace’s default account, and do not share one account between agents with different duties. A dedicated identity makes access reviews and incident response attributable.

Use a namespaced Role and RoleBinding

Start with the smallest set of resources and verbs the agent actually needs. A Role is limited to one namespace; a RoleBinding grants that Role to the selected ServiceAccount in that namespace. This is safer than a ClusterRoleBinding, which can expose cluster-wide resources.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: agent-runtime
  namespace: ai-agents
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: agent-reader
  namespace: ai-agents
rules:
- apiGroups: ['']
  resources: ['configmaps']
  verbs: ['get', 'list', 'watch']
- apiGroups: ['']
  resources: ['pods']
  verbs: ['get', 'list', 'watch']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: agent-reader
  namespace: ai-agents
subjects:
- kind: ServiceAccount
  name: agent-runtime
  namespace: ai-agents
roleRef:
  kind: Role
  name: agent-reader
  apiGroup: rbac.authorization.k8s.io

The resources in this example are illustrative; remove any rule the agent does not need and add only a documented requirement. Avoid wildcard resources and verbs. In particular, do not grant broad write access merely because an agent might need to inspect objects. Separate read and write identities when possible.

Treat escalation-capable permissions as exceptional

Review any request for impersonate, serviceaccounts/token, certificate approval or signing, webhook configuration, namespace-label mutation, or workload creation as high risk. Those permissions can enable privilege escalation or bypass another policy layer. If an agent must create workloads, constrain the namespaces, resource types, and admission rules that apply to those workloads, and test the resulting path rather than assuming the Role is safe.

“Ideally, minimal RBAC rights should be assigned to users and service accounts.” — Kubernetes project, Role Based Access Control Good Practices.

2. Remove service-account credentials unless the API is required

Set automountServiceAccountToken: false on the ServiceAccount or workload by default. This prevents a token from being mounted into a compromised container that only needs to process data or call an external service.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: agent-runtime
  namespace: ai-agents
automountServiceAccountToken: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: agent
  namespace: ai-agents
spec:
  template:
    spec:
      serviceAccountName: agent-runtime
      automountServiceAccountToken: false
      containers:
      - name: agent
        image: registry.example/agent:approved

If Kubernetes API access is genuinely needed, mount a projected service-account token instead of relying on a long-lived, automatically mounted credential. Set an explicit audience, use a short lifetime appropriate to the task, and grant only the matching API verbs. Keep automounting disabled for every other pod that uses the same namespace.

3. Enforce Pod Security Admission in the agent namespace

Pod Security Admission (PSA) works at namespace scope and provides three levels: privileged, baseline, and restricted. Restricted is the strongest built-in baseline for ordinary workloads because it excludes more host access, capabilities, and unsafe settings. Baseline is a migration step when existing manifests cannot yet satisfy Restricted.

Roll out labels without breaking workloads

Use warn and audit while you identify non-compliant manifests, then switch enforce to Restricted after the agent’s pod template passes. Keep the levels aligned so operators see violations before enforcement.

apiVersion: v1
kind: Namespace
metadata:
  name: ai-agents
  labels:
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/enforce: restricted

If Restricted blocks a required behavior, document the exact setting, determine whether the behavior can be removed, and use Baseline only for the affected namespace or workload. Do not label a broad shared namespace privileged to accommodate one agent.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

4. Contain network reachability with NetworkPolicy

Begin with default-deny ingress and egress in the agent namespace. Then add narrowly scoped exceptions for DNS, required service-to-service calls, the Kubernetes API endpoint when needed, and explicitly approved external destinations. NetworkPolicy controls network reachability; it does not grant Kubernetes API permissions, so it must be paired with RBAC.

Start with a default deny

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: ai-agents
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Add only the traffic the agent needs

A typical follow-up policy permits DNS to the cluster DNS pods on UDP and TCP port 53 and permits traffic to a specifically labelled application service. The DNS labels differ between installations, so inspect your cluster’s labels before applying the selector.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: agent-egress
  namespace: ai-agents
spec:
  podSelector:
    matchLabels:
      app: agent
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

Add a separate rule for each approved API or service destination rather than allowing all addresses. Block cloud instance metadata endpoints and limit instance credentials so a compromised pod cannot turn network access into cloud-account access. Confirm that your CNI plugin enforces NetworkPolicy; a policy object alone does not provide protection if the networking implementation does not support it.

5. Make admission a second gate

Use a ValidatingAdmissionPolicy or validating webhook to reject unsafe workload specifications before they are persisted. Useful checks include privileged containers, host networking, host PID or IPC, hostPath volumes, unsafe Linux capabilities, unapproved images, missing resource limits, and deployment into protected namespaces.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Admission is evaluated after authorization. Therefore, an admission policy cannot repair an over-broad identity: if the agent can create or modify the policy objects themselves, it may be able to remove the gate. Keep policy administration outside the agent’s Role, protect webhook configuration, and test both allowed and rejected requests.

6. Separate namespaces, nodes, and trust levels

Place agents in dedicated namespaces and keep high-trust automation separate from low-trust or publicly exposed workloads. Namespace separation simplifies PSA labels, NetworkPolicy, quotas, and review. It is not a complete isolation boundary, so combine it with identity and admission controls.

For agents that handle sensitive data or can launch powerful workloads, use taints and tolerations, node affinity, or anti-affinity to control placement. Avoid co-locating a powerful agent pod with an untrusted or internet-facing workload. Placement constraints reduce co-location and lateral-movement opportunities; they do not replace RBAC or NetworkPolicy.

7. Put hard ceilings on resource use

Set CPU and memory requests and limits on every agent container. Requests make scheduling predictable; limits prevent one runaway loop from consuming an unbounded share of a node. Enforce defaults and maximums with a LimitRange, and use ResourceQuota to cap aggregate consumption in the agent namespace. These controls are also available as admission plugins, so a deployment that omits limits can be rejected rather than corrected after the fact.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
apiVersion: v1
kind: LimitRange
metadata:
  name: agent-container-limits
  namespace: ai-agents
spec:
  limits:
  - type: Container
    default:
      cpu: 500m
      memory: 512Mi
    defaultRequest:
      cpu: 100m
      memory: 128Mi
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: agent-quota
  namespace: ai-agents
spec:
  hard:
    requests.cpu: 2
    requests.memory: 4Gi
    limits.cpu: 4
    limits.memory: 8Gi
    pods: 10

Choose ceilings from observed workload requirements and revise them through change control. A quota that is too small can cause failed rollouts; one that is too large does not meaningfully limit blast radius.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

8. Turn on auditing and review the changes that matter

Kubernetes auditing produces chronological, security-relevant records of cluster actions. Send audit logs to a protected destination separate from the agent’s namespace and retain enough history for incident investigation. Include the identity, verb, resource, namespace, response status, and source details required by your audit policy.

Review changes to Roles, RoleBindings, ClusterRoles, ClusterRoleBindings, admission policies, and namespace security labels. These objects determine what an agent can do and which safeguards apply. Pair periodic access reviews with tests that attempt representative denied actions; a policy that exists but is not enforced by the target Kubernetes version or network plugin is not a control.

How the control layers compare

Control Primary boundary What it limits What it does not provide
RBAC Kubernetes API identity Verbs on named resources, normally within a namespace A sandbox for code already running inside a pod
Pod Security Admission Namespace admission Privileged mode, host namespaces, dangerous pod settings, and other restricted behaviors Network isolation or API authorization
NetworkPolicy Pod network paths Ingress and egress destinations and ports Permission to call the Kubernetes API
Validating admission Object creation and update Whether a workload or policy specification meets your rules Protection if the caller can change the admission policy
Namespace and node placement Workload co-location Which workloads share administrative and physical boundaries Guaranteed isolation from every cluster-level failure
LimitRange and ResourceQuota Resource consumption Per-container defaults and namespace-wide ceilings Control over external services or cloud permissions
Audit logging Evidence and detection Records of actions and policy changes Prevention of an action by itself

Recommended implementation order

  1. Create the dedicated namespace and ServiceAccount; remove use of the default account.
  2. Write a minimal Role and RoleBinding from observed API calls, then remove wildcard rules and unnecessary writes.
  3. Disable token automounting. Add an audience-bound projected token only to the workload that needs API access.
  4. Apply PSA warn and audit, fix violations, and enable enforce=restricted when compatible.
  5. Apply default-deny ingress and egress, then permit DNS and named destinations one rule at a time.
  6. Deploy admission validation for privileged settings, host access, images, capabilities, and resource limits.
  7. Add namespace quotas and container requests and limits.
  8. Constrain placement for sensitive agents with taints, tolerations, affinity, or anti-affinity.
  9. Enable protected audit-log delivery and schedule reviews of authorization and policy objects.
  10. Test the complete path in the target Kubernetes version: allowed reads should succeed, while unauthorized writes, host access, forbidden network connections, and over-quota deployments should fail.

Troubleshooting common failures

The agent receives a 403 from the Kubernetes API

Confirm that the pod uses the intended ServiceAccount, that the RoleBinding is in the same namespace as the subject and Role, and that the Role names the exact API group, resource, namespace, and verb. If automounting is disabled, verify that the application has the explicitly projected token it was designed to use.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The pod is rejected by Pod Security Admission

Read the rejection message and remove the cited host namespace, capability, volume, user, or privilege setting. During migration, keep warn and audit enabled while fixing manifests; do not solve one incompatible pod by weakening an entire shared namespace.

DNS or a required service stops working after default deny

Check that the NetworkPolicy selects the agent pod, permits both DNS transport protocols where required, and matches the actual labels in the DNS namespace. Add an explicit rule for each service or API destination instead of opening unrestricted egress.

An agent still causes damage despite narrow RBAC

RBAC may be working as designed while the pod retains network access, cloud credentials, excessive resources, or the ability to create an unsafe workload. Recheck token mounting, metadata reachability, admission validation, resource ceilings, and node co-location as separate layers.

Deployments fail after quotas or limits are added

Inspect namespace quota usage and the container’s requests and limits. Reduce the requested footprint, increase the approved quota through review, or remove stale workloads. Do not delete the quota simply to make a rollout pass.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.