Print
카테고리: [ Cloud Computing & MSA ]
조회수: 82020

1. 개요

Cloud 환경을 사용하다보면 비용에 압박에 시달리게 된다.

일과시간에만 자원을 기동시켜라 등의 요구사항을 받게되고

한두개일 경우 손으로 끄고말지만, 점점 자원이 늘어나게 되고, 하루라도 깜빡하는 순간 다음날 뿜어져나온 비용에 당황하는 경우가 적지않다.

스크립트 등을 만들어 스케쥴을 걸어두는 방법을 주로 애용한다.

GCP의 경우 Cloud Function으로 동작할 작업을 만들고, Cloud Scheduler를 이용하여 스케쥴을 걸며 Pub/sub등을 이용해야한다.

처음 접할경우.. RESTAPI니,,,뭐니복잡하다, 

 

그러하여 편하게 할 방법을 궁리해보니

최소 Spec의 VM을 해당 GCP환경에 만들고 늘 써오던 bash shell script와 Google에서 제공하는 gcloud command를 이용하여 작업을 만든 후, crontab을 이용하여 기동시키는 것이다.

 

자 일단 GKE를 종료하기 위해 KubernetesEngine 메뉴에 들어왔다.

종료가 없다?!!!

 

Google Engineer피셜 Master Node는 무료이고, Worker Node수 기반으로 비용이 발생하기에, Worker Node수를 0으로 변경하면 비용이 발생하지 않는다고 한다.

 

간단하다. GKE 종료는 Worker node수를 0으로 변경하면 되며, 기동은 Worker node의 수를 원래대로 바꾸면된다.

사전에 kubectl이 설치되어 있어야 한다.

snap install kubectl --classic


<종료 스크립트> /script/gke-stop.sh

  1. GKE권한을 받아온다.
  2. GKE Worker Node수를 0으로 바꾼다.
  3. 0으로 변경된 것 체크
#!/bin/bash
#### 1, 권한받아오기
####Kubernetes Engine메뉴에서 연결을 누르면 나오는 커맨드를 이용한다.
####NAT Gateway등이 없는 폐쇄망 환경일 경우 --internal-ip 옵션을 추가한다.
####Zonal cluster일경우 --zone옵션을, Region Cluster일경우 --region옵션을 사용한다. 이 스크립트틑 zonal이다.
#######################################
gcloud container clusters get-credentials [GKE엔진자원명] --zone [GKE엔진이 생성된 zone] --project [GCP 프로젝트명]
#######################################
##### 사족 : 꺼지는 시간을 로그로 남기기 위한 함수
##### log "test"로 쉘에서 호출시
##### [2020.05.12][23:29:52] test
##### 로 STDOUT출력된다.
###############################################
function log{
   now = "[$(date +%Y).$(date +%m).$(date +%d)][$(date +%H):$(date +%M):$(date +%S)]"
   echo $new' > '&amp;1
}
###############################################
 
##### 2, GKE Worker Node수 0으로 변경
##### crontab을 사용하기위해선 command의 절대경로를 사용해야한다. gcloud의 절대경로인 /snap/bin/gcloud를 사용한다.
##### EOF를 사용한건 resize 명령어의 경우 기동 후 실제실행할지 y/n을 입력해주어야 한다. y를 입력하기위해 << EOF를 사용한다(EOF대신 다른걸 써도된다.)
###############################################
/snap/bin/gcloud container clusters resize [GKE엔진자원명] --num-nodes=0 --node-pool [GKE NODE POOL이름] << EOF
y
EOF
 
###############################################
 
##### 3. 종료 체크
##### 10초간격으로 node숫자를 체크해서 0이되면 종료된 시간을 출력
###############################################
while [ 1 ]
do
  num=`/snap/bin/kubectl get nodes | grep gke | wc -l`
  if [ $num -eq 0 ]
  then
    log "Node stop"
    break
  fi
  sleep 10
done
###############################################
 

<기동 스크립트> - /script/gke-start.sh

  1. GKE권한을 받아온다.
  2. GKE Worker Node수를 원하는 수로으로 바꾼다.
  3. READY상태 체크
#!/bin/bash
 
#### 1, 권한받아오기
#######################################
gcloud container clusters get-credentials [GKE엔진자원명] --zone [GKE엔진이 생성된 zone] --project [GCP 프로젝트명]
#######################################
 
function log{
   now = "[$(date +%Y).$(date +%m).$(date +%d)][$(date +%H):$(date +%M):$(date +%S)]"
   echo $new' > '&amp;1
}
 
#######################################
 
##### 2, GKE Worker Node수 원래대로 변경
###############################################
 
/snap/bin/gcloud container clusters resize [GKE엔진자원명] --num-nodes=[원래노드수] --node-pool [GKE NODE POOL이름] << EOF
y
EOF
 
###############################################
 
##### 3. 기동 체크
##### 10초간격으로 node 상태가 READY인 node수를 체크해서 기존 노드수가 되면 기동된 시간을 출력
###############################################
 
while [ 1 ]
do
  num=`/snap/bin/kubectl get nodes | grep READY | wc -l`
  if [ $num -eq [노드수] ]
  then
    log "Node start"
    break
  fi
  sleep 10
done
###############################################

<crontab>

crontab -e

명령어를 이용하여 수정한다.

월-금 18시에 종료스크립트가 수행되며 202005폴더하위에 stop.log.202000512 로 스크립트 수행 로그가 저장된다.

월-금 9시에 기동스크립트가 수행되며 202005폴더하위에 start.log.202000512 로 스크립트 수행 로그가 저장된다.

0 18 * * 1-5 /script/gke-stop.sh >> /log/$(date +\%Y\%m)/stop.log.$(date +\%Y\%m\%d) 2>&1
0 9 * * 1-5 /script/gke-start.sh >> /log/$(date +\%Y\%m)/start.log.$(date +\%Y\%m\%d) 2>&1