AIOps系列 | 开发 K8s GPT 故障诊断工具

我们使用一个 map[string][]string 来保存 pod 的事件和日志信息,然后通过 client-go 获取 warning 级别的事件,最后过滤需要的 pod 事件以及 pod 相关信息,然后继续通过 client-go 获取对应 pod 的日志,然后把这些信息放到 map 中。

前面我们介绍了 《开发 K8s Chat 命令行工具》,实现了通过和 Kubernetes 进行交互的方式进行运维,虽然文章中所描述的功能比较简单,但是可以以此进行扩展,丰富功能。

那本章,我们将在 《开发 K8s Chat 命令行工具》的基础之上,增加 Kubernetes 故障诊断工具,其主要功能点是:

  • 获取集群的 event 时间,特别关注 warning 级别事件
  • 然后进入对应的 pod 获取日志
  • 大模型结合事件和日志进行分析,得出解决问题的建议

当然,这里也只是起到一个抛砖引玉的作用,提供简单的思路,可以自行扩展。

开发过程

(1)首先使用 cobra-cli 新增一个 analyze 命令

cobra-cli add analyze

    (2)然后在 analyze 下面添加一个子命令 event,专门用于分析事件

    复制

    cobra-cli add event -p 'analyzeCmd'

      (3)设计一个方法 getPodEventsAndLogs 用于获取 K8s 的事件和日志

      复制

      // int64Ptr 辅助函数,用于创建 int64 指针
      func int64Ptr(i int64) *int64 {
       return &i
      }
      
      func getPodEventsAndLogs() (map[string][]string, error) {
       // 创建 Kubernetes 客户端
       clientGo, err := utils.NewClientGo(kubeconfig)
       if err != nil {
        return nil, fmt.Errorf("创建 Kubernetes 客户端失败: %v", err)
       }
      
       // 存储每个 Pod 的事件和日志信息
       result := make(map[string][]string)
       processedPods := make(map[string]bool) // 避免重复处理同一个 Pod
      
       // 获取 Warning 级别的事件
       events, err := clientGo.Clientset.CoreV1().Events("").List(context.TODO(), metav1.ListOptions{
        FieldSelector: "type=Warning",
       })
       if err != nil {
        return nil, fmt.Errorf("获取事件失败: %v", err)
       }
      
       for _, event := range events.Items {
        // 只处理 Pod 相关的事件
        if event.InvolvedObject.Kind != "Pod" {
         continue
        }
      
        podName := event.InvolvedObject.Name
        namespace := event.InvolvedObject.Namespace
        message := event.Message
        podKey := fmt.Sprintf("%s/%s", namespace, podName)
      
        // 避免重复处理同一个 Pod
        if processedPods[podKey] {
         // 如果已经处理过这个 Pod,只添加新的事件信息
         result[podKey] = append(result[podKey], fmt.Sprintf("Additional Event: %s", message))
         continue
        }
      
        // 标记为已处理
        processedPods[podKey] = true
      
        // 获取 Pod 日志(添加限制和更好的错误处
      评论
      成就一亿技术人!
      拼手气红包6.0元
      还能输入1000个字符
       
      红包 添加红包
      表情包 插入表情
       条评论被折叠 查看
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值