将 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。由于网络限制,我们从源码编译而不是下载二进制:

bash 复制代码
git clone --depth 1 --branch v0.0.63 \
  https://github.com/containers/kubernetes-mcp-server.git
cd kubernetes-mcp-server
export GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct
go build -o k8s-mcp-server ./cmd/kubernetes-mcp-server
mv k8s-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 事件流。

ini 复制代码
[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.1 Docker 网桥 IP来访问宿主机。

yaml 复制代码
# ocai-service/ocai-service/config/mcp.yaml
mcp_servers:
  kubernetes:
    url: "http://172.17.0.1:8789/sse"

修改 docker-compose.yml,只需挂载日志和 MCP 配置文件,无需 kubeconfig 或 AWS 凭证:

yaml 复制代码
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 的代码:

python 复制代码
# 在 config_loader.py 中,找到 "mcp_servers": {}, 的下一行,添加:
mcp_config_file = _env_str("OCAI_MCP_CONFIG_FILE")
if mcp_config_file:
    data["application"]["mcp_config_file"] = mcp_config_file

重启 OCAI,查看日志看到 MCP server configured: kubernetes (sse)tools=14 就说明成功了。

bash 复制代码
docker-compose restart
sleep 30
docker logs 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 的集成,希望这篇文章有所帮助。

相关推荐
aaPIXa6221 小时前
C++采样引导优化SPGO——比PGO更智能的编译器决策新方案
java·c++·人工智能
2601_957190902 小时前
飞行影院安装施工指南:场地、动感系统与影片内容配套
大数据·前端·人工智能
only_Klein2 小时前
k8sgpt集成Prometheus Grafana
gpt·kubernetes·prometheus
ACP广源盛139246256732 小时前
IX9104 PCIe5.0 交换芯片@ACP#国产高端 AI PC 全搭配方案
大数据·人工智能·分布式·单片机·嵌入式硬件
her_heart2 小时前
把 ChatGPT 5.6 放进需求评审和测试设计之后,我反而减少了“一次成稿”的期待
网络·人工智能·网络协议·chatgpt·测试用例
YHHLAI2 小时前
Agent 智能体开发实战 · 第六课:MCP 协议 —— 让 Agent 跨进程调用工具
前端·人工智能
QiLinkOS2 小时前
第三视觉理解徐玉生与他的商业活动(41)
人工智能·dna双螺旋归因模型·专利竞争情报系统·技术专利·新能源汽车行业技术洞察报告
HhzZzzzz_2 小时前
萨科微Slkor2026年7月10日每日芯闻。
人工智能·智能手机·编辑器
初晴融雪-快雪时晴3 小时前
基础知识:2026年7月国内一级市场资金全景分析
人工智能
lld9510273 小时前
我做了一个 AI Agent Skill 云:用 MCP 在 Claude Code、Codex、OpenCode 之间同步技能
数据库·人工智能