我们使用一个 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 日志(添加限制和更好的错误处

最低0.47元/天 解锁文章
1406

被折叠的 条评论
为什么被折叠?



