ARTICLE DETAIL

资讯详情

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

Kubernetes运维新高度:MCP-K8s实践,构建大模型驱动的管理能力!

Kubernetes运维新高度:MCP-K8s实践,构建大模型驱动的管理能力! 1. 当 K8s 运维遇上大模型为什么需要 MCP-K8sKubernetes 运维的日常很大一部分时间花在“查”上查节点状态、查 Pod 列表、查某个 Deployment 的副本数、查 CRD 有哪些实例。这些动作本身不复杂但重复、琐碎而且每次都要切终端、敲 kubectl、记参数。如果能让大模型直接“看懂”集群用自然语言问一句“我的集群有几个节点”它自己调用工具去查再把结果整理成人话返回运维效率会完全不一样。MCP-K8s 就是干这件事的。MCP 全称 Model Control Protocol是一套让大模型和外部工具对话的协议。MCP-K8s 是一个基于 MCP 的 Kubernetes 服务器它把 kubectl 的能力封装成一组标准工具暴露给大模型调用。大模型不需要你写死脚本它自己决定调list_resources还是get_resource参数也自己填。你只需要用中文提问。它适合谁三类人最直接受益一是日常要管多个集群的 SRE二是想把运维能力接进 AI Agent 的开发者三是正在做内部运维平台、想让平台“会说话”的团队。MCP-K8s 支持 stdio 和 SSE 两种通信模式前者适合本地 IDE 或桌面客户端后者适合部署成远程服务给多个客户端共用。工具层面覆盖了资源类型查询、资源详情获取、列表、创建、更新、删除其中写操作默认关闭需要显式开启这个设计对生产环境很友好。但这里有个现实问题大模型要调用工具得先有一个稳定的模型通道。你不可能在每个客户端里硬编码一堆不同厂商的 Key也不希望运维脚本里散落着各种 API 地址。所以这篇会从统一 Key/API 通道出发把 TaoToken 作为模型接入层再往上搭 MCP-K8s最后跑通一次真实的 kubectl 查询验证。整条链路是大模型通过 TaoToken 统一接入→ MCP 客户端 → MCP-K8s 服务器 → Kubernetes 集群。2. 前置准备TaoToken 统一通道与 MCP-K8s 二进制先说 TaoToken 这一层。它的定位是统一 Key/API 通道你只需要在 TaoToken 拿一个 Key配一个 API Base就能在多个客户端、多个模型之间切换不用为每个模型单独维护一套凭证。对 MCP-K8s 这种要反复调模型的场景来说统一通道能省掉大量配置漂移的麻烦。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。API Base 是 https://taotoken.net/api 注意这个地址不带 UTM 参数配置里直接写它。你需要做的第一件事是拿到 API Key。进入控制台创建控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite创建完 Key 之后建议先到模型对话页面确认通道可用模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite在对话页面里随便问一句能正常返回就说明 Key 和通道没问题。这一步别跳过后面 MCP 客户端调不通时你能快速判断是模型通道的问题还是 MCP 配置的问题。然后是 MCP-K8s 本体。它是一个 Go 写的二进制从 release 页面下载对应平台的版本即可。Mac ARM 机器下mcp-k8s_darwin_arm64Linux x86 下mcp-k8s_linux_amd64。下载后给执行权限chmod x mcp-k8s_darwin_arm64确认它能跑./mcp-k8s_darwin_arm64 -h如果能看到-kubeconfig、-transport、-enable-list这些参数说明二进制就没问题。kubeconfig 用你本地~/.kube/config就行MCP-K8s 会用它连集群。这里有个安全提醒kubeconfig 里通常带着集群管理员权限所以 MCP-K8s 的写操作默认全关只开 list。生产环境务必保持这个默认需要写操作时再单独评估。3. 可复制配置config.toml 与 settings.json 骨架这一节给两份可直接抄的配置。第一份是 MCP-K8s 以 SSE 模式运行的启动配置第二份是 MCP 客户端侧的 settings.json。先看服务端。SSE 模式适合把 MCP-K8s 跑成一个常驻服务多个客户端通过 HTTP 连它。启动命令如下./mcp-k8s_darwin_arm64 \ -kubeconfig/Users/yourname/.kube/config \ -transportsse \ -hostlocalhost \ -port9999 \ -enable-list参数含义对照表参数作用默认值建议-kubeconfig集群凭证路径默认配置显式指定避免歧义-transport通信模式stdio远程服务用 sse-hostSSE 监听主机localhost只监听本地别开 0.0.0.0-portSSE 端口8080自定义避免冲突-enable-list开启列表查询true保持开启-enable-create开启创建false生产保持关闭-enable-update开启更新false生产保持关闭-enable-delete开启删除false生产保持关闭启动成功后你会看到类似输出Registering basic tools... Starting Kubernetes MCP Server with sse transport on localhost:9999 Create operations: false Update operations: false Delete operations: false List operations: true Server started, waiting for MCP client connections...看到List operations: true和waiting for MCP client connections就说明服务端就绪了。如果你更习惯 stdio 模式配置长这样适合本地 IDE 直接拉起进程{ mcpServers: { mcp-k8s: { command: /path/to/mcp-k8s, args: [ -kubeconfig, /path/to/kubeconfig, -enable-list ] } } }SSE 模式下客户端侧的 settings.json 骨架{ mcpServers: { mcp-k8s: { url: http://localhost:9999/sse, args: [] } } }注意 SSE 模式用的是url字段stdio 模式用的是commandargs两者别混。很多接入失败就是这里写错了字段。再补一份模型侧的 config.toml用于 Python 客户端读取 TaoToken 通道。这里用环境变量注入更安全但为了演示完整给一份显式配置[llm] provider openai-compatible base_url https://taotoken.net/api api_key sk-your-taotoken-key model deepseek-chat timeout 60 [mcp] server_url http://localhost:9999/ssebase_url指向 TaoToken 的 API 地址api_key换成你在控制台创建的那把。模型名按你实际可用的填这里用deepseek-chat举例。config.toml 的好处是把模型通道和 MCP 地址集中管理客户端代码只读配置不硬编码。4. 验证请求一次 kubectl 查询的完整链路配置齐了现在跑一次真实查询。目标是问大模型“我的 K8s 集群有几个节点”让它自己调 MCP-K8s 的list_resources工具去查。先装依赖。建一个虚拟环境requirements 如下langchain-mcp-adapters0.1.0 langgraph0.1.0 langchain-openai0.1.0 httpx0.27.0 python-dotenv1.0.0安装python3 -m venv MCP_Demo source MCP_Demo/bin/activate pip install -r requirements.txt客户端代码核心逻辑是通过 SSE 连上 MCP-K8s加载工具把工具交给 Agent然后提问。关键片段import asyncio from mcp import ClientSession from mcp.client.sse import sse_client from langchain_mcp_adapters.tools import load_mcp_tools from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI model ChatOpenAI( modeldeepseek-chat, base_urlhttps://taotoken.net/api, api_keysk-your-taotoken-key, ) QUESTIONS [ 我的 K8s 集群有几个节点, 我的集群里有哪些 Pods, ] async def run_agent(): server_url http://localhost:9999/sse async with sse_client(urlserver_url) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tools await load_mcp_tools(session) agent create_react_agent(model, tools) for question in QUESTIONS: result await agent.ainvoke({messages: question}) print(result) if __name__ __main__: asyncio.run(run_agent())运行export OPENAI_API_BASEhttps://taotoken.net/api export OPENAI_API_KEYsk-your-taotoken-key python client.py预期输出里能看到 Agent 的思考过程它先识别问题决定调用list_resources参数填{kind: Node}拿到结果后整理成自然语言。类似这样Question: 我的 K8s 集群有几个节点 Tool Call: list_resources Input: {kind: Node} Final Answer: 您的 Kubernetes 集群当前有 1 个节点节点名称为 docker-desktop。第二个问题问 PodsAgent 会调list_resources并传{kind: Pod}返回 coredns、etcd、kube-apiserver、kube-proxy 等系统 Pod 的列表并整理出命名空间、状态、IP。到这里整条链路就通了自然语言 → 大模型 → TaoToken 通道 → MCP 客户端 → MCP-K8s → Kubernetes API。如果你想在浏览器里直接验证模型通道是否正常可以打开模型对话页面再问一遍同样的问题对比两边结果是否一致。模型对话入口https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。5. 本篇常见错排查接入过程中最容易卡住的几个点我按出现频率排一下。第一个是 SSE 连不上。报错通常是Connection refused或SSE error。先确认 MCP-K8s 进程还在跑curl http://localhost:9999/sse看有没有响应。如果进程挂了多半是 kubeconfig 路径写错或者集群本身连不上。用kubectl get nodes先确认本地 kubectl 能通再启动 MCP-K8s。第二个是工具加载为空。load_mcp_tools返回空列表说明 MCP 握手成功但没注册工具。检查启动参数里-enable-list是否为 true以及-transport是否和客户端连接方式匹配。stdio 客户端连 SSE 服务端或者反过来都会导致工具列表为空。第三个是模型调用报 401 或 403。这是 TaoToken 的 Key 问题。确认api_key没有多余空格确认base_url是https://taotoken.net/api而不是带 UTM 的官网地址。UTM 参数只用于官网跳转统计API 调用不要带。如果还是 401去 API Keys 页面重新生成一把https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。第四个是 Agent 不调工具直接瞎答。这通常是模型不支持 function calling或者 prompt 没引导好。换一个支持工具调用的模型或者在提问里明确说“请使用工具查询”。另外create_react_agent对模型能力有要求太小的模型可能不稳定。第五个是写操作被拒。你调create_resource报权限错误这是正常的因为默认-enable-create是 false。需要写操作时显式加参数但强烈建议只在测试集群开生产集群保持只读。MCP-K8s 的写操作开关是独立的可以只开 list 和 get不开 create/update/delete。第六个是 kubeconfig 权限过大导致的安全隐患。MCP-K8s 用你的 kubeconfig 连集群等于继承了你的全部权限。如果这个 kubeconfig 是 cluster-admin那 MCP-K8s 理论上也能做管理员操作。建议单独建一个只读的 ServiceAccount生成受限 kubeconfig 给 MCP-K8s 用。这样即使模型被诱导调用写操作也会被 RBAC 拦住。6. 把这条链路用起来从查询到长期编码跑通查询只是起点。MCP-K8s 真正的价值在于把集群操作变成大模型可调用的能力你可以在此基础上做很多事写一个运维 Agent每天早上自动巡检节点状态和 Pod 异常接进内部 IM让同事用自然语言查集群或者做成告警联动收到告警后自动拉取相关资源详情。如果你打算长期跑这类编码和 Agent 任务建议了解一下 Coding Plan它在长会话和工具调用场景下更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入文档在这里遇到配置细节可以对照https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后给一个实用建议把 MCP-K8s 的启动命令写成一个 systemd 服务或 launchd plist开机自启端口固定这样客户端配置就不用改来改去。kubeconfig 用只读账号写操作按需临时开。模型通道用 TaoToken 统一管理换模型只改 config.toml 一行。这套组合跑顺之后你会发现查集群这件事真的可以“动嘴不动手”。
返回列表