Kagent on Kubernetes: What Does it Give Your AI Platform? Kagent, an open-source Kubernetes operator for AI agents, lets users define agents as custom resources and reconcile them into running workloads, with the operator owning the workload, reasoning loop, tool registration, and session state while users retain control over namespaces, network policy, secrets, and identity. A hands-on deployment on Amazon EKS showed the operator generating Deployments, Services, ServiceAccounts, and Secrets from a 30-line YAML manifest, alongside prebuilt agents like k8s-agent, helm-agent, istio-agent, and promql-agent, and a web UI, database, and tool server. K agent https://kagent.dev is an open-source Kubernetes operator for AI agents. It allows you to write a custom resource describing what the agent should be, apply it, and a controller turns it into a running workload. Thirty lines of YAML, and you have an agent in a pod. I ran a small agent fleet on EKS with kagent to experience for myself its capabilities, learn more AI platform engineering and to properly understand the boundaries of what it provides. The next question is then, what was just put in your cluster, and what else is there to do? An agent is a long-lived workload that talks to a model, calls tools that touch real systems, holds state, and possibly+probably talks to other agents. Some of these surfaces the operator now owns for you while it deliberately doesn’t own others. Here’s a map for illustration: In short: kagent owns the workload, the reasoning loop, tool registration, session state. You still own namespaces, network policy, secrets, identity, etc. The same platform work as everything else you run. The operator does not own a clean bottom half of the stack. Each layer is divided, and the right-hand side is ordinary platform work — quota, egress, secrets, RBAC, backup, identity. The core of kagent is the ability to describe an agent as a Kubernetes object. A Go controller reconciles it into the actual workload. Its manifest would look something like this: apiVersion: kagent.dev/v1alpha2kind: Agentmetadata:name: cluster-diagnosticsnamespace: kagentspec:type: Declarativedeclarative:modelConfig: default-model-configsystemMessage: |You are a read-only Kubernetes troubleshooting specialist…tools:- type: McpServermcpServer:kind: RemoteMCPServername: kagent-tool-servertoolNames: k8s get resources, k8s get events, k8s get pod logs Apply that and the controller produces a Deployment, a Service, a ServiceAccount with the RBAC that workload needs, and a Secret holding the rendered agent config. With that, Agents have become declarative Kubernetes objects that can be versioned and rolled out with GitOps. Here’s what’s in my kagent namespace. Here a single namespace is used for ease of exploration and illustration. This isn’t a stock install, took the command output after switching off several built-in agents and adding a few custom agents and MCP servers as i was exploring. As can be seen, there’s an operator, a database, a tool server, a web UI, and a set of prebuilt agents that work the moment the kagent chart lands — k8s-agent , helm-agent , istio-agent , promql-agent and others. bash $ kubectl -n kagent get podskagent-controller-cf74f9f96-kwblb 1/1 Running the operatorkagent-postgresql-6c47c5bc6f-hg6cz 1/1 Running state storekagent-tools-56494b5564-7zsdn 1/1 Running built-in MCP tool serverkagent-kmcp-controller-manager-76bb479b6-4s8z4 1/1 Running kmcp — build/deploy your own MCP serverskagent-ui-69cf9cd7cf-rpbmr 1/1 Running web UIkagent-default-67c785f9db-wnzc2 1/1 Running part of the kagent installhelm-agent-5fd78944d8-wzdkx 1/1 Running built-in agentistio-agent-6dfb7b5f-xgm6v 1/1 Running built-in agentk8s-agent-9f9548bdc-mnrdb 1/1 Running built-in agentpromql-agent-f7cb48786-tf5jb 1/1 Running built-in agentcloud-diagnostics-5cf9fc9684-ppg6v 1/1 Running minecluster-diagnostics-756cf6455b-vdpgz 1/1 Running minecluster-remediation-76ccf4f698-xf99n 1/1 Running mineincident-commander-5c89f99d6d-rrpdp 1/1 Running mine orchestrator investigation-loop-797bbc9f7c-kp87w 1/1 Running mine BYO cost-sentinel-644f7c6c44-kwxss 1/1 Running mineaws-documentation-76b96d6c8f-tgjzj 1/1 Running mine MCP server aws-eks-57977cb77d-mhgbq 1/1 Running mine MCP server aws-pricing-9576cf679-m9722 1/1 Running mine MCP server agent-sandbox-probe 1/1 Running mine sandbox experiment Looking at the API surface itself by k8s API group , kagent comes with 9 custom resources under 1 API group. Each is a thing that used to live inside an agent application when needed; and now they live in the cluster API. bash $ kubectl get crd -o custom-columns=NAME:.metadata.name,GROUP:.spec.group --no-headers \ | grep 'kagent.dev$' | sortagentharnesses.kagent.dev kagent.devagents.kagent.dev kagent.devmcpservers.kagent.dev kagent.devmemories.kagent.dev kagent.devmodelconfigs.kagent.dev kagent.devmodelproviderconfigs.kagent.dev kagent.devremotemcpservers.kagent.dev kagent.devsandboxagents.kagent.dev kagent.devtoolservers.kagent.dev kagent.dev ModelConfig and ModelProviderConfig hold the provider, the model, and the credential reference. Agents can then point to them by name refer to yaml above . Change a model, or move a model provider’s key, and you’re editing a namespaced object without needing to redeploy agents. But of course, the fact that prompts and tool-calling behaviour are model-specific needs to be accounted for when changing this shared object. While some of what kagent owns is a CRD you create, some are just a field on the Agent you already have. For examplerequireApproval allows for human-in-the-loop and is nested inside the tool reference: bash $ kubectl explain agent.spec.declarative.tools.mcpServerFIELDS: allowedHeaders < string apiGroup