r

reza-gholizade

@reza-gholizade/k8s-mcp-server
0 Stars 304 次浏览 reza-gholizade 更新于 2026-08-23
该服务暂未提供标准配置,请参考 README 手动接入

服务介绍

Kubernetes MCP 服务器

一个 Kubernetes 模型上下文协议 (MCP) 服务器,提供通过标准化接口与 Kubernetes 集群交互的工具。

特性

  • API 资源发现:获取 Kubernetes 集群中所有可用的 API 资源。
  • 资源列表:列出任何类型的资源,并可选地进行命名空间和标签过滤。
  • 资源详情:获取特定 Kubernetes 资源的详细信息。
  • 资源描述:获取 Kubernetes 资源的全面描述,类似于 kubectl describe
  • Pod 日志:从特定 Pod 中检索日志(可选地从特定容器或所有容器)。
  • 节点指标:获取特定节点的资源使用指标。
  • Pod 指标:获取特定 Pod 的 CPU 和内存指标。
  • 事件列表:列出命名空间内的事件或特定资源的事件。
  • 资源创建/更新:从 YAML 或 JSON 清单文件创建新的 Kubernetes 资源或更新现有资源。
  • 标准化接口:使用 MCP 协议以实现一致的工具交互。
  • 灵活配置:支持不同的 Kubernetes 上下文和资源范围。
  • 多种模式:可以在 stdio 模式下运行以供 CLI 工具使用,或在 sse 模式下运行以供 Web 应用程序使用。

前提条件

  • Go 1.20 或更高版本
  • 访问 Kubernetes 集群
  • 配置了适当集群访问权限的 kubectl

安装

  1. 克隆仓库:
    bash
    git clone https://github.com/reza-gholizade/k8s-mcp-server.git
    cd k8s-mcp-server

  2. 安装依赖项:
    bash
    go mod download

  3. 构建服务器:
    bash
    go build -o k8s-mcp-server main.go

使用

启动服务器

服务器可以以两种模式运行,可以通过命令行标志或环境变量进行配置。

Stdio 模式(用于 CLI 集成)

此模式使用标准输入/输出进行通信。

bash
./k8s-mcp-server --mode stdio

或者使用环境变量:
bash
SERVER_MODE=stdio ./k8s-mcp-server

SSE 模式(用于 Web 应用程序)

此模式启动一个支持 Server-Sent Events 的 HTTP 服务器。

默认(端口 8080):
bash
./k8s-mcp-server --mode sse

指定端口:
bash
./k8s-mcp-server --mode sse --port 9090

或者使用环境变量:
bash
SERVER_MODE=sse SERVER_PORT=9090 ./k8s-mcp-server

如果没有指定模式,默认为 SSE 模式并使用端口 8080。

使用 Docker 镜像

您也可以使用来自 Docker Hub 的预构建 Docker 镜像来运行服务器。

  1. 拉取镜像:
    bash
    docker pull ginnux/k8s-mcp-server:latest

    可以将 latest 替换为特定版本标签(例如 1.0.0)。

  2. 运行容器:

    • SSE 模式(镜像的默认行为):
      bash
      docker run -p 8080:8080 -v ~/.kube/config:/root/.kube/config:ro ginnux/k8s-mcp-server:latest

      这会将容器的 8080 端口映射到主机的 8080 端口,并以只读方式挂载您的 Kubernetes 配置。服务器将在 http://localhost:8080 可用。镜像默认为 sse 模式并在端口 8080 上运行。

    • Stdio 模式:
      bash
      docker run -i --rm -v ~/.kube/config:/root/.kube/config:ro ginnux/k8s-mcp-server:latest --mode stdio

      -i 标志对于交互式的 stdio 通信很重要。--rm 在退出后清理容器。

    • SSE 模式的自定义端口:
      bash
      docker run -p 9090:9090 -v ~/.kube/config:/root/.kube/config:ro ginnux/k8s-mcp-server:latest --mode sse --port 9090

使用 Docker Compose

创建一个 docker-compose.yml 文件:
yaml
version: 3.8
services:
k8s-mcp-server:
image: ginnux/k8s-mcp-server:latest # 或者特定版本
container_name: k8s-mcp-server
ports:
- "8080:8080" # 主机:容器,如果使用不同的 SERVER_PORT,请调整
volumes:
- ~/.kube:/root/.kube:ro # 以只读方式挂载 kubeconfig
environment:
- KUBECONFIG=/root/.kube/config
- SERVER_MODE=sse # 默认,可以是 stdio
- SERVER_PORT=8080 # SSE 模式的端口
restart: unless-stopped
# 若要在 stdio 模式下使用 docker-compose,可能需要调整 ports,
# 添加 stdin_open: true 和 tty: true,并可能覆盖命令。
# 例如,强制使用 stdio 模式:
# command: ["--mode", "stdio"]然后开始执行:
bash
docker compose up -d

要查看日志:docker compose logs -f k8s-mcp-server

发起API调用(SSE模式)

一旦服务器以SSE模式运行,你可以向其HTTP端点发起JSON-RPC调用(例如,//rpc,具体取决于mcp-go库的SSE服务器实现):
bash
curl -X POST -H "Content-Type: application/json" -d {
"jsonrpc": "2.0",
"id": 1,
"method": "getAPIResources",
"params": {
"arguments": {
"includeNamespaceScoped": true,
"includeClusterScoped": true
}
}
} http://localhost:8080/

(注意:使用SSE服务器时,JSON-RPC over HTTP的确切端点可能依赖于mcp-go库的版本。如果/不起作用,请尝试/rpc。)

可用工具

1. getAPIResources

检索Kubernetes集群中所有可用的API资源。

参数:

  • includeNamespaceScoped (布尔型, 可选): 是否包含命名空间范围内的资源(默认为true)。
  • includeClusterScoped (布尔型, 可选): 是否包含集群范围内的资源(默认为true)。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getAPIResources",
"params": {
"arguments": {
"includeNamespaceScoped": true,
"includeClusterScoped": true
}
}
}

2. listResources

列出特定类型资源的所有实例。

参数:

  • Kind (字符串, 必需): 要列出的资源种类(例如,“Pod”,“Deployment”)。
  • namespace (字符串, 可选): 列出资源的命名空间。如果省略,则对于命名空间范围内的资源将跨所有命名空间列出(受RBAC限制)。
  • labelSelector (字符串, 可选): 按标签选择器过滤资源(例如,“app=nginx,env=prod”)。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "listResources",
"params": {
"arguments": {
"Kind": "Pod",
"namespace": "default",
"labelSelector": "app=nginx"
}
}
}

3. getResource

获取特定资源的详细信息。

参数:

  • kind (字符串, 必需): 要获取的资源种类(例如,“Pod”,“Deployment”)。
  • name (字符串, 必需): 要获取的资源名称。
  • namespace (字符串, 可选): 资源所在的命名空间(对于命名空间范围内的资源是必需的)。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getResource",
"params": {
"arguments": {
"kind": "Pod",
"name": "nginx-pod",
"namespace": "default"
}
}
}

4. describeResource

描述Kubernetes集群中的一个资源,类似于kubectl describe

参数:

  • Kind (字符串, 必需): 要描述的资源种类(例如,“Pod”,“Deployment”)。
  • name (字符串, 必需): 要描述的资源名称。
  • namespace (字符串, 可选): 资源所在的命名空间(对于命名空间范围内的资源是必需的)。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "describeResource",
"params": {
"arguments": {
"Kind": "Pod",
"name": "nginx-pod",
"namespace": "default"
}
}
}

5. getPodsLogs

检索特定pod的日志。

参数:

  • Name (字符串, 必需): pod的名称。
  • namespace (字符串, 必需): pod所在的命名空间。
  • containerName (字符串, 可选): pod内的特定容器名称。如果省略:
    • 如果pod有一个容器,则获取该容器的日志。
    • 如果pod有多个容器,则获取所有容器的日志并将其连接起来。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getPodsLogs",
"params": {
"arguments": {
"Name": "my-app-pod-12345",
"namespace": "production",
"containerName": "main-container"
}
}
}

6. getNodeMetrics

检索特定节点的资源使用情况指标。

参数:

  • Name (字符串, 必需): 节点的名称。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getNodeMetrics",
"params": {
"arguments": {
"Name": "worker-node-1"
}
}
}#### 7. getPodMetrics

检索特定 Pod 的 CPU 和内存指标。

参数:

  • namespace (字符串, 必需): Pod 所在的命名空间。
  • podName (字符串, 必需): Pod 的名称。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getPodMetrics",
"params": {
"arguments": {
"namespace": "default",
"podName": "my-app-pod-67890"
}
}
}

8. getEvents

检索特定命名空间或资源的事件。

参数:

  • namespace (字符串, 可选): 获取事件的命名空间。如果省略,则考虑所有命名空间中的事件(受 RBAC 限制)。
  • resourceName (字符串, 可选): 特定资源的名称(例如,Pod 名称),用于过滤事件。
  • resourceKind (字符串, 可选): 如果提供了 resourceName,则为特定资源的类型(例如,“Pod”)。

示例(命名空间事件):
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getEvents",
"params": {
"arguments": {
"namespace": "default"
}
}
}

示例(资源事件):
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "getEvents",
"params": {
"arguments": {
"namespace": "production",
"resourceName": "my-app-pod-12345",
"resourceKind": "Pod"
}
}
}

9. createOrUpdateResource

从 YAML 或 JSON 清单创建新资源或更新现有资源。

参数:

  • manifest (字符串, 必需): 资源的 YAML 或 JSON 清单。
  • namespace (字符串, 可选): 创建/更新资源的命名空间。如果清单中包含命名空间,可以使用此参数覆盖它。如果没有提供且清单未指定命名空间,则可能假设为“default”,或者根据资源类型可能会报错。

示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "createOrUpdateResource",
"params": {
"arguments": {
"namespace": "default",
"manifest": "apiVersion: v1\nkind: Pod\nmetadata:\n name: my-new-pod\nspec:\n containers:\n - name: nginx\n image: nginx:latest"
}
}
}

开发

项目结构

.
├── .github/workflows/ # GitHub Actions 工作流
│ └── docker-build-push.yml
├── handlers/ # 工具处理程序和工具定义
│ └── handlers.go
├── pkg/ # 内部包
│ └── k8s/ # Kubernetes 客户端实现
├── tools/ # MCP 工具定义
│ └── tools.go
├── main.go # 服务器入口点
├── go.mod # Go 模块定义
├── go.sum # Go 模块校验和
├── Dockerfile # Docker 构建定义
└── docker-compose.yml # Docker Compose 定义(示例)

添加新工具

  1. 定义工具: 在 tools/tools.go 中,定义一个返回 mcp.Tool 结构的函数。这包括工具的名称、描述和输入/输出模式。
  2. 实现处理程序: 在 handlers/handlers.go 中,创建一个处理程序函数。该函数接受 *k8s.Client 作为参数,并返回一个具有签名 func(context.Context, mcp.ToolInput) (mcp.ToolOutput, error) 的函数。这个内部函数将包含你的工具逻辑。
  3. 注册工具: 在 main.go 中,使用 s.AddTool(tools.YourToolDefinitionFunction(), handlers.YourToolHandlerFunction(client)) 将你的新工具添加到 MCP 服务器实例中。

贡献

欢迎贡献!请参阅 CONTRIBUTING.md 了解如何为该项目做出贡献的详细信息。

许可证

gholizade.net@gmail.com

本项目采用 MIT 许可证 - 详情请参见 LICENSE 文件。

相关 MCP 服务