我正在使用客户-去连续地从库伯内特斯荚拉原木流。大多数情况下,所有的事情都按预期的方式工作,直到工作运行几个小时。
守则如下:
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
}
...
}大约3-4小时后,podLogStream返回EOF。但我检查了吊舱状态,发现吊舱仍在运行,内部的服务一直在将数据打印到标准输出。为什么会发生这种事?怎么修呢?
更新我发现,每隔4小时,荚流api --读--就会返回EOF,所以我必须让goroutine睡一觉,然后再试一次,方法是重新创建pogLogStream并从新的流对象中读取日志。它起作用了。但为什么会发生这种事?
发布于 2021-08-05 21:01:07
当您联系日志端点时,发生的情况是apiserver将您的请求转发到kubelet,而kubelet是您的荚的宿主。然后,Kubelet服务器启动日志文件到山顶去的流内容,然后再发送到您的客户端。因为它是来自文件和不是直接从标准站出来的流日志,所以可能会发生日志文件被旋转的容器日志管理器,因此您收到EOF并需要重新初始化流。
https://stackoverflow.com/questions/68608106
复制相似问题