【问题标题】:How the pod can reflect the application exit code of K8S JobPod如何反映K8S Job的应用退出代码
【发布时间】:2021-09-26 03:10:59
【问题描述】:

我正在运行一个 K8S 作业,带有以下标志:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-EP
spec:
  template:
    metadata:
      labels:
        app: EP
    spec:
      restartPolicy: "Never"
      containers:
      - name: EP
        image: myImage

作业开始,运行我的脚本,该脚本运行一些向我发送电子邮件的应用程序,然后终止。应用程序将退出代码返回给 bash 脚本。 当我运行命令时: kubectl get pods,我得到以下信息:

NAME               READY   STATUS      RESTARTS   AGE
my-EP-94rh8   0/1     Completed   0          2m2s

有时会出现问题,网络未连接或没有可用的许可证。 我希望 pod 用户可以看到它。 我的问题是,当我运行上面的 get pods 命令时,我可以传播脚本退出代码吗? I.E 而不是“已完成”状态,我想查看我的应用程序退出代码 - 0、1、2、3.... 或者也许有一种方法可以在描述命令中的 Pod 状态中看到它? 目前我看到:

Pods Statuses:  0 Running / 1 Succeeded / 0 Failed

这可能吗?

【问题讨论】:

  • 使用容器运行时钩子比如 prestop 怎么样?
  • 我正在使用 prestop 挂钩来排空队列,然后再关闭。这不会帮助我显示上一个应用程序的退出代码

标签: kubernetes containers kubernetes-pod kubernetes-jobs


【解决方案1】:

k8s jobs 上的非零退出代码将进入 Failed pod 状态。确实没有办法让您使用 kubectl get pods 显示退出代码,但您可以使用 -ojson 输出 pod 状态,然后将其通过管道传输到 jq 以查找退出代码。来自this post 的类似以下内容可能会起作用

 kubectl get pod pod_name -c container_name-n namespace -ojson | jq .status.containerStatuses[].state.terminated.exitCode

或者这个,在 json 中使用 items[]

kubectl get pods -ojson | jq .items[].status.containerStatuses[].state.terminated.exitCode

或者,正如u/blaimi 提到的,你可以在没有jq 的情况下这样做,如下所示:

kubectl get pod pod_name -o jsonpath --template='{.status.containerStatuses[*].state.terminated.exitCode}

【讨论】:

  • 这在没有 jq 的情况下也可以工作:kubectl get pod pod_name -o jsonpath --template='{.status.containerStatuses[*].state.terminated.exitCode}'
  • 我喜欢没有jq 的想法!我会把它添加到答案中。
猜你喜欢
  • 2021-02-17
  • 2020-01-25
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2017-11-30
  • 2022-12-29
  • 2019-01-11
  • 2022-12-18
相关资源
最近更新 更多