什么情况导致 Pod 日志 Reader Return EOF
What Condition Causes the Pod Log Reader Return EOF
我正在使用 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 returns EOF 大约在 3-4 小时后。但是我检查了pod的状态,发现pod还是运行,里面的service一直在打印数据到stdout。那为什么会这样呢?如何解决?
更新
我发现 pod 流每 4 小时 api -- 读取 -- 将 return EOF 所以我必须让 goroutine 睡眠并稍后重试,方法是重新创建 pogLogStream 并从新流读取日志目的。有用。但是为什么会这样呢??
当您联系日志端点时,apiserver 将您的请求转发到托管您的 pod 的 kubelet。然后 Kubelet 服务器开始流式传输日志文件的内容 to the apiserver and later to your client. Since it is streaming logs from the file and not from the stdout directly it may happen that log file is rotated by container log manager,因此您收到 EOF 并需要重新初始化流。
我正在使用 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 returns EOF 大约在 3-4 小时后。但是我检查了pod的状态,发现pod还是运行,里面的service一直在打印数据到stdout。那为什么会这样呢?如何解决?
更新 我发现 pod 流每 4 小时 api -- 读取 -- 将 return EOF 所以我必须让 goroutine 睡眠并稍后重试,方法是重新创建 pogLogStream 并从新流读取日志目的。有用。但是为什么会这样呢??
当您联系日志端点时,apiserver 将您的请求转发到托管您的 pod 的 kubelet。然后 Kubelet 服务器开始流式传输日志文件的内容 to the apiserver and later to your client. Since it is streaming logs from the file and not from the stdout directly it may happen that log file is rotated by container log manager,因此您收到 EOF 并需要重新初始化流。