콘텐츠로 이동
Study Notekagent · kmcp

kagent와 kmcp가 맡는 자리

결론부터
  • kagent는 Agent 리소스를 Deployment·Service로 바꾸고, 그 Agent를 부르는 주소를 controller에 열어 주는 Kubernetes controller다.
  • kmcp는 MCPServer 리소스를 같은 방식으로 MCP 서버 Pod로 바꾼다. kagent chart에 기본 포함된다.
  • 경로는 둘이다. 리소스를 선언하는 경로는 Kubernetes API를, Agent를 호출하는 경로는 controller의 8083 포트를 지난다.
  • UI와 CLI는 이 두 경로를 쓰는 클라이언트일 뿐이다. 없어도 Agent는 배포되고 호출된다.
이 장에서 처음 나오는 말5개
CRDCustom Resource Definition
Kubernetes API에 Agent 같은 새 리소스 종류를 추가하는 확장 방식이다. kagent의 설정은 전부 이 리소스로 표현된다.
controllerKubernetes Controller
선언된 리소스와 실제 상태를 계속 비교해 맞추는 프로세스다. Agent가 생기면 Deployment를 만들고, 지워지면 함께 지운다.
MCPModel Context Protocol
Agent가 외부 도구를 호출하는 표준 프로토콜이다. 도구를 제공하는 쪽을 MCP 서버라 부른다.
A2AAgent-to-Agent Protocol
Agent를 호출하고 응답을 stream으로 받는 표준 프로토콜이다. kagent의 모든 Agent가 이 방식으로 호출된다.
ADKAgent Development Kit
Google이 만든 Agent 실행 프레임워크다. kagent의 Agent Pod 안에서 LLM 호출과 tool 호출을 반복하는 loop를 돌린다.

Agent를 Kubernetes에 직접 올리려면 Agent마다 Deployment·Service·ConfigMap을 만들고, 모델 API key를 연결하고, tool 서버 주소를 주입하고, 호출용 endpoint를 따로 설계해야 한다. Agent가 열 개가 되면 이 반복이 열 번이다. kagent는 이 반복을 “Agent 하나 = 리소스 하나”로 줄인다. Solo.io가 2025년에 만들었고 CNCF sandbox 프로젝트다.

이 페이지는 kagent가 클러스터에 무엇을 띄우고, 우리가 무엇을 선언하며, 요청이 어디로 들어오는지를 본다.

kagent namespace에 controller, UI, kmcp controller, PostgreSQL이 뜨고 controller가 Agent Pod를, kmcp controller가 MCP 서버 Pod를 만든다

공식 아키텍처 문서가 설명하는 구성 요소에 chart가 함께 설치하는 것을 더하면 다음과 같다.

구성 요소하는 일없으면
controllerCRD를 감시해 Agent Pod를 만들고, 8083 포트에서 관리 API·A2A·MCP endpoint를 연다아무것도 배포·호출되지 않는다
Agent PodAgent 하나의 대화 loop를 돌린다. Declarative면 kagent의 ADK runtime, BYO면 우리 imageAgent가 없다
kmcp controllerMCPServer를 감시해 MCP 서버 Pod와 Service를 만든다MCP 서버를 직접 Deployment로 띄워야 한다
PostgreSQLsession·task·memory 같은 대화 상태를 저장한다대화 이력이 남지 않는다
UIAgent 생성·채팅·tool 확인용 웹 화면. nginx가 /api를 controller로 넘긴다운영 화면만 없다. Agent 동작과 무관
CLI (kagent, kmcp)설치, project 생성, manifest 생성, 호출을 돕는 로컬 도구같은 일을 Helm·kubectl로 한다

chart는 여기에 예제 Agent 여러 개와 내장 tool 서버(kagent-tools)도 함께 설치한다. 이것은 설치 구성에서 끌지 말지 정한다.

kagent를 쓴다는 것은 아래 리소스를 만든다는 뜻이다. API reference의 resource type과 kmcp API를 합친 목록이다.

리소스API선언하는 것이 덱의 페이지
Agentkagent.dev/v1alpha2Agent 하나. 지시문·모델·tool 또는 container imageAgent
ModelConfigkagent.dev/v1alpha2어떤 provider의 어떤 모델을 어떤 key로 부를지ModelConfig
RemoteMCPServerkagent.dev/v1alpha2이미 떠 있는 MCP 서버의 URLTool 연결
MCPServerkagent.dev/v1alpha1kmcp가 띄울 MCP 서버의 image·명령·전송 방식kmcp
SandboxAgentkagent.dev/v1alpha2Agent Substrate 위에서 격리 실행할 Agent세 실행 형태
AgentHarnesskagent.dev/v1alpha2OpenClaw·Hermes 같은 외부 coding agent의 sandboxHermes

ModelProviderConfig도 있지만 UI에서 모델 목록을 자동으로 찾아오는 용도다. 이름만 알아 두면 된다.

리소스는 서로를 이름으로 참조한다. Agent가 ModelConfig와 tool 서버를 가리키고, controller가 그 참조를 풀어 Agent Pod의 설정으로 넣는다.

Agent 리소스가 ModelConfig와 tool 서버 리소스를 이름으로 참조하고 ModelConfig는 Secret을 참조한다

kagent와 주고받는 통신은 성격이 다른 두 갈래다. 둘을 섞으면 권한 설계가 꼬인다.

선언 경로호출 경로
하는 일Agent·tool·모델을 만들고 고친다배포된 Agent에 질문을 보낸다
입구Kubernetes API (kubectl apply, GitOps 도구)controller Service의 8083 포트
프로토콜Kubernetes 리소스A2A (JSON-RPC over HTTP, SSE stream)
결과 확인리소스의 status.conditions응답 stream
누가 쓰나배포 주체 — 우리 방식에서는 GitOps 도구호출 주체 — 우리 방식에서는 backend

호출 주소는 Agent마다 /api/a2a/{namespace}/{agent-name}/ 형태로 열린다 (A2A 예제). Agent Card는 그 아래 .well-known/agent.json에서 받는다.

터미널 창
# 설명용 — controller Service에 접근할 수 있는 곳에서
curl http://kagent-controller.kagent:8083/api/a2a/agents/hr-helper/.well-known/agent.json

같은 포트의 /mcp는 떠 있는 Agent 전체를 MCP 서버 하나로 노출한다. list_agents와 invoke_agent 두 tool이 있어서 Cursor 같은 MCP client가 kagent Agent를 부를 수 있다 (Agents via MCP). 편리하지만 모든 Agent를 한 번에 여는 문이므로, 이 포트에 누가 닿을 수 있는지가 곧 접근 제어다. 이 문제는 oauth2-proxy와 trusted-proxy 인증에서 다룬다.

kmcp는 별도 저장소의 하위 프로젝트지만 v0.7부터 kagent chart에 기본 포함된다. 역할은 둘로 나뉜다.

  • 개발 도구: kmcp init으로 MCP 서버 project를 만들고 kmcp run으로 로컬에서 시험한다.
  • 배포 controller: MCPServer 리소스를 Deployment·Service·ConfigMap으로 바꾼다.

kagent 입장에서 MCP 서버는 “URL로 닿는 tool 제공자”일 뿐이다. kmcp가 띄운 서버든, 우리가 직접 Deployment로 띄운 서버든, 클러스터 밖의 서버든 Agent는 같은 방식으로 참조한다. kmcp는 그중 클러스터 안에서 띄우는 작업만 줄여 준다.

  • UI Pod를 지우면 배포된 Agent의 A2A 호출은 어떻게 되는가? → 그대로 동작한다. UI는 controller의 클라이언트이고 호출 경로는 controller 8083과 Agent Pod만 지난다.
  • Agent 리소스를 kubectl delete하면 무엇이 사라지는가? → controller가 만든 Deployment·Service가 함께 사라지고 호출 주소도 닫힌다. ModelConfig와 tool 서버 리소스는 별개라 남는다.