- クラウド技術
Kubernetes CronJobでJavaのバッチ処理を動かす
- #Kubernetes
目次
目的
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
社内でバッチ処理をkubernetes(以下K8S)で動作したい要望が
あったため、Jobの実行方法について記載します。
前提
・K8Sが構築済みであること
・K8Sダッシュボードが使用可能であること
・dockerがイントール済みであること
・Amazon Elastic Container Registry(以下ECR)が使用可能であること
事前準備
コンソールに「Hello K8S Job!」と表示するだけのJavaバッチを
dockerで作成する。
以下はdockerがイントール済みの端末で行う
【1】Javaバッチを作成する。
ソース格納用ディレクトリを作成する。
1 |
1mkdir src |
格納ディレクトリにJavaバッチクラスを作成する。
作成ファイル:src/Main.java
1 2 3 4 5 |
public class Main { public static void main(String[] args) { System.out.println("Hello K8S Job!"); } } |
【2】dockerファイルを作成する。
javaファイルをコンパイルして実行するDockerfileを作成する。
作成ファイル:Dockerfile
1 2 3 4 5 6 |
FROM openjdk:8-jdk-alpine COPY src /src RUN javac /src/Main.java WORKDIR /src CMD ["java","Main"] |
【3】dockerファイルをビルドする。
Dockerfileを作成した場所で以下コマンドを実行しdockerビルドを行う
1 |
1docker build -t java-batch . |
【4】ECRにdockerイメージをプッシュする
※今回は利便上「ECR」を使用しているが
K8Sから参照できるdockerリポジトリであれば
特に「ECR」である必要はない
・ECRログイン
1 |
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イメージにタグを付ける
1 |
1docker tag java-batch:latest xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr:java-batch |
※「xxxx」と「test-ecr」各環境の設定に変更する
・ECRにプッシュする
1 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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ファイルを実行する
1 |
1kubectl apply -f cron-job.yaml |
設定した時刻に実行結果を確認します
※ポットが作成され、実行されていることを確認
ぜひ参考にしてみてください!
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>