先解决"敢不敢给权限"
把集群交给 Agent 之前,真正的阻力不是能力而是权限边界。顺序应当是:先把凭证收缩到只读,验证它能看什么、不能看什么,再谈诊断提示词怎么写。
安全第一:K8s MCP 的权限沙箱隔离
将生产集群的操作权限交给 AI 时,最大的担忧是误删核心资源(例如 kubectl delete ns prod)。
因此,搭建 K8s MCP Server 的第一原则是:严格使用只读 ServiceAccount。通过 RBAC 规则限制只开放 get、list、watch 动词,严禁授予任何 create、update、delete 权限。
在此前提下,Agent 能够发挥巨大的故障分析价值:当集群中有 Pod 处于异常状态时,Agent 能同时获取 Pod 详情、Events 事件流以及前一个容器的崩溃日志,交叉对比后给出最可能的原因(如 OOMKilled 或配置挂载丢失),大幅压降 MTTR(平均恢复时间)。
1. 建一个专用只读身份
不要用你自己的 kubeconfig。单独建命名空间与服务账号,便于审计与回收:
kubectl create namespace mcp
kubectl create serviceaccount mcp-readonly -n mcp
再用 ClusterRole 明确动词白名单(以官方文档为准):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: mcp-readonly
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "services", "events"]
verbs: ["get", "list", "watch"]
apps 组单列一条同动词规则;要读 ConfigMap 再加,不要顺手给 *。最后用 ClusterRoleBinding 把角色绑到 mcp/mcp-readonly,漏掉这一步所有请求都会 Forbidden。
2. 签发短期令牌并接进 MCP
kubectl create token mcp-readonly -n mcp --duration=240m
有效期上限受集群配置约束。
令牌填进一份独立 kubeconfig,server 指向集群 API 地址,这份文件只交给 MCP Server 读取,不要提交进配置仓库。
3. 权限验证:证明它删不掉东西
这是安全底座,接入 Agent 前必须完成:
kubectl auth can-i list pods --as=system:serviceaccount:mcp:mcp-readonly
kubectl auth can-i delete ns prod --as=system:serviceaccount:mcp:mcp-readonly
前者返回 yes、后者返回 no,边界才算生效。Secrets 不在白名单里,否则"只读"也能把凭证读走。
4. 巡检提示词的固定顺序
无结构的提问只会得到无结构的回答。把下面的顺序写进系统提示或团队规则:
- 列出非 Running/Succeeded 的 Pod,按命名空间归集;
- 对可疑 Pod 取 Events 与
logs --previous,区分启动失败与运行中崩溃; - 看资源:是否 OOMKilled,是否 Pending 且提示调度失败;
- 看节点:
MemoryPressure、DiskPressure等状态条件; - 输出时区分"已证实"与"待验证",附只读验证命令。
时间线对齐靠 kubectl get events --sort-by=.lastTimestamp,能去掉大部分误判。
怎么确认这一步真的成功了
- 客户端"列出 Pod"的结果与
kubectl get pods -A一致; - 让 Agent 尝试删除动作,它应当被工具层拒绝,而不是在提示词层"自觉不做";
- 拔掉只读 kubeconfig 再问一次,应当报鉴权错误;仍返回数据说明它读到了别的凭证。
常见故障速查
| 现象 | 原因 | 处理 |
|---|---|---|
| 全部请求 Forbidden | 漏建 ClusterRoleBinding | 用 auth can-i --as 复核 |
| 只看得到默认命名空间 | kubeconfig 固定了 namespace | 显式指定或按命名空间授权 |
| CRD 资源列不出来 | 规则未覆盖对应 apiGroup | 补 apiGroups 与 resources |
| 日志拿不到 | 容器从未启动,无 previous 日志 | 改看 Events 与镜像、挂载配置 |
小结
能否长期使用,看三件事:动词白名单能被 kubectl auth can-i 证明、写操作有人工审批通道、结论带可复核的只读命令。三条齐备,MCP 才从演示变成值班助手;缺一条就先限制在预发集群。