본문 바로가기

DevOps/GCP

[GKE/K8S] GKE 생성, Spring batch job 실행(Cloud Shell 사용)

* 배치 잡을 GKE 파드 생성해서 돌리기 위한 여정 중🏃‍♀️

 

TODO

이제 이미지를 배포했으니 쿠버네티스에서 spring batch job을 실행해야 한다.

  • VPC, Subnet 생성
  • Cloud SQL 접근을 위한 Cloud NAT 게이트웨이 생성
  • 비공개 클러스터 생성

 

 

VPC, Subnet 생성

default vpc가 있지만 개발 환경에 따라 네트워크를 분리하고, NAT 게이트웨이를 적용하기 위해 VPC, Subnet을 새로 생성했다.

  • vpc 생성
gcloud compute networks create VPC_NAME \
    --subnet-mode custom
  • 서브넷 생성

IP 범위는 공식 문서에 있는대로 했다.

gcloud compute networks subnets create SUBNET_NAME \
   --network VPC_NAME \
   --region asia-northeast3 \
   --range 192.168.1.0/24

 

 

비공개 클러스터 생성

클러스터 생성 시 아래 사항을 설정해야 한다.

  • Artifact Registry image pull 권한이 있는 서비스 계정을 설정해주기

위 설정을 해주지 않으면 ImagePullBackOff 오류가 뜬다. 

 

비공개 클러스터를 생성하는데 엔드포인트를 제어할 수 있는 구성 세가지 있는데 편리한 사용을 위해 열린 교회 닫힘 느낌으로 공개 엔드포인트 액세스 사용 설정했다.

공개 엔드포인트 액세스 중지로 구성했더니, kubectl 사용 시 timeout이 났고, 클러스터 접근을 위한 bastion host VM이 추가로 필요할 것 같아서 사용하지 않았다.

 

  • 최종 클러스터 생성 gcloud
gcloud beta container --project PROJECT_NAME clusters create CLUSTER_NAME \
--zone "asia-northeast3-a" \
--no-enable-basic-auth \
--cluster-version "1.27.3-gke.100" \
--release-channel "regular" \
--machine-type "e2-medium" \
--image-type "COS_CONTAINERD" \
--disk-type "pd-balanced" \
--disk-size "100" \
--metadata disable-legacy-endpoints=true \
--service-account "backend@datawarehouse-390004.iam.gserviceaccount.com" \
--num-nodes "3" \
--logging=SYSTEM,WORKLOAD \
--monitoring=SYSTEM \
--network "projects/PROJECT_NAME/global/networks/VPC_NAME" \
--subnetwork "projects/PROJECT_NAME/regions/asia-northeast3/subnetworks/SUBNET_NAME" \
--no-enable-intra-node-visibility \
--default-max-pods-per-node "110" \
--security-posture=standard \
--workload-vulnerability-scanning=disabled \
--addons HorizontalPodAutoscaling,HttpLoadBalancing,GcePersistentDiskCsiDriver \
--enable-autoupgrade \
--enable-autorepair \
--max-surge-upgrade 1 \
--max-unavailable-upgrade 0 \
--enable-managed-prometheus \
--enable-shielded-nodes \
--node-locations "asia-northeast3-a" \
--no-enable-master-authorized-networks \
--enable-ip-alias \
--enable-private-nodes \
--master-ipv4-cidr 172.16.0.32/28

 

 

Cloud NAT 구성

Cloud SQL은 public ip로 생성해두었지만, IP 제한을 해뒀기 때문에 매번 IP가 바뀌는 컨테이너의 아웃바운드 IP를 고정하여 DB 접속을할 수 있도록 Cloud NAT를 구성했다.

  • 외부 고정 IP 생성
gcloud compute addresses create STATIC_IP_NAME --region=asia-northeast3
  • cloud router 생성
gcloud compute routers create ROUTER_NAME \
    --network VPC_NAME \
    --region asia-northeast3
  • cloud nat 생성
gcloud compute routers nats create NAT_NAME \
--router-region asia-northeast3 \
--router VPC_NAME \
--nat-external-ip-pool=STATIC_NAME \
--nat-custom-subnet-ip-ranges=SUBNET_NAME
  • cloud sql 고정 IP 제한 추가

 

 

클러스터에 NAT 게이트웨이 설정 확인하는 법

클러스터에 debug 컨테이너를 생성하고 아웃바운드 IP를 확인해서 고정 IP가 나오면 NAT 게이트웨이가 잘 설정됐다고 볼 수 있다.

kubectl run -i --tty debug --image=busybox --restart=Never -- sh
wget -qO- ifconfig.me

 

 

Batch Job 실행 YAML 작성

batch-dev.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-dev
spec:
  backoffLimit: 0
  ttlSecondsAfterFinished : 60
  template:
    spec:
      containers:
        - name: spring-batch
          image: asia-northeast3-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:latest
          env:
            - name: JOB_NAME
              value: "#####UpdateJob"
            - name: SPRING_PROFILES_ACTIVE
              value: "dev"
      restartPolicy: Never
  • ttlSecondsAfterFinished: 60  => job complete 60초 후 job 자동 제거
  • backoffLimit: 0 => Job 재시작 안 함
  • restartPolicy: Never => Pod 재시작 안 함(backoffLimit 설정만으로도 되지만 명시적으로 작성해줌)
kubectl apply -f batch-dev.yaml

job이 28초에 종료되었고 60초 뒤에 job이 제거된 것 확인 완료

 

 

실패 기록

  • Artifact Registry 접근을 위해 클러스터 서비스 계정 설정 없이 클러스터 scope 설정, 서비스계정의 키 시크릿 등록 등등 해봤지만 실패함
  • GKE에서 Cloud SQL 접속을 위해서 Cloud SQL 인증 프록시 구성해서 DB 접속에 성공했지만, batch Job 종료 후 사이드카 패턴으로 구성된 프록시 컨테이너를 자동으로 종료하는 것에 실패함