|
研究Aiops有一段时间了,目前手里有不少可落地的方案了,接下来会把这些方案全部整理到我的大模型课程里。 今天的案例是基于dify和K8s的MCP来做一个运维智能体。
一、架构和思路核心理念 1)Dify (大脑):负责理解用户的自然语言指令,进行任务规划,并决定调用哪个工具。2)Kubernetes MCP Server (桥梁):作为一个实现了 MCP (Model Context Protocol) 的标准工具集,它将复杂的 Kubernetes API 调用封装成简单、安全的工具,供 Dify 调用。3)Kubernetes (执行层):接收并执行来自 MCP Server 的指令,管理集群资源。架构图 这玩意目前开源的有不少,我找了一个适合我需求的。地址是:https://github.com/Manusa/kubernetes-mcp-server。它预置了21个实用的 Kubernetes 操作工具,例如:pods_get, nodes_get, deployments, resource_list, pods_log, pods_exec, nodes_top, pods_top等。使用这个现成的 Server,我们无需编写任何后端代码,只需专注于部署和集成。
二、MCP部署与配置步骤 1: 准备 Kubernetes 环境 这里假设已经有了一个可用的 Kubernetes 集群,并且kubectl命令行工具已配置好,可以访问该集群。 步骤 2: 部署 Kubernetes MCP Server思路是:先通过源码编译docker镜像,然后部署到k8s集群里 1、克隆代码 gitclonehttps://github.com/containers/kubernetes-mcp-server.gitcdkubernetes-mcp-server 2、编译容器镜像 dockerbuild-tkubernetes-mcp-server:latest. 3、将镜像导入到所有k8s节点 说明:1. 这是临时方案,最好是将镜像放到你们的私有镜像仓库中; 2. 假设你的k8s环境用的是containerd容器进行时 # 导出镜像docker save kubernetes-mcp-server:latest -o k8s-mcp.tar
# 拷贝到各 nodescp k8s-mcp.tar root@node01:/tmp/
# 在 node 上加载进 containerdctr -n k8s.io images import /tmp/k8s-mcp.tar
# 检查是否导入成功ctr -n k8s.io images ls |grep kubernetes-mcp
4、部署mcp的k8s yaml文件 涉及:ServiceAccount、Role、RoleBinding、Deployment和Service apiVersion:v1kind:Namespacemetadata:name:mcp-tools---apiVersion:v1kind:ServiceAccountmetadata:name:k8s-mcp-server-sanamespace:mcp-tools---#授予最小权限原则(PrincipleofLeastPrivilege)#我们只授予读取、描述和日志查看权限,避免任何破坏性操作apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRole#使用ClusterRole以便跨命名空间查询metadata:name:k8s-mcp-server-rolerules:-apiGroups:[""]resources:["pods","nodes","services","namespaces","events"]verbs:["get","list","watch"]-apiGroups:[""]resources:["pods/log"]verbs:["get"]-apiGroups:[""]resources:["pods/exec"]verbs:["create"]-apiGroups:["apps"]resources:["deployments","replicasets","daemonsets","statefulsets"]verbs:["get","list","watch"]-apiGroups:["extensions"]resources:["deployments","replicasets","daemonsets"]verbs:["get","list","watch"]-apiGroups:["metrics.k8s.io"]resources:["pods","nodes"]verbs:["get","list"]---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:k8s-mcp-server-rolebindingsubjects:-kind:ServiceAccountname:k8s-mcp-server-sanamespace:mcp-toolsroleRef:kind:ClusterRolename:k8s-mcp-server-roleapiGroup:rbac.authorization.k8s.io---apiVersion:apps/v1kind eploymentmetadata:name:kubernetes-mcp-servernamespace:mcp-toolslabels:app:kubernetes-mcp-serverspec:replicas:1selector:matchLabels:app:kubernetes-mcp-servertemplate:metadata:labels:app:kubernetes-mcp-serverspec:serviceAccountName:k8s-mcp-server-sacontainers:-name:server#使用自己编译的镜像image:kubernetes-mcp-server:latestimagePullPolicy:IfNotPresent#该镜像默认使用集群内配置,无需额外参数#如果需要指定kubeconfig,可以添加args和volume#args:["--kubeconfig","/etc/kubeconfig/config"]#volumeMounts:#-name:kubeconfig#mountPath:/etc/kubeconfig#readOnly:true#volumes:#-name:kubeconfig#secret:#secretName:kubeconfig-secret---apiVersion:v1kind:Servicemetadata:name:kubernetes-mcp-servernamespace:mcp-toolsspec:selector:app:kubernetes-mcp-servertype:NodePortports:-name:httpport:8080#Pod内部端口targetPort:8080nodePort:30080 这样可以通过k8s任意一个节点的30080端口访问到k8s的mcp服务端步骤 3: 在 Dify 中配置 MCP 工具 在 Dify 的界面中,进入工具 → MCP,点击 “添加MCP服务”。 在配置中填写: 1)服务端点URL:http://<host>:30080/sse(这里host地址就是你k8s节点的IP地址) 2)名称、服务器标识:k8s_mcp 3)认证,这需要获取前面创建的ServiceAccount用户的Token 先进入mcp的pod里 POD_NAME=$(kubectlgetpods-nmcp-tools-lapp=kubernetes-mcp-server-ojsonpath='{.items[0].metadata.name}')kubectlexec-it$POD_NAME-nmcp-tools--sh进到pod里,再查看token cat/var/run/secrets/kubernetes.io/serviceaccount/token 点击“添加并授权” 可以看到,目前包含21个工具。
三、构建智能体ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">1、在Dify创建Agent应用ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">2、设置提示词你是一个经验丰富的Kubernetes运维专家。你的任务是帮助用户查询和诊断Kubernetes集群的状态。请根据提供给你的工具来选择具体的任务,比如查看命名空间的工具就是namespaces_list,查看节点日志的工具是nodes_log。你完全可以根据工具的名称来推测其用途。请遵循以下工作流程:1.**理解意图**:仔细分析用户的请求,明确他们想做什么。2.**收集参数**:如果用户没有提供必要的参数(如`namespace`,`pod_name`),请主动询问。例如,如果用户说“看看web服务的日志”,你需要问:“请告诉我web服务所在的命名空间和Pod名称?”3.**调用工具**:根据收集到的信息,选择并调用最合适的工具。4.**分析结果**:仔细分析工具返回的原始数据,特别是`Events`部分,它们通常是问题的关键线索。5.**友好总结**:将技术细节和数据分析结果,用清晰、易懂的自然语言总结给用户。如果发现问题,给出可能的排查方向或建议。**重要安全原则**:-你的权限是只读的,只能查询和诊断,**严禁执行任何修改或删除操作**(如`delete`,`edit`,`apply`)。-如果用户提出破坏性请求,请礼貌地拒绝,并解释你的权限限制。 ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">3、添加工具
四、示例说明ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">目前该工具主要是查询/查看为主,等待其更多工具。通过该案例,你至少可以将思路跑通。
|