MKP - Kubernetes MCP 服务器
项目简介
MKP (Model Kontext Protocol Server for Kubernetes) 是一个基于 Model Context Protocol (MCP) 标准构建的服务器实现。它充当大型语言模型 (LLM) 应用与 Kubernetes 集群之间的桥梁,将 Kubernetes 的资源和操作转换为 LLM 可以理解和使用的结构化上下文 (Resources) 和可调用功能 (Tools)。这使得 LLM 应用能够安全、高效地查询、监控和管理 Kubernetes 环境。
主要功能点
- Kubernetes 资源管理: 允许 LLM 通过标准化的工具接口与 Kubernetes 资源交互,例如:
- 列出集群或命名空间下的特定类型资源(如 Pods, Deployments)。
- 获取特定资源的详细配置或状态,包括子资源(如获取 Pod 的日志)。
- 根据提供的清单创建或更新 Kubernetes 资源。
- 结构化上下文提供: MKP 可以将 Kubernetes 集群中存在的资源信息作为 MCP Resources 提供给 LLM 客户端,帮助 LLM 理解集群的当前状态和结构。用户可以选择是否启用此功能以控制 LLM 上下文的大小。
- 标准化协议通信: 使用 Model Context Protocol (MCP) 通过 JSON-RPC over SSE 等传输协议与 LLM 客户端通信,确保互操作性和扩展性。
- 基于 Kubernetes API Machinery: 直接使用 Kubernetes 官方 Go 客户端库与集群 API 服务器通信,无需依赖 'kubectl' 或 'helm' 等外部命令行工具,提高了效率和可靠性。
安装步骤
要构建并运行 MKP 服务器,您需要 Go 1.24 或更高版本以及 Task 工具。
- 克隆仓库:
git clone https://github.com/StacklokLabs/mkp.git cd mkp - 安装依赖:
task install - 构建服务器:
构建成功后,可执行文件将位于 './build' 目录下。task build
服务器配置(供 MCP 客户端使用)
MKP 服务器通常作为 MCP 客户端(如 LLM 代理或 ToolHive)的一个外部进程启动。MCP 客户端需要知道如何启动和连接到 MKP 服务器。以下是 MCP 客户端可能需要配置的 MKP 服务器启动信息示例:
- 'server name': 'kubernetes-mcp-server' (这是服务器在 MCP 网络中的唯一标识)
- 'command': './build/mkp-server' (这是您构建的 MKP 服务器二进制文件路径)
- 'args': 这是一个字符串数组,包含传递给服务器的命令行参数。常用的参数包括:
- '--kubeconfig /path/to/your/kubeconfig': 指定用于连接 Kubernetes 集群的 kubeconfig 文件路径。如果不指定,将尝试使用集群内配置或默认路径 '~/.kube/config'。
- '--addr :8080': 指定服务器监听的地址和端口。客户端将连接到此地址。
- '--serve-resources false': 如果您不想让服务器将所有 Kubernetes 资源暴露为 MCP Resources,可以设置为 'false'。默认为 'true'。
请注意,上述信息是为配置 MCP 客户端而提供的,您不需要在 MKP 服务器本身执行这些配置。
基本使用方法
- 启动 MKP 服务器: 在终端中运行您构建的 MKP 服务器二进制文件,例如:
服务器将启动并监听指定的地址。./build/mkp-server --kubeconfig /path/to/your/kubeconfig --addr :8080 - 连接 MCP 客户端: 配置您的 MCP 客户端(如 ToolHive 或兼容 LLM 代理),使其能够启动并连接到 MKP 服务器指定的地址和端口。
- LLM 交互: 一旦客户端连接成功,它将发现 MKP 服务器提供的 Kubernetes 工具 ('list_resources', 'get_resource', 'apply_resource') 和可选的资源上下文。LLM 可以通过调用这些工具并提供相应的参数(例如,调用 'list_resources' 工具并指定 'resource_type', 'group', 'version', 'resource', 'namespace' 参数)来执行 Kubernetes 操作并获取结果。
例如,LLM 可以通过调用 'get_resource' 工具,提供 'resource_type' 为 "namespaced", 'namespace' 为 "default", 'resource' 为 "pods", 'name' 为 "my-pod", 'subresource' 为 "logs" 等参数,来获取特定 Pod 的日志。