ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

告别kubectl?我用自然语言把K8s集群“问”明白了

告别kubectl?我用自然语言把K8s集群“问”明白了 一、背景与目标我的环境是一个3台服务器组成的自建K8s集群1 master 2 node操作系统为 Rocky Linux 9。随着集群规模扩大日常运维中需要频繁执行kubectl命令查询资源状态。能否通过自然语言交互来完成这些操作kubernetes-mcp-server提供了这样的能力——它将 Kubernetes 运维能力通过 MCP 协议暴露给 AI 客户端让 AI 可以直接查询集群状态。二、部署架构与资源规划本次部署遵循最小权限原则和最低资源占用原则组件配置命名空间mcpServiceAccountmcp-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# 创建专用的 ServiceAccountkubectl create serviceaccount mcp-viewer-nmcp# 授予集群只读权限绑定内置 view 角色kubectl create clusterrolebinding mcp-viewer-crb\--clusterroleview\--serviceaccountmcp:mcp-viewer3.2 应用部署catEOF|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 EOF3.3 验证部署状态# 查看 Pod 状态kubectl get pods-nmcp# 查看日志kubectl logs-nmcp-lappkubernetes-mcp-server# 预期输出正常启动日志无报错四、配置 Ingress 对外暴露服务为了让 Cherry Studio 能够从集群外访问需要配置 Ingress 并启用 TLSapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:mcp-servernamespace:mcpannotations:cert-manager.io/cluster-issuer:letsencrypt-prodnginx.ingress.kubernetes.io/rewrite-target:/nginx.ingress.kubernetes.io/proxy-read-timeout:3600nginx.ingress.kubernetes.io/proxy-send-timeout:3600spec:ingressClassName:nginxtls:-hosts:-mcp-preview.example.comsecretName:mcp-server-tlsrules:-host:mcp-preview.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:kubernetes-mcp-serverport: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 正确的测试方式第一步发起初始化请求POSTcurl-XPOSThttps://mcp-preview.example.com/mcp\-HContent-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后后续请求需携带该 Headercurl-N-HAccept: text/event-stream\-HMcp-Session-Id: QPBAAFTBHI3X24Z35LJ47LUQF4\https://mcp-preview.example.com/mcp六、对接 Cherry Studio在 Cherry Studio 中配置 MCP 连接配置项值名称kubernetes-mcp-server传输类型Streamable HTTPURLhttps://mcp-preview.example.com/mcp配置完成后Cherry Studio 会自动完成 JSON-RPC 握手并加载工具列表包括namespaces_listpods_listnodes_listevents_listresources_get等常用运维工具现在你可以在 Cherry Studio 中通过自然语言查询集群状态例如“列出所有命名空间”“查看 default 命名空间下的 Pod”“集群中有多少节点”七、资源消耗与监控部署后实际资源占用指标值镜像大小65MB内存实际占用~20-30MiCPU 实际占用 5mPod 启动时间~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 参考链接containers/kubernetes-mcp-server GitHubMCP 协议规范Cherry Studio 官方文档
返回列表