Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Part-100: ⏰ Implement CronJobs in Google Kubernetes Engine (GKE)

2025年10月02日に「Dev.to」が公開したITニュース「Part-100: ⏰ Implement CronJobs in Google Kubernetes Engine (GKE)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Google Kubernetes Engine (GKE) のCronJobは、Linuxのcronと同様に、定期的なタスクを自動実行する機能だ。データベースのバックアップやレポート生成など、繰り返し作業を効率化し、自動化に役立つ。CronJobはスケジュールに基づきPodを起動し、タスクを完了させる。

ITニュース解説

システムエンジニアを目指す皆さんにとって、日々の運用業務の効率化は非常に重要なテーマだろう。特に、繰り返し発生する定型作業を自動化する技術は、ITシステムを安定稼働させる上で欠かせない。ここでは、Google Kubernetes Engine (GKE) という、コンテナ化されたアプリケーションを大規模に管理・運用するための環境で、定期的なタスクを自動実行する「CronJob(クロンジョブ)」という機能について解説する。GKEは、Google Cloudが提供するサービスの一つで、アプリケーションを動かすための「コンテナ」と呼ばれる小さな仮想環境を多数管理し、効率よく動かすための基盤を提供するKubernetesを簡単に利用できるようにしたものだ。この環境で、特定の時間に何かを実行したい場合にCronJobが非常に役立つ。

CronJobは、Kubernetes環境において、指定したスケジュールでタスクを自動実行するための仕組みだ。その名前が示す通り、Linuxなどのオペレーティングシステムで古くから使われている「cron」という機能と非常に似ている。cronがパソコンやサーバー上で定期的なコマンド実行を担うように、CronJobはKubernetes上で特定の「ジョブ(Job)」を定期的に生成し、実行させる。

具体的には、CronJobが設定されたスケジュールになると、Kubernetesはまず「Job」というオブジェクトを作成する。このJobは、単一のタスクを実行し、それが成功するまで再試行する責任を持つ。そして、Jobは実際にタスクを実行するための「Pod(ポッド)」という最小単位の実行環境を作成する。Podはコンテナを内包し、そのコンテナ内でプログラムやスクリプトが実行される。タスクが完了するとPodは終了し、Jobも完了となる。このように、CronJobはJobを作り、JobがPodを作り、Podがタスクを実行するという一連の流れで動作する。スケジュールは「cron構文」と呼ばれる特別な記述形式で定義され、例えば「*/1 * * * *」と書けば「1分ごとに」という意味になる。

CronJobは多岐にわたる用途で利用できる。例えば、データベースのバックアップを毎日深夜に実行したり、システムのログファイルを定期的に整理(ログローテーション)したり、月次・週次のレポートを自動で生成したり、一時ファイルを定期的にクリーンアップしたりするなど、様々な定型作業の自動化に非常に適している。

CronJobを設定するには、「マニフェスト」と呼ばれるYAML形式の設定ファイルを作成する。このファイルは、Kubernetesに何を実行してほしいかを伝える指示書のようなものだ。例として「cron-job.yaml」というファイルの内容を見てみよう。

まず、「apiVersion: batch/v1」は、使用するKubernetes APIのバージョンを指定している。CronJobはバッチ処理に関連するため「batch」グループに属する。「kind: CronJob」は、作成したいオブジェクトがCronJobであることを示している。「metadata」セクションには、オブジェクトの名前など識別情報を記述する。「name: cron-job-demo」は、このCronJobに「cron-job-demo」という名前を付けることを意味する。

最も重要なのが「spec」セクションで、CronJobの具体的な動作を設定する。「schedule: "*/1 * * * *"」は、このCronJobを1分ごとに実行するように指示している。この記述がcron構文だ。「concurrencyPolicy: Allow」は、もし前回の実行が終わっていなくても、新しい実行を同時に開始して良いという意味になる。これを「Forbid」にすると、前回の実行が完了するまで次の実行を待つようになる。「startingDeadlineSeconds: 100」は、何らかの理由でジョブの開始が遅れた場合、最大で100秒まで待つことを示す。これを超えると、その回のジョブはスキップされる。「suspend: false」は、CronJobを有効にしておくことを意味する。「true」に設定すると、一時的にジョブの生成を停止できる。「successfulJobsHistoryLimit: 3」と「failedJobsHistoryLimit: 1」は、成功したJobの履歴を最新3件まで、失敗したJobの履歴を最新1件まで保存することを指定する。これにより、過去の実行状況を確認できるが、古すぎる履歴が残ってストレージを圧迫するのを防ぐ。

次に「jobTemplate」セクションだが、これはCronJobが生成するJobの具体的な内容を定義する部分だ。さらにその中の「spec.template.spec.containers」で、実際にタスクを実行するコンテナの詳細を設定する。例では「name: hello」というコンテナで、「image: busybox」という軽量なLinux環境イメージを使用している。そして「args」で、そのコンテナ内で実行するコマンドを指定している。ここでは「/bin/sh -c 'date; echo "Hello, World!"'」とあり、これは「現在の日付と時刻を表示し、その後に"Hello, World!"というメッセージを表示する」というコマンドだ。「restartPolicy: OnFailure」は、コンテナ内で実行されるタスクが失敗した場合にのみ、コンテナを再起動することを指示している。この設定により、毎分、新しいPodが作成され、「Hello, World!」というメッセージを出力するタスクが実行されることになる。

設定ファイルを準備したら、それをKubernetes環境に適用する。これには「kubectl」というコマンドラインツールを使用する。 「kubectl apply -f cron-job.yaml」と入力すると、先ほど作成した設定ファイルに基づいてCronJobがKubernetesクラスターにデプロイされる。

CronJobが正しくデプロイされたか、またその状況を確認するには以下のコマンドを使う。 「kubectl get cronjob」または短縮形の「kubectl get cj」と入力すると、デプロイされているCronJobの一覧が表示される。 さらに詳しい情報を確認したい場合は、「kubectl describe cronjob cron-job-demo」と入力する。これにより、設定の詳細や、いつ次回のジョブがスケジュールされているかなどのイベント情報が表示される。

デプロイ後、設定したスケジュール(この例では1分ごと)が来ると、CronJobはJobを作成し、そのJobがPodを作成してタスクを実行する。実際にPodが作成され、完了していることを確認するには「kubectl get pods」と入力する。このコマンドを繰り返し実行したり、「kubectl get pods --watch」というコマンドでPodの作成・終了状況をリアルタイムで監視したりすると、毎分新しいPodが作成され、タスクを完了すると「Completed」というステータスになっている様子が確認できるだろう。これにより、CronJobが意図通りに動作していることを視覚的に確認できる。

タスクの実行を停止し、作成したCronJobをKubernetes環境から削除したい場合は、以下のコマンドを使用する。 「kubectl delete cronjob cron-job-demo」と入力することで、指定した名前のCronJobが削除される。これにより、それ以降、新しいJobが作成されることはなくなる。ただし、すでに作成され実行中のJobやPodはすぐには削除されないため、必要に応じてそれらも個別に削除する必要がある場合もある。

CronJobは、Kubernetes環境における定型作業の自動化に非常に強力なツールである。しかし、適切に設定を調整しないと、予期せぬ問題を引き起こす可能性もあるため、いくつかの重要な点に注意する必要がある。

特に、「concurrencyPolicy」は重要だ。例えば、前回のジョブがまだ実行中なのに、次のジョブが開始されてしまうと、リソースの競合やデータの不整合を引き起こす可能性がある。これを避けるためには「Forbid」や「Replace」といった設定を検討し、ジョブの特性に合わせて選択することが推奨される。 「successfulJobsHistoryLimit」と「failedJobsHistoryLimit」は、過去のJob実行履歴がどれだけ残るかを決める。これを適切に設定することで、必要な履歴だけを残し、Kubernetesクラスターのリソース(特にストレージ)を無駄に消費しないように管理できる。 「suspend」オプションは、CronJobを削除せずに一時的に停止したい場合に非常に便利だ。例えば、システムのメンテナンス期間中だけジョブの実行を止めたい場合などに活用できる。

システムエンジニアとして、GKEのようなクラウドネイティブな環境でアプリケーションを運用する際には、このように自動化の仕組みを効果的に活用することが、運用負荷の軽減やシステムの安定性向上に直結する。CronJobを理解し、使いこなすことで、より信頼性の高い、効率的なシステム運用を実現できるだろう。

関連コンテンツ

関連IT用語