Kubernetes はシェル スクリプトを定期的に実行する cronjob を実装します
Kubernetes cronjob はシェル スクリプトの役割を定期的に実行します
既存のチュートリアルの多くは、cronjob を介してコマンドを定期的に実行する方法のみを説明していますが、cronjob を使用する実際の生産プロセスでは、特に多数のシェル コマンドを実行する必要がある場合、要件を満たせないことがよくあります。configmap に関連付けられたシェル スクリプトを実行することで、シェル スクリプト内のコマンドを柔軟に調整し、cronjob を満たしてより複雑なシェル コマンドを実行できます。
Kubernetes でシェル スクリプトを定期的に実行する CronJob には、次のような多くの用途があります。
- 定期メンテナンス: CronJob は、古いログ ファイルのクリーンアップ、データベースの更新、インデックスの維持など、特定のメンテナンス タスクを定期的に実行するように設定できます。
- データのバックアップとリカバリ: CronJob を作成して、データベースまたはファイル システムを定期的にバックアップし、必要に応じてリカバリ操作を実行できます。
- 定期的なデータ処理: システムが定期的に (毎晩など) データを処理する必要がある場合、これらのタスクを処理する CronJob を作成できます。
- 監視とレポート: CronJob は、システムの健全性のチェックやレポートの生成などの監視タスクを定期的に実行できます。
- 自動スケーリングとスケーリング: 予測されるシステム負荷に基づいて、必要に応じて実行中のポッドの数を自動的にスケールアップまたはスケールダウンする CronJob を作成できます。
- CronJob: CronJob を使用して、特定の時間に実行したいタスクを実行することもできます。
1. 導入プロセス
1.1 構成マップの定義
cat <<EOF > script-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: script-configmap
data: #shell 脚本的命令,可以根据实际情况创建更复杂的命令
myscript.sh: |
#!/bin/bash
echo "Hello, Kubernetes!"
EOF
1.2 cronジョブの定義
cat <<EOF > my-cronjob.yaml
apiVersion: batch/v1 #kubernetes 1.21版本后请使用batch/v1,1.21前使用batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "*/1 * * * *" #每分钟执行一次
concurrencyPolicy: Allow #并发策略,允许并发运行
jobTemplate:
spec:
template:
spec:
volumes:
- name: script-volume
configMap:
name: script-configmap
containers:
- name: my-container
image: centos
volumeMounts:
- name: script-volume
mountPath: /scripts
command: ["/bin/bash", "/scripts/myscript.sh"]
restartPolicy: OnFailure
EOF
cronjob 用に一般的に設定される API パラメーター:
- spec.schedule: スケジュール、必須フィールド、タスクの実行サイクルを指定します。形式は Cron と同じです
- spec.jobTemplate: ジョブ テンプレート、必須フィールド、実行するタスクを指定します。形式はジョブと同じです
- spec.startingDeadlineSeconds : ジョブを開始する期限 (秒単位)、このフィールドはオプションです。何らかの理由でスケジュールされた時刻に間に合わなかった場合、実行時刻に間に合わなかったジョブは失敗したものとみなされます。指定がない場合は期限なし
- spec.concurrencyPolicy: 同時実行ポリシー。このフィールドもオプションです。Cron Jobで作成されたジョブの同時実行の処理方法を指定します。次のポリシーのいずれか 1 つだけを指定できます。
a.Allow (デフォルト): ジョブの同時実行を許可します
。 b.Forbid: 同時実行を禁止します。前のポリシーが完了していない場合は、次のポリシーを直接スキップします。
c.Replace:現在実行中のジョブ ジョブをキャンセルし、新しいジョブに置き換えます
現在のポリシーは、同じ cron ジョブによって作成されたジョブにのみ適用できることに注意してください。複数の cron ジョブがある場合、それらが作成するジョブは常に同時に実行できます。
- spec.suspend : サスペンド。このフィールドもオプションです。true に設定すると、後続のすべての実行が一時停止されます。すでに実行を開始しているジョブには影響しません。デフォルト値は false です
- spec. successJobsHistoryLimit および .spec.failedJobsHistoryLimit: 履歴制限はオプションのフィールドです。完了したジョブと失敗したジョブをいくつ保持できるかを指定します。
1.3 cronジョブが正しく実行されているかどうかを確認する
#查看cronjob状态
kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
my-cronjob */5 * * * * False 2 19s 23m
#查看job状态
kubectl get jobs
NAME COMPLETIONS DURATION AGE
my-cronjob-28096067 1/1 34s 3m38s
my-cronjob-28096068 1/1 34s 2m38s
my-cronjob-28096069 1/1 34s 98s
#查看pod状态
kubectl get po
NAME READY STATUS RESTARTS AGE
my-cronjob-28096067-qxtqg 0/1 Completed 0 5m54s
my-cronjob-28096068-7scqd 0/1 Completed 0 4m54s
my-cronjob-28096069-gtlzg 0/1 Completed 0 3m54s