Kubernetes CronJobでJavaのバッチ処理を動かす

目的

社内でバッチ処理をkubernetes(以下K8S)で動作したい要望が
あったため、Jobの実行方法について記載します。

前提

・K8Sが構築済みであること
・K8Sダッシュボードが使用可能であること
・dockerがイントール済みであること
・Amazon Elastic Container Registry(以下ECR)が使用可能であること

事前準備

コンソールに「Hello K8S Job!」と表示するだけのJavaバッチを
dockerで作成する。

以下はdockerがイントール済みの端末で行う

【1】Javaバッチを作成する。

ソース格納用ディレクトリを作成する。

1mkdir src

格納ディレクトリにJavaバッチクラスを作成する。
作成ファイル:src/Main.java

public class Main {
 public static void main(String[] args) {
  System.out.println("Hello K8S Job!");
 }
}

 

【2】dockerファイルを作成する。

javaファイルをコンパイルして実行するDockerfileを作成する。

作成ファイル:Dockerfile

FROM openjdk:8-jdk-alpine
COPY src /src
RUN javac /src/Main.java

WORKDIR /src
CMD ["java","Main"]


【3】dockerファイルをビルドする。

Dockerfileを作成した場所で以下コマンドを実行しdockerビルドを行う

1docker build -t java-batch .

【4】ECRにdockerイメージをプッシュする

※今回は利便上「ECR」を使用しているが
K8Sから参照できるdockerリポジトリであれば
特に「ECR」である必要はない

・ECRログイン

1aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxx.dkr.ecr.ap-northeast-1.amazonaws.com

※「xxxx」と「ap-northeast-1」各環境の設定に変更する

・【3】でビルドしたdockerイメージにタグを付ける

1docker tag java-batch:latest xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr:java-batch

※「xxxx」と「test-ecr」各環境の設定に変更する

・ECRにプッシュする

1docker push xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr:java-batch

※「xxxx」と「test-ecr」各環境の設定に変更する

ECRにプッシュされたことを確認

K8SのCronJobを作成する

以下の手順はkubectlコマンドが実行出来る端末で行う

【1】CronJob用のyamlファイルを作成する

作成ファイル:cron-job.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: java-batch-cron
spec:
# schedule
# 時刻はジョブが開始されたkube-controller-managerのタイムゾーン
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
schedule: "2 8 * * *"
# concurrencyPolicy
# Allow : 同時実行を許可
# Forbid : 同時実行を拒否、実行中Jobが存在する場合は新規Jobはスキップ
# Replace : 同時実行を拒否、実行中Jobが存在する場合は実行中Jobをキャンセルし新規Jobを実行
concurrencyPolicy: Forbid
# successfulJobsHistoryLimit
# 完了Jobの保持数 (デフォルト:3)
# 保持したくない場合は0を指定
successfulJobsHistoryLimit: 3
# failedJobsHistoryLimit
# 失敗Jobの保持数 (デフォルト:1)
# 保持したくない場合は0を指定
failedJobsHistoryLimit: 1
jobTemplate:
 spec:
  template:
   spec:
    containers:
    - name: java-batch-cron
     image: xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr:java-batch
    # restartPolicy
    # OnFailure : 失敗時のみコンテナを再起動
    # Never : コンテナを再起動しない
    restartPolicy: Never

 

 

【2】重要そうなパラメータ

schedule:Jobの実行スケジュール
 時刻はジョブが開始されたkube-controller-managerのタイムゾーンとなり、
 スケジュールの設定は以下となります。

※(wiki参照:https://ja.wikipedia.org/wiki/Crontab)
 ┌───────────── minute (0 – 59)
 │ ┌───────────── hour (0 – 23)
 │ │ ┌───────────── day of the month (1 – 31)
 │ │ │ ┌───────────── month (1 – 12)
 │ │ │ │ ┌───────────── day of the week (0 – 6) (Sunday to Saturday;
 │ │ │ │ │ 7 is also Sunday on some systems)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *

concurrencyPolicy:Jobの同時実行の設定
 Allow : 同時実行を許可
 Forbid : 同時実行を拒否、実行中Jobが存在する場合は新規Jobはスキップ
 Replace : 同時実行を拒否、実行中Jobが存在する場合は実行中Jobをキャンセルし新規Jobを実行

restartPolicy:Job失敗時の動作設定
 OnFailure : 失敗時のみコンテナを再起動
 Never : コンテナを再起動しない

【3】上記で作成したyamlファイルを実行する

1kubectl apply -f cron-job.yaml

設定した時刻に実行結果を確認します

※ポットが作成され、実行されていることを確認

ぜひ参考にしてみてください!

Smallitのサービス