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

目的

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

前提

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

事前準備

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

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

  1. Javaバッチを作成する。
    ソース格納用ディレクトリを作成する。

    mkdir 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ビルドを行う

    docker build -t java-batch .
  4. ECRにdockerイメージをプッシュする
    ※今回は利便上「ECR」を使用しているがK8Sから参照できるdockerリポジトリであれば 特に「ECR」である必要はない
    ECRログイン

    aws 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イメージにタグを付ける

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

    ※「xxxx」と「test-ecr」各環境の設定に変更する
    ECRにプッシュする

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

    ※「xxxx」と「test-ecr」各環境の設定に変更する
    ECRにプッシュされたことを確認

K8SのJobを作成する

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

  1. Job用のyamlファイルを作成する
    作成ファイル:job.yaml

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: java-batch
    spec:
      # parallelism
      # Jobの並列実行数
      parallelism: 1
      # completions
      # Jobの成功回数 (例:2を指定した場合2回実行される)
      completions: 1
      template:
        spec:
          containers:
          - name: java-batch
            image: xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr:java-batch
          # restartPolicy
          # OnFailure : 失敗時のみコンテナを再起動
          # Never     : コンテナを再起動しない
          restartPolicy: Never
  2. 重要そうなパラメータ

    parallelism:Jobの並列実行数
     1度しか動かないJobでは意味がないが、2回うごくJobの場合並列で実行される

    completions:Jobの成功回数
     Jobの成功回数を指定、例えば2を指定した場合2回実行される

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

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

    kubectl apply -f job.yaml

    実行結果を確認

    ※ポットが作成され、実行されていることを確認
     再実行時は一度Jobを削除する必要がある

Smallitのサービス