Trong bài viết trước DS Solution Vietnam đã giới thiệu Cách tạo và chạy một web app trên GKE. Trong bài viết này, DS Solution Vietnam sẽ tiếp tục gửi tới bạn đọc cách tạo và chạy batch job trên GKE

Tóm lược các bước thực hiện

  • Trước tiên sẽ tạo một batch job thông thường.
  • Sau đó build thành docker image
  • Push Docker image lên GCP container registry
  • Deploy image từ Container Registry lên GKE

1. Tạo một batch job đơn giản

Sẽ sử dụng golang trong nội dung bài viết này. Và viết một module đơn giản giả lập cho job.

Cấu trúc thư mục như sau

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/dssolution/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
}

Chạy thử job trên local

cd path_to_simplejob
go run job/simplejob.go --run-time=5
Tạo một batch job đơn giản trên GKE

2. Build Docker Image

Chuẩn bị nội dung Dockerfile như bên dưới

simplejob.Dockerfile

FROM golang:1.12 as build_env

WORKDIR /go/src/github.com/dssolution/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/dssolution/gke/simplejob /job

Tiến hành build Docker image

# chú ý cần khởi động Docker trước khi build
cd path_to_simplejob

# build docker image with tag name
docker build -t ds-gke-simplejob:lasters -f simplejob.Dockerfile .

# checke image after build
docker images
> REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
> ds-gke-simplejob                              lasters             d7fb8721594f        24 seconds ago      8.02MB

3. Push Docker image lên GCP Container Registry

Yêu cầu: đã biết cách dùng gcloud command để tương tác với GCP.

# login then set working project
gcloud auth login
gcloud config set project [PROJECT_ID]

# Configured Docker to use gcloud as a credential
gcloud auth configure-docker

# Tag the local image with the registry name 
# 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

# check image tag
docker images
> REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
> asia.gcr.io/ds-project/ds-gke-simplejob       latest              d7fb8721594f        3 minutes ago       8.02MB

# Push Docker image to Container Registry
# docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
docker push asia.gcr.io/ds-project/ds-gke-simplewebapp

Sau đó kiểm tra hình ảnh trên Container Registry.

Kiểm tra hình ảnh trên Container Registry

4. Deploy job and run on GKE

# tạo cluster trong 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

Nội dung file config deployment như dưới.

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

Nội dung config này sẽ run job đã được build trong ds-gke-simplejob image với input run-time là 10s.

# install k8s control tool
gcloud components install kubectl
kubectl version

# get credentials để truy cập cluster
gcloud container clusters get-credentials --zone asia-northeast1-b ds-gke-small-cluster

# deploy web app image to GKE
kubectl apply -f simplejob.deployment.yaml

Check kết quả trong GKE

Check log output của job.

Đây chỉ à một job giả lập đơn giản. Vậy đối với những job thực tế chúng ta cần nhận kết quả output từ job. Hoặc từ job cần truy cập đến các service bên ngoài, thì các giải quyết thế nào?

Các vấn đề trên sẽ lần lượt được DS Solution Vietnam giới thiệu ở các bài tiếp.

Nội dung hướng dẫn kết thúc ở đây. Cảm ơn bạn đã đọc! Hãy liên hệ tới chúng tôi để nhận tư vấn chi tiết, hướng dẫn cách chuyển đổi sang các nền tảng điện toán đám mây GCP, AWS, IBM, hybrid cloud và cách xây dựng các ứng dụng cloud-native.