如何从 Kubernetes 作业中的所有 Pod 获取日志?

A.W*_*Wan 5 kubernetes

我正在使用 Kubernetes 作业来运行测试;shell 脚本运行作业并具有设置/拆卸逻辑。该职位有

  • restartPolicy: Never
  • backoffLimit: 2

这意味着如果作业失败,它将创建一个新的 pod 并重试一次。

作业完成后,我想转储作业中所有 Pod 的日志。但当我这样做时

kubectl logs job/my-test
Run Code Online (Sandbox Code Playgroud)

我只从其中一个 Pod 获取日志,其前缀类似于Found 2 pods, using pod/my-test-ntb4w.

--all-containers=true标志没有为我提供所有 Pod 的日志。

如何在 shell 脚本中从作业中的所有 pod 获取日志?

Mar*_*ark 6

作为参考,请看一下kubectl logs --help

   -- kubectl logs job/my-job
   # Return snapshot logs from first container of a job named hello
      kubectl logs job/hello -- will provide output only for one pod/container
    
   -- while using (either label or selector) it gives you more flexible way to deal with your resources
   # -l, --selector='': Selector (label query) to filter on.
Run Code Online (Sandbox Code Playgroud)

或者,您可以添加自定义标签或使用职位描述中的_标签/选择器:

labels:
      controller-uid: 55d965d0-0016-42ba-b4f5-120c1a78798b
      job-name: pi
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到非常相似的情况:立即检查所有作业的输出运行示例作业

使用 bash 时,您还可以尝试:

pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}')

for pod in $pods ; do kubectl logs $pod ; done 
Run Code Online (Sandbox Code Playgroud)

对于使用 k8s 对象非常有用的命令:

kubectl get pods,jobs --show-labels

NAME           READY   STATUS      RESTARTS   AGE   LABELS
pod/pi-25vcd   0/1     Completed   0          97s   controller-uid=55d965d0-0016-42ba-b4f5-120c1a78798b,job-name=pi
Run Code Online (Sandbox Code Playgroud)


A.W*_*Wan 2

使用--selectornot 似乎只是job/my-test从所有 pod 获取日志:

kubectl logs --selector job-name=my-test
Run Code Online (Sandbox Code Playgroud)