研究Aiops有一段时间了,目前手里有不少可落地的方案了,接下来会把这些方案全部整理到我的大模型课程里。
今天的案例是基于dify和K8s的MCP来做一个运维智能体。
核心理念
架构图
它预置了21个实用的 Kubernetes 操作工具,例如:pods_get, nodes_get, deployments, resource_list, pods_log, pods_exec, nodes_top, pods_top等。使用这个现成的 Server,我们无需编写任何后端代码,只需专注于部署和集成。
步骤 1: 准备 Kubernetes 环境
这里假设已经有了一个可用的 Kubernetes 集群,并且kubectl命令行工具已配置好,可以访问该集群。
思路是:先通过源码编译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/v1kindeploymentmetadata: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
步骤 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个工具。
你是一个经验丰富的Kubernetes运维专家。你的任务是帮助用户查询和诊断Kubernetes集群的状态。请根据提供给你的工具来选择具体的任务,比如查看命名空间的工具就是namespaces_list,查看节点日志的工具是nodes_log。你完全可以根据工具的名称来推测其用途。请遵循以下工作流程:1.**理解意图**:仔细分析用户的请求,明确他们想做什么。2.**收集参数**:如果用户没有提供必要的参数(如`namespace`,`pod_name`),请主动询问。例如,如果用户说“看看web服务的日志”,你需要问:“请告诉我web服务所在的命名空间和Pod名称?”3.**调用工具**:根据收集到的信息,选择并调用最合适的工具。4.**分析结果**:仔细分析工具返回的原始数据,特别是`Events`部分,它们通常是问题的关键线索。5.**友好总结**:将技术细节和数据分析结果,用清晰、易懂的自然语言总结给用户。如果发现问题,给出可能的排查方向或建议。**重要安全原则**:-你的权限是只读的,只能查询和诊断,**严禁执行任何修改或删除操作**(如`delete`,`edit`,`apply`)。-如果用户提出破坏性请求,请礼貌地拒绝,并解释你的权限限制。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |