重新启动后仍然存在的 k8s CronJob jobId

问题描述

我每天都有一个 k8s cron 工作, 我需要为每个创建的作业设置唯一的 ID,在作业失败的情况下,作业重新启动时也是如此。 示例:

2021-04-10,restarts:0,id = 1234 -> Failed
2021-04-10,restarts:1,restarts:2,id = 1234 -> Failed

2021-04-11,id 1235 -> Failed
2021-04-11,id 1235 -> Failed

2021-04-12,id 1236 -> success

2021-04-13,id 1237 -> success

有没有办法生成这样的变量?

解决方法

有没有办法生成这样的变量?

是的,使用 UID。在 Kubernetes 集群的整个生命周期内创建的每个对象都有一个不同的 UID。它旨在区分类似实体的历史事件。

此 UID 然后可以公开为 environment variable 并注入到您的 pod 中:


apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            env:
              - name: MY_UID
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.uid            
            command:
            - /bin/sh
            - -c
            - date; echo $MY_UID
          restartPolicy: OnFailure 

这里你已经打印出唯一的 UID:

➜  ~ k logs hello-1618817040-4jkpx 
Mon Apr 19 07:24:02 UTC 2021
f9060e34-a4e8-40d2-b459-6029b07e4fe7

您可以直接使用它,也可以对它进行散列并将其转换为您想要的任何数据类型。