我创建了一个可生成数百万条日志行的pod。

但是kubectl logs -f <pod_name>在某个时刻停止并且输出冻结。

这是我的实验:

kubectl logs --follow=true test-logs-job-13263-t5dbx | tee file1
kubectl logs --follow=true test-logs-job-13263-t5dbx | tee file2
kubectl logs --follow=true test-logs-job-13263-t5dbx | tee file3

一旦我在屏幕上停止接收任何input,上述每个过程都会被中断(Ctrl+C)。

所以:

$ wc -l file*
  106701 file1
  106698 file2
  106698 file3
  320097 total

值得一提的是,这些文件中的每一个都包含不同的日志,即实际执行kubectl logs -f kubectl logs -f命令流的实际日志。

是否有设置限制要传输到上述数字的最大日志数量? (〜10700)

我的群集在GKE上是重要的。

编辑:出于某种原因,这似乎只在GKE上发生;当我在另一个k8s群集(katakoda)上运行相同的实验时,日志被流式传输没有任何问题。

分析解答

Kubernetes本身不提供日志记录,而是使用容器引擎提供的内容。如果你在一个普通的docker installation上运行没有kubernetesdocker的默认configuration是使用 json-file 驱动程序并保持每个容器10 MB的日志。 见https://docs.docker.com/config/containers/logging/json-file/ 如果您需要大量日志,请考虑使用中央日志记录基础结构并配置日志转发。 (docker也支持多个日志记录后端,请参阅https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers

有一个错误报告,日志轮换可以中断kubectl日志 --follow: https://github.com/kubernetes/kubernetes/issues/28369的流