我正在使用client-go从kubernetes pods中连续拉取日志流。大多数情况下,一切都能按预期工作,直到任务运行几个小时。
以下是代码:
podLogOpts := corev1.PodLogOptions{ Follow: true, }
kubeJob, err := l.k8sclient.GetKubeJob(l.job.GetNamespace(), l.job.GetJobId())
...
podName := l.k8sclient.GetKubeJobPodNameByJobId(l.job.GetNamespace(), l.job.GetJobId())
req := l.k8sclient.GetKubeClient().CoreV1().Pods(l.job.GetNamespace()).GetLogs(podName, &podLogOpts)
podLogStream, err := req.Stream(context.TODO())
...
for {
copied, err := podLogStream.Read(buf)
if err == io.EOF {
// here is place where error happens
// usually after many hours, the podLogStream return EOF.
// I checked the pod status it is still running and keeps printing data to pod stdout. why would this happend???
break
}
...
}
podLogStream会在3-4个小时后返回EOF。但是我检查了Pod的状态,发现Pod仍在运行,并且服务内部继续向stdout打印数据。那为什么会发生这种情况?如何解决?
更新 我发现每4个小时,pod stream api -- read -- 就会返回EOF,所以我必须让goroutine睡眠一秒钟并重试,通过重新创建pogLogStream对象并从新流对象中读取日志来实现。它起作用了。但是为什么会发生这种情况?
podId
。然后启动goroutines的函数可以在从通道接收到podId时重新启动它。 - TheQuestioner