当前位置: 首页 > news >正文

将 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 的集成,希望这篇文章有所帮助。

http://www.jsqmd.com/news/1169409/

相关文章:

  • 基于STM32与欧姆龙继电器的直流负载管理系统设计
  • 数据脱敏的智能化:用LLM识别敏感字段并自动生成脱敏规则
  • Nuke Studio 16.1v1 安装激活全指南:RLM授权与Intel CPU兼容性配置
  • 工程图纸无损翻译系统的技术挑战与架构实践
  • 从 Python 到 Rust 的 AI 基础设施迁移路线图:分阶段改造策略与风险评估
  • 台风是个太极图?
  • 国家中小学智慧教育平台电子课本解析工具:三步获取PDF教材的智能解决方案
  • Keifu 0.3.0 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • Loop Engineer:四种AI编程循环模式详解与实战指南
  • 软件设计模式实战:5种高频模式(策略/观察者/装饰器等)代码对比与适用场景
  • 基于组态串口屏,优化快检设备多主控适配与开发效率
  • 智能合约 AI 审计实战复盘:一个 DeFi 项目的完整安全扫描流程与发现
  • ArcGIS Pro 3.2 多元聚类工具实战:4属性面数据KMeans分类与专题图制作
  • 全链路加密的数据存储方案:TDE、SSL与传输中加密的工程落地
  • 炉石传说HsMod插件:55项功能完整指南与安装教程
  • TAS5414C-Q1与STM32L041C6芯片对比:汽车音频与物联网应用
  • FastAPI python web开发- 参数校验(PathQueryField)
  • 为什么用 PHP 写 AI Agent 而不是 Python
  • 微服务架构:把巨无霸拆成小餐馆
  • COBIT 2019 与 ISO/IEC 38500:2014 对比:5个核心差异点与适用场景选择
  • VSCode TypeScript 调试配置:5步实现源码映射与断点调试
  • Unity Text组件颜色系统深度解析:从顶点色到富文本的性能优化实战
  • 数据库注入攻击的AI防御:用深度学习检测SQL注入的变种与绕过
  • 招聘时间可视化神器:3分钟掌握Boss Show Time,求职效率飙升300%
  • TLA2518与GD32VF103的ADC接口设计与精度优化
  • Java面试中容易忽略的细节:异常处理与日志规范实战经验
  • 终极指南:如何用一键重置工具快速修复Windows更新问题
  • 他不怎么懂技术,但依然是一个合格的管理者
  • STM32驱动压电扬声器方案与优化策略
  • Hermes Agent Windows一键整合包部署指南