基本的に、私の cron は 2 分ごとにデータベースを更新しています。しかし、24 時間ごとにデータベースを更新する別の cron を実行する必要があります。2 番目の cron (1 日あたり) の実行中に競合状態がないことを確認する必要があります。つまり、両方の cron を一緒に実行して重複させることはできません。これは、ジョブを使用して Kubernetes クラスターに実装する必要があります。
私の解決策は、最初の cron を 2 分ごとに実行することですが、2 番目の cron が (1 日あたり) 実行されるときは 5 分遅らせます。
代替ソリューションは大歓迎です。
1 に答える
いくつかの可能性について考えてみましたが、主に 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 番目のジョブは決して実行されません。
これらの情報と解決策が役に立ったかどうか教えてください。