一、背景与目标

我的环境是一个3台服务器组成的自建K8s集群(1 master + 2 node),操作系统为 Rocky Linux 9。随着集群规模扩大,日常运维中需要频繁执行 kubectl 命令查询资源状态。能否通过自然语言交互来完成这些操作?kubernetes-mcp-server 提供了这样的能力——它将 Kubernetes 运维能力通过 MCP 协议暴露给 AI 客户端,让 AI 可以直接查询集群状态。


二、部署架构与资源规划

本次部署遵循最小权限原则最低资源占用原则:

组件 配置
命名空间 mcp
ServiceAccount mcp-viewer(仅授予 view 权限)
CPU 请求/限制 10m / 50m
内存请求/限制 32Mi / 64Mi
镜像 ghcr.io/containers/kubernetes-mcp-server:latest
访问方式 Ingress (域名: mcp-preview.example.com)

三、部署步骤

3.1 创建命名空间与只读 ServiceAccount
# 创建命名空间
kubectl create namespace mcp

# 创建专用的 ServiceAccount
kubectl create serviceaccount mcp-viewer -n mcp

# 授予集群只读权限(绑定内置 view 角色)
kubectl create clusterrolebinding mcp-viewer-crb \
    --clusterrole=view \
    --serviceaccount=mcp:mcp-viewer
3.2 应用部署
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubernetes-mcp-server
  namespace: mcp
  labels:
    app: kubernetes-mcp-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubernetes-mcp-server
  template:
    metadata:
      labels:
        app: kubernetes-mcp-server
    spec:
      serviceAccountName: mcp-viewer
      containers:
      - name: mcp-server
        image: ghcr.io/containers/kubernetes-mcp-server:latest
        # 不传任何 args,使用镜像默认 CMD
        resources:
          requests:
            cpu: 10m
            memory: 32Mi
          limits:
            cpu: 50m
            memory: 64Mi
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-mcp-server
  namespace: mcp
spec:
  selector:
    app: kubernetes-mcp-server
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: ClusterIP
EOF
3.3 验证部署状态
# 查看 Pod 状态
kubectl get pods -n mcp

# 查看日志
kubectl logs -n mcp -l app=kubernetes-mcp-server

# 预期输出:正常启动日志,无报错

四、配置 Ingress 对外暴露服务

为了让 Cherry Studio 能够从集群外访问,需要配置 Ingress 并启用 TLS:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mcp-server
  namespace: mcp
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - mcp-preview.example.com
    secretName: mcp-server-tls
  rules:
  - host: mcp-preview.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-mcp-server
            port:
              number: 8080

五、协议调试与验证

5.1 发现的问题

初次访问时遇到了 400 Bad Request: GET requires an Mcp-Session-Id header 错误。经分析,kubernetes-mcp-server 遵循 Streamable HTTP 协议,需要先通过 POST 请求建立会话,再使用 Mcp-Session-Id 进行后续通信。

5.2 正确的测试方式

第一步:发起初始化请求(POST)

curl -X POST "https://mcp-preview.example.com/mcp" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "initialize",
    "params": {
      "protocolVersion": "0.1.0",
      "clientInfo": { "name": "test-client", "version": "1.0" }
    },
    "id": 1
  }' \
  -v

成功响应

HTTP/2 200
mcp-session-id: QPBAAFTBHI3X24Z35LJ47LUQF4

event: message
data: {"jsonrpc":"2.0","id":1,"result":{"capabilities":{...}}}

第二步:使用 Session ID 进行通信
拿到 Mcp-Session-Id 后,后续请求需携带该 Header:

curl -N -H "Accept: text/event-stream" \
  -H "Mcp-Session-Id: QPBAAFTBHI3X24Z35LJ47LUQF4" \
  "https://mcp-preview.example.com/mcp"

六、对接 Cherry Studio

在 Cherry Studio 中配置 MCP 连接:

配置项
名称 kubernetes-mcp-server
传输类型 Streamable HTTP
URL https://mcp-preview.example.com/mcp

配置完成后,Cherry Studio 会自动完成 JSON-RPC 握手,并加载工具列表,包括:

  • namespaces_list
  • pods_list
  • nodes_list
  • events_list
  • resources_get
  • 等常用运维工具

现在,你可以在 Cherry Studio 中通过自然语言查询集群状态,例如:

  • “列出所有命名空间”
  • “查看 default 命名空间下的 Pod”
  • “集群中有多少节点?”
    在这里插入图片描述
    在这里插入图片描述

七、资源消耗与监控

部署后实际资源占用:

指标
镜像大小 65MB
内存实际占用 ~20-30Mi
CPU 实际占用 < 5m
Pod 启动时间 ~3s

整个服务对集群资源几乎无影响。


八、总结与展望

通过本次实践,我们完成了:

  1. ✅ 在自建 K8s 集群上部署 kubernetes-mcp-server
  2. ✅ 使用最小权限的 ServiceAccount 保障安全
  3. ✅ 通过 Ingress + TLS 对外暴露服务
  4. ✅ 在 Cherry Studio 中成功对接并使用

关键收获

  • MCP 协议(尤其是 Streamable HTTP 模式)的握手流程比想象中复杂,但客户端(如 Cherry Studio)会帮我们处理好这些细节。
  • 镜像拉取是部署中最耗时的环节(ghcr.io 在国内访问约需 2-3 分钟),建议提前在节点上 crictl pull 预热。
  • 只读权限 + 只读模式(--read-only)双重保障,适合生产环境。

后续计划

  • 探索更多的 MCP Server(如 Grafana MCP、Prometheus MCP)
  • 在 Cherry Studio 中构建更复杂的运维 Playbook

📎 参考链接


Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐