手順のまとめ
・バッチジョブ作成
・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 橋本