GKE上にバッチジョブを稼働させる方法

手順のまとめ

・バッチジョブ作成
・Dockerイメージのビルド
・GCP Container RegistryにDockerイメージをプッシュ
・Container RegistryからGKEにデプロイ

1. バッチジョブ作成

まずgo言語を使って、簡単なバッチジョブを作成します。

ジョブフォルダの構成
simplejob
├── README.md
├── go.mod
├── job
│   ├── handler
│   │   └── simplejob_handler.go
│   └── simplejob.go
├── simplejob.Dockerfile
└── simplejob.deployment.yaml
simplejob.go
package main

import (
	"context"
	"log"

	"github.com/itdevsamurai/gke/simplejob/job/handler"
)

func main() {
	log.Println("Job Started.")

	ctx := context.Background()
	handler.SimpleJobHandler{}.Run(ctx)

	log.Println("Job Finished.")
}
simplejob_handler.go
package handler

import (
	"context"
	"flag"
	"log"
	"os/exec"
)

type SimpleJobHandler struct {
}

func (j SimpleJobHandler) Run(ctx context.Context) error {
	log.Println("Processing ...")

	runTime := getArguments()
	cmd := exec.Command("sleep", runTime)
	err := cmd.Run()
	if err != nil {
		log.Printf("Error at command: %v", cmd)
		return err
	}

	log.Println("Process completed.")
	return nil
}

func getArguments() string {
	runTime := flag.String("run-time", "", "specify number of seconds to run job")
	flag.Parse()
	return *runTime
}

このバッチジョブはインプットパラメータで稼働時間(何秒か)を指定する。

ローカルで稼働させてみる
cd path_to_simplejob
go run job/simplejob.go --run-time=5

2. Dockerイメージのビルド

Dockerfileを準備

simplejob.Dockerfile
FROM golang:1.12 as build_env

WORKDIR /go/src/github.com/itdevsamurai/gke/simplejob

COPY ./job ./job
COPY go.mod ./

ENV PATH="${PATH}:$GOPATH/bin"
ENV GO111MODULE=on

RUN export GOPROXY="https://proxy.golang.org" && export GO111MODULE=on && CGO_ENABLED=0 go build -o simplejob job/simplejob.go

FROM alpine:latest
WORKDIR /app
COPY --from=build_env /go/src/github.com/itdevsamurai/gke/simplejob /job
Dockerイメージをビルドする
# ockerを事前に起動する必要は注意
cd path_to_simplejob

# tag名付きDockerイメージをビルド
docker build -t ds-gke-simplejob:lasters -f simplejob.Dockerfile .

# ビルド後の確認
docker images
> REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
> ds-gke-simplejob                              lasters             d7fb8721594f        24 seconds ago      8.02MB

3. GCP Container RegistryにDockerイメージをプッシュ

前提: GCPとgcloudコマンドを利用経験がある。

# ログイン、とワーキングProjectを設定
# ログイン、とワーキングProjectを設定
gcloud auth login
gcloud config set project [PROJECT_ID]

# ロカルDockerはGCPにアクセスするため、GCPのcredentialを設定
gcloud auth configure-docker

# ロカルイメージをレポジトリのタグ名を付ける
# docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
docker images
> REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
> ds-gke-simplejob                              lasters             d7fb8721594f        24 seconds ago      8.02MB

docker tag d7fb8721594f asia.gcr.io/ds-project/ds-gke-simplejob:latest

# タグ名の確認
docker images
> REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
> asia.gcr.io/ds-project/ds-gke-simplejob       latest              d7fb8721594f        3 minutes ago       8.02MB

# DockerイメージをContainer Registryにプッシュ
# docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
docker push asia.gcr.io/ds-project/ds-gke-simplejob

Container Registry上にイメージを確認

4. Container RegistryからGKEにデプロイ

# GKEのクラスタを作成
gcloud container clusters create ds-gke-small-cluster \
	--project ds-project \
	--zone asia-northeast1-b \
	--machine-type n1-standard-1 \
	--num-nodes 1 \
	--enable-stackdriver-kubernetes

デプロイメント定義ファイルを準備する。

simplejob.deployment.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: ds-gke-simplejob
spec:
  template:
    metadata:
      name: ds-gke-simplejob
    spec:
      containers:
      - name: ds-gke-simplejob-container
        image: asia.gcr.io/ds-project/ds-gke-simplejob
        command: ["/job/simplejob"]
        args: ["--run-time", "10"]
      restartPolicy: Never

このデプロイメント定義ファイルは、ds-gke-simplejobのDockerイメージを使って、Kubernetesジョブをデプロイする。インプットパラメータで稼働時間は10秒に指定。

GKEにデプロイ
# k8sコントロールツールをインストール(事前にインストールされたらこのをスキップ)
gcloud components install kubectl
kubectl version

# GKEのクラスタにアクセスするため、credentialsを設定
gcloud container clusters get-credentials --zone asia-northeast1-b ds-gke-small-cluster

# GKEにバッチジョブをデップロイ
kubectl apply -f simplejob.deployment.yaml

デプロイ後、結果確認

Load Balancing

稼働ログの確認

本記事の利用ソースコードはこちら

https://github.com/itdevsamurai/gke/tree/master/simplewebapp

今回は簡単なジョブをご紹介致しましたが、実際の条件はその他にもあります。

デプロイ方法について、Cloud buildを利用すると一部の作業をまとめできて楽です。

また、ジョブの複雑なインプットや処理結果のアウトプットはどうやって渡すことができるか?取得することができるか?次の記事でドンドン紹介したいと思ってます。

最後まで読んで頂き、どうも有難う御座います。!

DevSamurai 橋本

弊社はGoogle Cloud Platform (GCP)のパートナーとして、製品導入やクラウドに移行、アーキテクチャ設計、システム開発などのサービスを提供しております。