首页 > 解决方案 > Kubernetes 手表似乎正在丢弃事件

问题描述

我正在开发一个使用 Kubernetes (K8S) 作为测试基础设施的测试系统。我们系统的一般模型是调度系统获取一个 docker 映像并在 K8S 上创建许多作业 - 每个测试一个。每个作业都配置为只运行一个 pod。调度程序使用 watch 来监控所有 Job 和 Pod 事件的 K8S 命名空间。

这主要工作正常 - 事件进入并被处理。但是,我们的监控显示,许多作业在“已完成”状态下停留了很多分钟(15 分钟以上)——就好像该作业/pod 的事件流已丢弃事件一样。这最终导致了各种创可贴——我们现在每 30 秒重新启动一次观察者,另外还有一个轮询循环,用于向 K8S 查询已成功的作业。

我们保留了我们处理的所有事件的综合日志,对于有问题的作业,没有任何事件表明状态已更改 - 但请求作业/pod 信息会显示更新的状态。

作业监视器配置为

timeout := int64(30)
return k.clientset.BatchV1().Jobs(namespace).Watch(context.TODO(), metav1.ListOptions{TimeoutSeconds: &timeout})

和 pod watch 是一样的。围绕这些调用的监控循环看起来像

func monitorAllPods() {
    for {
        watch, err := kube.podWatch()
        check(err)
        for event := range watch.ResultChan() {
            pod, ok := event.Object.(*corev1.Pod)
            if !ok {
                log.Printf("Got event %v, but couldn't convert to pod\n", event)
                continue
            }
            handlePodEvent(event.Type, pod)
        }
    }
}

我错过了一些明显的东西吗?其他人看到这种奇怪吗?

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}

标签: gokubernetes

解决方案


推荐阅读