告别kubectl?我用自然语言把K8s集群“问”明白了
·
一、背景与目标
我的环境是一个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_listpods_listnodes_listevents_listresources_get- 等常用运维工具
现在,你可以在 Cherry Studio 中通过自然语言查询集群状态,例如:
- “列出所有命名空间”
- “查看 default 命名空间下的 Pod”
- “集群中有多少节点?”


七、资源消耗与监控
部署后实际资源占用:
| 指标 | 值 |
|---|---|
| 镜像大小 | 65MB |
| 内存实际占用 | ~20-30Mi |
| CPU 实际占用 | < 5m |
| Pod 启动时间 | ~3s |
整个服务对集群资源几乎无影响。
八、总结与展望
通过本次实践,我们完成了:
- ✅ 在自建 K8s 集群上部署
kubernetes-mcp-server - ✅ 使用最小权限的 ServiceAccount 保障安全
- ✅ 通过 Ingress + TLS 对外暴露服务
- ✅ 在 Cherry Studio 中成功对接并使用
关键收获:
- MCP 协议(尤其是 Streamable HTTP 模式)的握手流程比想象中复杂,但客户端(如 Cherry Studio)会帮我们处理好这些细节。
- 镜像拉取是部署中最耗时的环节(
ghcr.io在国内访问约需 2-3 分钟),建议提前在节点上crictl pull预热。 - 只读权限 + 只读模式(
--read-only)双重保障,适合生产环境。
后续计划:
- 探索更多的 MCP Server(如 Grafana MCP、Prometheus MCP)
- 在 Cherry Studio 中构建更复杂的运维 Playbook
📎 参考链接
更多推荐

所有评论(0)