go - 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"}
解决方案
推荐阅读
- html - 如何从 Rails 中的 API 调用结果中选择数据?
- sql-server - SQL Server:按分组列求和并按另一列排序
- r - “证书链是由不受信任的机构颁发的” - 使用 RVest 时出错
- javascript - 无限平铺网页
- r - 当矩阵包含许多小条目时,base::chol() 会变慢
- python - Tkinter 部分点击通过?(仅限 Windows)
- css - 悬停时两个不同元素的转换延迟反转
- python - 将千位逗号分隔符添加到 Relplot
- python - 使用 Python 中的带阻滤波器滤除频率范围,并使用傅里叶变换 FFT 确认
- android - 无法使用 Fastlane 上传 aab/apk 来玩商店