首页 > 解决方案 > 防止两个作业在 Kubernetes 中并行运行

问题描述

ATT : 我不知道为什么,但有时一个 pod 突然将状态变为未知,这就是新 pod 开始的地方

我在 gcloud 中使用 kubernetes。

我为需要运行的 cron 作业构建了 yaml 文件:

apiVersion: batch/v1beta1
kind: CronJob
metadata: 
  name: etl-table-feed-from-schema-vtex-to-schema-sale-all
spec:
  schedule: "* * * * *"
  concurrencyPolicy: "Forbid"
  failedJobsHistoryLimit: 3
  successfulJobsHistoryLimit: 1
  startingDeadlineSeconds: 60 # 1 min
  jobTemplate:
    spec:
      backoffLimit: 0
      #activeDeadlineSeconds: 3600 # 1 hora
      template:
        spec:
          containers:
            - name: etl-table-feed-from-schema-vtex-to-schema-sale-all
              image: (myimage)
              command: ["/bin/sh", "-c"]
              args: (mycommands)
              env:
              - name: PYTHONUNBUFFERED
                value: "1"
              envFrom:
              - secretRef:
                  name: etl-secret
          restartPolicy: Never
          nodeSelector:
        #<labelname>:value
            etlnode: etl-hi-cpu

我一次只需要运行一个 pod,只需要一个。但有时,我不知道为什么,而且我无法重现,一次运行多个 pod。

我已经将 concurrencyPolicy 写为 Forbid,但似乎还不够。

我在 gcloud 的抢占式池中运行它。

同时运行的两个 pod:

在此处输入图像描述在此处输入图像描述

标签: kubernetesgoogle-kubernetes-enginegcloudkubernetes-cronjob

解决方案


就我而言,问题在于这concurrencyPolicy: "Forbid"activeDeadlineSeconds不够。我以前的 pod 收到SIGTERM但在它实际被杀死之前又运行了 30 秒,所以我最终得到了两个并行运行 30 秒的作业。

请参阅此问题:Kubernetes Cron Job Terminate Pod before creation of next schedule,在我的情况下,此答案提供了解决方案:https ://stackoverflow.com/a/63721120/5868044 。两种选择:

  1. 使 pod 立即停止SIGTERM(例如使用 bash trap 'exit' SIGTERM
  2. 通过设置小于activeDeadlineSeconds计划间隔,在您的作业之间留出 30 多秒的时间间隔。

推荐阅读