この連載が書籍になりました!『Kubernetes完全ガイド

KubernetesのWorkloadsリソース(その2)

2018年4月4日(水)
青山 真也
前回に引き続き、ユーザーが利用できるWorkloadsリソース8種類のうち4種類を紹介する。

CronJob

Jobに似たリソースとしてCronJobというリソースがあります。Kubernetes 1.4までScheduledJobという名前でしたが、CronJobに名称が変更になりました。CronJobはJobの亜種のように見えますが、CronJobJobの関係はDeploymentReplicaSetに似たものとなっています。CronJobは、Cronのようにスケジュールされた時間にJobを生成します。

CronJob

CronJob

CronJobの作成

簡単なCronJobのサンプルを動作させてみます。まず設定ファイルですが、下記のようなファイルから、sample-cronjobを作成します。今回は「60秒おきに30秒sleepするだけのJobを生成するCronJob」を作成します。spec.scheduleにはCronと同じフォーマットで時間の指定をすることが可能です。

リスト19:サンプルのCronJobを作成するcronjob_sample.yml

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を作成します。

リスト20:CronJobを作成

$ kubectl apply -f cronjob_sample.yml
cronjob "sample-cronjob" created

また、細かい指定を行わないCronJobの場合には、「kubectl run --schedule」で作成することも可能です。

リスト21:kubectlでCronJobを作成する

$ kubectl run sample-cronjob --schedule = "*/1 * * *" --restart Never --image centos:latest -- sleep 30
cronjob "sample-cronjob" created

CronJobを作成した直後は、まだJobが生成されておらず、ACTIVEなJobが存在していない状態です。

リスト22:CronJob作成直後はまだJobがない

$ kubectl get cronjob
NAME             SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
sample-cronjob   */1 * * * *   False     0         <none>

$ kubectl get job
No resources found.

指定した時間が来ると、CronJobがJobを生成していることが確認できます。

リスト23: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コマンドで切り替える方法を利用します。

リスト24:kubectl patchコマンドでCronJobの一時停止を実行

$ kubectl patch cronjob sample-cronjob -p '{"spec":{"suspend":true}}'
cronjob "sample-cronjob" patched

kubectl patchでは、内部的にHTTP PATCHメソッドを使って、Kubernetes独自のStrategic Merge Patchが行われます。実際に行われてるリクエストを確認するには、kubectlにVerboseオプション(-v)を追加します。

リスト25:kubectl patchで実際に行われるリクエストを確認

$ 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に設定してください。

リスト26:Job生成が一時停止されている

$ 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がまだ動いてる際にはポリシーで設定したいケースがあるかと思います。

CronJob

CronJob

spec.concurrencyPolicyでは古いJobがまだ動いてる際に、新しいJobを実行するかどうかのポリシーを設定することができます。

spec.concurrencyPolicyで指定する同時実行に関するポリシー

  • Allow(default):同時実行に対して制限を行わない
  • Forbid:前のJobが終了していない場合は次のJobは実行しない(同時実行を行わない)
  • Replace:前のJobをキャンセルし、新たにJobを開始する

デフォルトではAllowが設定されており、既存のJobの動作に関わらず新たなJobを作成し続けます。

Allowを設定した状態

Allowを設定した状態

Forbidを指定すると、前のJobがまだ実行中だった場合には新たなJobを生成しません。

Forbidを設定した状態

Forbidを設定した状態

Replaceを指定すると、前のJobがまだ実行中だった場合には前のJobを停止して、新たなJobを生成します。

Replaceを設定した状態

Replaceを設定した状態

CronJobは、Kubernetes Masterが指定した時刻になるとJobを作成する仕組みになっています。そのため、Kubernetes Masterが一時的にダウンしていた場合など、開始時刻が遅れた場合に許容できる秒数(spec.startingDeadlineSeconds)を指定することが可能です。例えば、毎時00分に起動するJobを「毎時00~05分にだけ実行可能」に設定する場合には、300secに設定しておく必要があります。デフォルトではどんなに開始時間が遅れた場合でもJobを生成するようになっています。

その他にCronJob で重要なパラメータとして、保持しておくJobの数を指定するspec.successfulJobsHistoryLimitspec.failedJobsHistoryLimitがあります。

  • spec.successfulJobsHistoryLimit:保存する成功Jobの数
  • spec.failedJobsHistoryLimit:保存する失敗Jobの数

これらの設定値は、CronJobが生成するJobを何個保持しておくかの設定値です。

CronJobのHistoryLimit

CronJobのHistoryLimit

今回は両方のJobsHistoryLimitを5に設定しているため、6分以上経過した後にJobの一覧を確認すると、直近の5件の成功Jobだけが残っているかと思います。この値を0に設定した場合はJobは終了時に即時削除されます。また、デフォルトの設定値は3となっています。

リスト27:JobsHistoryLimitで設定した数だけ記録が残っている

$ 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リソースは把握しておく必要があります。

Workloadsリソースまとめ

リソースの種類内容
Podデバッグや確認用途などで利用
ReplicationController非推奨のため今後はReplicaSetを利用する
ReplicaSetPodをスケールさせて管理する
基本的にはDeployment経由で使う
Deploymentスケールさせるワークロードは基本的にこれを使う
DaemonSet各ノードに1つずつPodを配置
StatefulSetデータの永続化などステートを持つワークロードで利用
Jobワークキューやタスクなどコンテナの終了が必要なワークロードで利用
CronJob定期的にJobを作成する

次回は、実行したWorkloadsリソースに対して外部からアクセス可能なEndpointの提供などを行うDiscovery&LBリソースについて説明します。

株式会社サイバーエージェント アドテク本部 Strategic Infrastructure Agency

2016年入社。OpenStackを使ったプライベートクラウドやGKE互換なコンテナプラットフォームをゼロから構築し、国内カンファレンスでのKeynoteに登壇。
その後、世界で2番目にCertified Kubernetes Application Developer、138番目にCertified Kubernetes Administratorの認定資格を取得。
現在はKubernetesやOpenStackなどOSSへのコントリビュート活動をはじめ、CNCF公式のCloud Native Meetup TokyoのOrganizerやJapan Container Daysの運営などコミュニティ活動にも従事している。

連載バックナンバー

仮想化/コンテナ技術解説
第9回

KubernetesのConfig&Storageリソース(その2)

2018/6/6
連載9回目となる今回は、Config&Storageリソースのうち、PersistentVolumeClaimについて解説する。
仮想化/コンテナ技術解説
第8回

KubernetesのConfig&Storageリソース(その1)

2018/5/31
今回と次回の2回に渡って、5種類に大別されるKubernetesのリソースのうち、Config&Storageリソースを解説する。
仮想化/コンテナ技術解説
第7回

KubernetesのDiscovery&LBリソース(その2)

2018/5/16
前回に引き続き、Discovery&LBリソースのServiceとIngressを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています