Client-go AIOps 实战

2025-11-06T14:11:02+08:00 | 3分钟阅读 | 更新于 2025-11-06T14:11:02+08:00

@

实战目标

在前一篇笔记中,我们了解了 client-go 的基础用法。本篇将结合 AIOps 场景,构建一个能够自动观察 Kubernetes 集群状态、识别异常并执行修复动作的智能运维工具。该工具将展示如何将 client-go 与 LLM 推理、Function Calling 相结合,实现真正的"数据 + 决策 + 执行"闭环。

场景设计

假设我们需要解决以下运维问题:

  1. 集群中经常出现 CrashLoopBackOffImagePullBackOffEvicted 等异常 Pod。
  2. 部分 Pod CPU 或内存使用接近极限,存在 OOM 风险。
  3. 传统告警只能通知问题,修复仍依赖人工介入。

我们希望通过一个 Go 程序,定时扫描集群状态,将异常信息汇总后交给 LLM 进行根因分析,再由程序根据 LLM 建议调用 K8s API 执行修复。

系统架构

+----------------+      +----------------+      +----------------+
|  client-go     |----->|   LLM Agent    |----->|  client-go     |
|  采集集群状态   |      |  根因分析与决策 |      |  执行修复动作   |
+----------------+      +----------------+      +----------------+

整个流程分为三个阶段:

  1. 观测阶段:使用 client-go 拉取 Pod、Node、Event 等数据。
  2. 决策阶段:将数据组织成 Prompt,调用 LLM 获取修复建议。
  3. 执行阶段:解析 LLM 的 Function Calling 输出,调用 client-go 执行修复。

观测阶段:采集集群状态

func listProblematicPods(ctx context.Context, clientset *kubernetes.Clientset) ([]v1.Pod, error) {
    pods, err := clientset.CoreV1().Pods("").List(ctx, metav1.ListOptions{})
    if err != nil {
        return nil, err
    }
    var problems []v1.Pod
    for _, pod := range pods.Items {
        phase := pod.Status.Phase
        for _, cs := range pod.Status.ContainerStatuses {
            if cs.State.Waiting != nil {
                reason := cs.State.Waiting.Reason
                if reason == "CrashLoopBackOff" || reason == "ImagePullBackOff" {
                    problems = append(problems, pod)
                }
            }
        }
        if phase == v1.PodFailed {
            problems = append(problems, pod)
        }
    }
    return problems, nil
}

除了 Pod 状态,还可以采集:

  • Node 资源使用率
  • Deployment 副本与滚动更新状态
  • Events 中的 Warning 事件
  • HPA 状态与指标

决策阶段:构造 Prompt 并调用 LLM

将采集到的数据以结构化方式提供给 LLM:

你是一名资深 Kubernetes SRE。当前集群存在以下异常 Pod:

1. Namespace: prod, Pod: api-gateway-xxx, 状态: CrashLoopBackOff, 重启次数: 12
   最近事件: Back-off restarting failed container api-gateway

请分析可能原因,并决定是否需要重启 Pod 或检查镜像标签。如果需要重启,请输出函数调用:
restart_pod(namespace, pod_name)

LLM 根据上下文输出结构化的 Function Calling 结果,例如:

{
  "name": "restart_pod",
  "arguments": {
    "namespace": "prod",
    "pod_name": "api-gateway-xxx"
  }
}

执行阶段:解析并调用 client-go

func restartPod(ctx context.Context, clientset *kubernetes.Clientset, namespace, name string) error {
    return clientset.CoreV1().Pods(namespace).Delete(ctx, name, metav1.DeleteOptions{})
}

通过 Delete Pod,K8s 控制器会根据 Deployment/ReplicaSet 重新调度新的 Pod,从而完成重启。

进阶:资源画像与自动扩缩容

除了异常修复,client-go 还可以用于采集资源画像,为 AIOps 模型提供训练数据。例如:

指标项采集方式
Pod CPU/内存使用metrics-server 或 Prometheus API
请求 QPSIngress Controller 指标
启动时间Pod 状态时间戳计算
节点负载Node 对象的 status.capacitystatus.allocatable

将这些数据持久化到时序数据库或数据湖,即可用于训练流量预测模型,实现预测性自动扩容。

安全与审计

自动化修复必须考虑安全:

  1. 操作白名单:只允许执行预定义的安全操作,如重启 Pod、扩容副本。
  2. 人工确认:对高风险操作(如删除 StatefulSet、修改网络策略)要求人工审批。
  3. 审计日志:记录每次决策的上下文、LLM 输出和执行结果,便于复盘。
  4. 回滚机制:执行后持续观察,若指标恶化则自动回滚。

总结

client-go 不仅是 K8s 的编程接口,更是 AIOps 系统与集群交互的"手脚"。结合 LLM 的推理能力,我们可以构建从观测、决策到执行的完整智能运维闭环。后续课程将在此基础上,进一步学习如何开发 Kubernetes Operator,将这类能力以声明式方式沉淀到集群中。

About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!