1

基本的に、私の cron は 2 分ごとにデータベースを更新しています。しかし、24 時間ごとにデータベースを更新する別の cron を実行する必要があります。2 番目の cron (1 日あたり) の実行中に競合状態がないことを確認する必要があります。つまり、両方の cron を一緒に実行して重複させることはできません。これは、ジョブを使用して Kubernetes クラスターに実装する必要があります。
私の解決策は、最初の cron を 2 分ごとに実行することですが、2 番目の cron が (1 日あたり) 実行されるときは 5 分遅らせます。
代替ソリューションは大歓迎です。

4

1 に答える 1

0

いくつかの可能性について考えてみましたが、主に 2 分ごとに実行する必要があるジョブがあるという事実によって、問題が発生する可能性があります。たとえば、新しい 2 分間のジョブで、何らかの理由で毎日のジョブに予想以上の時間がかかるとします。開始され、これは起こりません。

最善の解決策は、これをコード レベルで解決することです。アプリケーションにロックを作成して、これらのジョブが同時に実行されないようにすることができます。

コードでこの問題を解決する解決策を本当に思いつかない場合は、同じ cronjob からの新しいジョブの開始を防ぐ Kubernetes のメカニズムがあります。フラグspec.concurrencyPolicy: Forbidを設定すると、ジョブの開始に 2 分以上かかる場合、新しいジョブがスキップされます。これはグローバル フラグではなく、cronjob ごとのみです。

この可能性をspec.initContainersで集約し、同じ cronjob で両方のタスクを実行する方法を見つけることができます。

spec.initContainers は、アプリ コンテナーの前に実行される特殊なコンテナーです。

次に例を示します。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  concurrencyPolicy: Forbid
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          initContainers
          - name: hello1
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          containers:
          - name: hello2
            image: busybox
            args:
            - /bin/sh
            - -c
            - DATE=`date +"%H:%M"`; if [[ $DATE == "00:00" ]]; then date; echo Hello from the Kubernetes cluster; fi
          restartPolicy: OnFailure

このマニフェストは、2 分ごとに実行され、initContainer (2 分のジョブ) を開始し、2 分ごとに 2 番目のコンテナーも実行する cronJob を定義しています。問題は、この 2 番目のコンテナーには、午前 0 時かどうかをチェックするシェル スクリプトがあることです (開始時刻がわからないため、秒数は無視されます)。

コードのこの部分を調整する必要がある場合があります。

DATE=`date +"%H:%M"; if [[ $DATE == "00:00" ]

最初のコンテナーの実行に 1 分以上かかるとします。それは 00:01 になり、2 番目のジョブは決して実行されません。

これらの情報と解決策が役に立ったかどうか教えてください。

于 2020-03-20T13:51:34.273 に答える