KubernetesのWorkloadsリソース(その2)
CronJob
Jobに似たリソースとしてCronJobというリソースがあります。Kubernetes 1.4までScheduledJobという名前でしたが、CronJobに名称が変更になりました。CronJobはJobの亜種のように見えますが、CronJobとJobの関係はDeploymentとReplicaSetに似たものとなっています。CronJobは、Cronのようにスケジュールされた時間にJobを生成します。
CronJobの作成
簡単なCronJobのサンプルを動作させてみます。まず設定ファイルですが、下記のようなファイルから、sample-cronjobを作成します。今回は「60秒おきに30秒sleepするだけのJobを生成するCronJob」を作成します。spec.scheduleにはCronと同じフォーマットで時間の指定をすることが可能です。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: sample-cronjob spec: schedule: "*/1 * * * *" concurrencyPolicy: Forbid startingDeadlineSeconds: 30 successfulJobsHistoryLimit: 5 failedJobsHistoryLimit: 5 jobTemplate: spec: template: spec: containers: - name: sleep-container image: centos:latest command: ["sleep"] args: ["30"] restartPolicy: Never
設定ファイルを元にCronJobを作成します。
$ kubectl apply -f cronjob_sample.yml cronjob "sample-cronjob" created
また、細かい指定を行わないCronJobの場合には、「kubectl run --schedule」で作成することも可能です。
$ kubectl run sample-cronjob --schedule = "*/1 * * *" --restart Never --image centos:latest -- sleep 30 cronjob "sample-cronjob" created
CronJobを作成した直後は、まだJobが生成されておらず、ACTIVEなJobが存在していない状態です。
$ kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE sample-cronjob */1 * * * * False 0 <none> $ kubectl get job No resources found.
指定した時間が来ると、CronJobがJobを生成していることが確認できます。
$ kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE sleep-cronjob */1 * * * * False 0 Wed, 21 Mar 2018 17:22:00 +0900 $ kubectl get job NAME DESIRED SUCCESSFUL AGE sample-cronjob-1505669160 1 0 11s
CronJobの一時停止
CronJobでは指定した時間にJobを作成し続けます。メンテナンス等でJobが作成されてほしくない場合にはsuspend(一時停止)することが可能です。CronJobではspec.suspendがtrueに設定されているものはスケジュール対象から外れるようになっています。YAMLを書き換えて「kubectl apply」を再実行しても良いのですが、今回は「kubectl patch」コマンドを使って1コマンドで切り替える方法を利用します。
$ kubectl patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}' cronjob "sample-cronjob" patched
kubectl patchでは、内部的にHTTP PATCHメソッドを使って、Kubernetes独自のStrategic Merge Patchが行われます。実際に行われてるリクエストを確認するには、kubectlにVerboseオプション(-v)を追加します。
$ kubectl -v=10 patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}' …(省略)… I0322 11:30:26.811460 13318 round_trippers.go:417] curl -k -v -XPATCH -H "Accept: application/json" -H "Content-Type: application/strategic-merge-patch+json" -H "User-Agent: kubectl/v1.9.4 (darwin/amd64) kubernetes/9befc2b" https://xxx.xxx.xxx.xxx/apis/batch/v1beta1/namespaces/default/cronjobs/sample-cronjob …(省略)…
実行後はCronJobを一覧表示するとSUSPENDの部分がTrueになっており、これ以降はJobが生成されなくなっています。再度スケジューリングしたい場合には、先ほどと同様の手順でspec.suspendをfalseに設定してください。
$ kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE sample-cronjob */1 * * * * True 0 Thu, 22 Mar 2018 02:19:00 +0900
同時実行に関する制御
CronJobでは、Jobを生成するという特性上、同時実行に関するポリシーを設定することが可能です。上手くいっているときは以前に実行されているJobが終了しており、特に意識することなく新たなJobを生成できる状態だと思います。一方で、古いJobがまだ動いてる際にはポリシーで設定したいケースがあるかと思います。
spec.concurrencyPolicyでは古いJobがまだ動いてる際に、新しいJobを実行するかどうかのポリシーを設定することができます。
spec.concurrencyPolicyで指定する同時実行に関するポリシー
- Allow(default):同時実行に対して制限を行わない
- Forbid:前のJobが終了していない場合は次のJobは実行しない(同時実行を行わない)
- Replace:前のJobをキャンセルし、新たにJobを開始する
デフォルトではAllowが設定されており、既存のJobの動作に関わらず新たなJobを作成し続けます。
Forbidを指定すると、前のJobがまだ実行中だった場合には新たなJobを生成しません。
Replaceを指定すると、前のJobがまだ実行中だった場合には前のJobを停止して、新たなJobを生成します。
CronJobは、Kubernetes Masterが指定した時刻になるとJobを作成する仕組みになっています。そのため、Kubernetes Masterが一時的にダウンしていた場合など、開始時刻が遅れた場合に許容できる秒数(spec.startingDeadlineSeconds)を指定することが可能です。例えば、毎時00分に起動するJobを「毎時00~05分にだけ実行可能」に設定する場合には、300secに設定しておく必要があります。デフォルトではどんなに開始時間が遅れた場合でもJobを生成するようになっています。
その他にCronJob で重要なパラメータとして、保持しておくJobの数を指定するspec.successfulJobsHistoryLimitとspec.failedJobsHistoryLimitがあります。
- spec.successfulJobsHistoryLimit:保存する成功Jobの数
- spec.failedJobsHistoryLimit:保存する失敗Jobの数
これらの設定値は、CronJobが生成するJobを何個保持しておくかの設定値です。
今回は両方のJobsHistoryLimitを5に設定しているため、6分以上経過した後にJobの一覧を確認すると、直近の5件の成功Jobだけが残っているかと思います。この値を0に設定した場合はJobは終了時に即時削除されます。また、デフォルトの設定値は3となっています。
$ kubectl get job NAME DESIRED SUCCESSFUL AGE sample-cronjob-1521697560 1 1 4m sample-cronjob-1521697620 1 1 3m sample-cronjob-1521697680 1 1 2m sample-cronjob-1521697740 1 1 1m sample-cronjob-1521697800 1 1 58s
まとめ
前回と今回の2回に渡ってWorkloadsリソースを紹介しました。Kubernetesでは実行したいプロセスの特性に合わせて、適切なリソースが用意されています。基本的にはPodやReplicaSetを使うようなケースはDeploymentを使っておいたほうが良いでしょう。細かい仕様の差はさておき、この8個のWorkloadsリソースは把握しておく必要があります。
リソースの種類 | 内容 |
---|---|
Pod | デバッグや確認用途などで利用 |
ReplicationController | 非推奨のため今後はReplicaSetを利用する |
ReplicaSet | Podをスケールさせて管理する 基本的にはDeployment経由で使う |
Deployment | スケールさせるワークロードは基本的にこれを使う |
DaemonSet | 各ノードに1つずつPodを配置 |
StatefulSet | データの永続化などステートを持つワークロードで利用 |
Job | ワークキューやタスクなどコンテナの終了が必要なワークロードで利用 |
CronJob | 定期的にJobを作成する |
次回は、実行したWorkloadsリソースに対して外部からアクセス可能なEndpointの提供などを行うDiscovery&LBリソースについて説明します。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- KubernetesのWorkloadsリソース(その1)
- Kubernetesの基礎
- KubernetesのDiscovery&LBリソース(その2)
- KubernetesのConfig&Storageリソース(その1)
- KubernetesのDiscovery&LBリソース(その1)
- Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)
- 「Inspektor Gadget」でKubernetesクラスタをデバッグする
- Oracle Cloud Hangout Cafe Season7 #1「Kubnernetes 超入門」(2023年6月7日開催)
- Kubernetesアプリケーションの快適リリースとGitOps
- Kubernetes上のコンテナをIngressでインターネットに公開するまで