将 OCAI 接入 Kubernetes MCP Server 的实践

📅 2026/7/11 19:54:58
将 OCAI 接入 Kubernetes MCP Server 的实践
在之前的 OCManager 系列文章中我们已经逐步构建了完整的 AI 运维体系第一阶段OCManager 控制台提供基础的运维操作界面命令助手、任务编排第二阶引入 OCAI让 AI 能够咨询——回答运维问题、提供诊断建议第三阶段启用 ops-mate让 AI 能够动手——通过 SSH 到节点执行诊断命令但是我们发现ops-mate 的 SSH 通道只能操作资源无法直接访问 Kubernetes 集群。比如运维人员问“帮我查看 default 命名空间里所有 Pod 的状态”“哪个节点资源使用率最高”“获取 nginx-deployment 最近的事件”AI 只能说请执行 kubectl get pods而不能直接调用 Kubernetes API。本文的目的是在 OCAI 中集成 Kubernetes MCP Server来实现这个需求。OCManager 中的 RAG 与 MCP在 OCManager 架构中实际上已经使用了 RAG 和 MCP。在RAG方面OCManager 在 ops-mate 的 diaglite 组件中内置了一个轻量级 RAG 系统具体的工作流如下用户提问 → 问题向量化 → 检索历史诊断记录 → 增强上下文 → LLM 生成回答RAG 在 OCManager 中是通过diaglite 内置向量检索来实现的作用主要是检索历史诊断信息匹配已知问题的解决方案从而避免重复询问相同信息在MCP方面OCManager 已经预留了MCP配置。我们可以通过 MCP 让 AI 获得直接操作能力。综合目前OCManager 已知的功能实现和应用场景总结如下能力类型在 OCManager 中的实现典型场景RAG 知识diaglite 内置向量检索“历史上类似故障是怎么处理的”MCP 工具Kubernetes MCP Server“帮我查看所有 Pod 的状态”SSH 执行ops-mate 通道“在节点上执行 df -h”Kubernetes MCP Server 集成kubernetes-mcp-server是一个实现了 MCP 协议的服务器它封装了 Kubernetes 的 API 调用暴露为标准化的 MCP 工具。本质上它是kubectl 的 MCP 封装让 AI 能够通过标准协议操作集群而不需要直接在容器内安装 kubectl。由于我们访问EKS集群的时候需要使用awscli生成临时的token因此便捷起见将MCP Server 作为独立进程运行在宿主机由systemd 托管这样就无需在容器中单独再安装awscli。我们通过streamable http的模式启动mcp服务此后OCAI 通过 HTTP SSE 协议远程连接 MCP Server。为什么选择 Streamable HTTP 模式stdio 模式把 MCP Server 作为子进程跑在 OCAI 容器内这意味着每次重启容器都要重新启动 MCP Server还要处理 AWS CLI 安装、AgentContext 序列化等问题。Streamable HTTP 模式则把 MCP Server 独立运行在宿主机OCAI 通过 HTTP SSE 协议远程调用。这样做的好处显而易见MCP Server 和 OCAI 解耦可以独立升级直接复用宿主机的 AWS CLI无需在容器内折腾认证配置也简单只需一个 URL 即可如果有多套 OCAI 环境还能共享同一个 MCP Server。部署和配置首先编译 MCP Server。由于网络限制我们从源码编译而不是下载二进制gitclone--depth1--branchv0.0.63\https://github.com/containers/kubernetes-mcp-server.gitcdkubernetes-mcp-serverexportGOPROXYhttps://goproxy.cn,https://proxy.golang.org,direct go build-ok8s-mcp-server ./cmd/kubernetes-mcp-servermvk8s-mcp-server /home/ec2-user/opencloudos/然后创建 systemd 服务文件/etc/systemd/system/k8s-mcp-server.service让 MCP Server 随系统启动这里--port 8789会启动 SSE (Server-Sent Events) 服务器不是普通 HTTP。启动后用curl http://127.0.0.1:8789/sse测试应该能看到 SSE 事件流。[Unit] DescriptionKubernetes MCP Server Afternetwork.target [Service] Typesimple Userec2-user EnvironmentKUBECONFIG/home/ec2-user/.kube/config ExecStart/home/ec2-user/opencloudos/k8s-mcp-server \ --port 8789 --read-only Restartalways [Install] WantedBymulti-user.target接下来配置 OCAI修改config/mcp.yaml。由于OCAI服务运行在docker容器中因此需要通过172.17.0.1Docker 网桥 IP来访问宿主机。# ocai-service/ocai-service/config/mcp.yamlmcp_servers:kubernetes:url:http://172.17.0.1:8789/sse修改docker-compose.yml只需挂载日志和 MCP 配置文件无需 kubeconfig 或 AWS 凭证volumes:-${LOG_DIR:-./logs}/ocai-service:/app/logs-./config/mcp.yaml:/app/config/mcp.yaml:ro在docker-compose中设置了OCAI_MCP_CONFIG_FILE/app/config/mcp.yaml在启动服务后会发现OCAI 启动时显示MCP: MCPManager(servers0, connected0, tools0)因为我们需要OCAI 通过/app/ocai/utils/config_loader.py的build_application_from_environ()方法从环境变量读取配置但这个函数漏掉了OCAI_MCP_CONFIG_FILE的处理导致配置了环境变量也不会加载 MCP这似乎是一个隐藏的issue因为build_application_from_environ()读取配置是合理的。我们在函数中添加读取OCAI_MCP_CONFIG_FILE的代码# 在 config_loader.py 中找到 mcp_servers: {}, 的下一行添加mcp_config_file_env_str(OCAI_MCP_CONFIG_FILE)ifmcp_config_file:data[application][mcp_config_file]mcp_config_file重启 OCAI查看日志看到MCP server configured: kubernetes (sse)和tools14就说明成功了。docker-composerestartsleep30dockerlogs ocai-service|grep-EMCP|kubernetes# 正常输出应该包含# INFO: MCP config: 0 inline file /app/config/mcp.yaml - 1 total# INFO: MCP server configured: kubernetes (sse)# INFO: MCP client connected: kubernetes (sse)# INFO: MCP tools registered: 14 from 1 servers聊天效果验证集成成功后OCAI 具备以下 13 个 Kubernetes 管理工具。这里我们启动MCP的时候加上了–read-only参数因此所有工具都在只读模式下运行确保不会误操作集群。配置管理 ├── mcp__kubernetes__configuration_view - 查看集群配置 ├── mcp__kubernetes__namespaces_list - 列出命名空间 节点管理 ├── mcp__kubernetes__nodes_log - 查看节点日志 ├── mcp__kubernetes__nodes_stats_summary - 节点统计摘要 ├── mcp__kubernetes__nodes_top - 节点资源使用 Top Pod 管理 ├── mcp__kubernetes__pods_get - 获取 Pod 详情 ├── mcp__kubernetes__pods_list - 列出所有 Pods ├── mcp__kubernetes__pods_list_in_namespace - 按命名空间列出 Pods ├── mcp__kubernetes__pods_log - 查看 Pod 日志 ├── mcp__kubernetes__pods_top - Pod 资源使用 Top 通用资源 ├── mcp__kubernetes__resources_get - 获取任意资源详情 ├── mcp__kubernetes__resources_list - 列出任意资源 ├── mcp__kubernetes__events_list - 列出集群事件我们在OCAI的UI界面尝试询问和集群相关的内容如下可以发现通过工具调用/mcp_kubernetes_pods list等方法给出了我们想要的信息。结语本文实现了 Kubernetes MCP Server 的集成让 OCAI 具备了直接访问 EKS 集群的能力。整个过程涉及理解 MCP 协议和 RAG 的分工采用 Streamable HTTP 模式部署MCP服务配置OCAI集成Kubernetes MCP Server并测试功能如果你也在做 AI Kubernetes 的集成希望这篇文章有所帮助。