kubernetes cron 作业中可预测的 pod 名称

问题描述

我在 kubernetes 上有一个 cron 作业,为了测试目的,我像这样触发:

kubectl create -f src/cronjob.yaml
kubectl create job --from=cronjob/analysis analysis-test

这会创建一个名为 analysis-test-<random-string> 的 Pod。我想知道是否可以省略或使后缀可预测?

过滤cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
Metadata:
  name: analysis
  labels:
    job: analysis
spec:
  schedule: "0 0 * * 0"
  concurrencyPolicy: "Forbid"
  suspend: true
  FailedJobsHistoryLimit: 3
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: container-name
              image: myimage
              env:
              - name: ENVIRONMENT
                value: "DEV"
              imagePullPolicy: IfNotPresent
              command: [ "/bin/bash","-c","--" ]
              args: [ "while true; do sleep 30; done;"]

解决方法

从 v1beta1 开始,不,你不能,这是关于 cronjob 的文档 https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

以下是文档的摘录:

为 CronJob 资源创建清单时,请确保您提供的名称是有效的 DNS 子域名。名称不得超过 52 个字符。这是因为 CronJob 控制器会自动在提供的作业名称后附加 11 个字符,并且存在作业名称的最大长度不超过 63 个字符的限制。

这里还有 CronJob v1beta1 规范的参考页面,用于查看可用的选项配置: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/#cronjobspec-v1beta1-batch


稍微挖掘一下源代码,你可以看到 CronJob 控制器是如何创建作业资源的 https://github.com/kubernetes/kubernetes/blob/v1.20.1/pkg/controller/cronjob/cronjob_controller.go#L327 https://github.com/kubernetes/kubernetes/blob/v1.20.1/pkg/controller/cronjob/utils.go#L219