将 OCAI 接入 Kubernetes MCP Server 的实践

📅 2026/7/11 20:05:49 👁️ 阅读次数 📝 编程学习
将 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-serverexportGOPROXY=https://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] Description=Kubernetes MCP Server After=network.target [Service] Type=simple User=ec2-user Environment=KUBECONFIG=/home/ec2-user/.kube/config ExecStart=/home/ec2-user/opencloudos/k8s-mcp-server \ --port 8789 --read-only Restart=always [Install] WantedBy=multi-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(servers=0, connected=0, tools=0)

因为我们需要OCAI 通过/app/ocai/utils/config_loader.pybuild_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)tools=14就说明成功了。

docker-composerestartsleep30dockerlogs ocai-service|grep-E"MCP|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 的集成,希望这篇文章有所帮助。