GCP 인스턴스 그룹 설정
GCP에서는 비관리형 인스턴스 그룹과 관리형 인스턴스 그룹, 이렇게 두 가지 인스턴스 그룹을 생성할 수 있다.
https://cloud.google.com/compute/docs/instance-groups
Compute Engine은 관리형 및 비관리형이라는 두 가지 VM 인스턴스 그룹을 제공합니다.
관리형 인스턴스 그룹(MIG)을 사용하면 동일한 여러 VM에서 앱을 운영할 수 있습니다. 자동 확장, 자동 복구, 리전(멀티 영역) 배포, 자동 업데이트 등의 자동화된 MIG 서비스를 활용하여 워크로드의 확장성 및 가용성을 높일 수 있습니다.
비관리형 인스턴스 그룹을 사용하면 직접 관리하는 여러 VM에서 부하 분산을 수행할 수 있습니다.
비관리형 인스턴스 그룹 - https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-unmanaged-instances
관리형 인스턴스 그룹 - https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-managed-instances
둘의 차이점은 말 그대로 관리형이냐 아니냐의 차이로 비관리형의 경우 이미 존재하는 인스턴스들의 그룹화만이 목적이지만 관리형 인스턴스 그룹의 경우 자동 복구, 부하 분산, 자동 확장, 자동 업데이트, 스테이트풀 워크로드 등의 다양한 목적을 위해 사용될 수 있다.
WEB 용 관리형 인스턴스 그룹(MIG) 생성
# 인스턴스 템플릿 생성
REGION="asia-northeast3"
HOST_PROJECT="sample-gw-shared-vpc"
SUBNET="sample-gw-web-ne3-dev-subnet"
GCP_TEMPLATE="gw-web-template-1"
TAGS="webserver"
project="sample-gw-dev-324106"
sa_for_web="sample-web-general-sa"
web_image=`gcloud compute images list --filter=name:sample-gw-web-ubuntu-2004-focal --uri | awk -Fimages/ '{ print $2 }'`
WEB_IMAGE_PROJECT="sample-gw-dev-324106"
gcloud beta compute instance-templates create $GCP_TEMPLATE \
--machine-type=e2-medium \
--network-interface=subnet=projects/$HOST_PROJECT/regions/$REGION/subnetworks/$SUBNET \
--image=$web_image \
--image-project=$WEB_IMAGE_PROJECT \
--boot-disk-size=10GB \
--boot-disk-type=pd-balanced \
--boot-disk-device-name=$GCP_TEMPLATE \
--reservation-affinity=any \
--no-address \
--tags=$TAGS
https://cloud.google.com/sdk/gcloud/reference/beta/compute/instance-templates/create
비관리형 인스턴스 그룹과는 다르게 관리형 인스턴스 그룹은 상황에 따라 기존에 생성되어 있는 VM Instance와 똑같은 VM Instance를 생성해야하기 때문에 이미 생성된 인스턴스 그룹화하는 대신 인스턴스 템플릿을 사용한다.
인스턴스 템플릿 자체가 앞으로 생성할 인스턴스를 미리 정의 해놓은 것과 같아서 템플릿 생성 시 필요한 정보와 인스턴스 생성 시 필요한 정보가 거의 같다.
# health-checks 생성
gcloud compute health-checks create http http-basic-check \
--request-path=/workcheck \
--check-interval=30s \
--port 80
https://cloud.google.com/sdk/gcloud/reference/beta/compute/health-checks/create/http
Health Check는 인스턴스의 상태를 확인하며 자동 복구에 사용된다. 상태는 --request-path에 지정된 리소스로 --check-interval에 지정된 초마다 요청을 보내는데 기본값은 200을 반환하면 정상으로 인식한다. 이 부분은 커스텀 가능하다.
# 관리형 인스턴스 그룹 생성
gcloud beta compute --project=sample-gw-dev-324106 instance-groups managed create lb-web-instance-group \
--base-instance-name=gw-web-dev \
--template=gw-web-template-1 \
--size=1 \
--zone=asia-northeast3-a \
--health-check=http-basic-check \
--initial-delay=300
https://cloud.google.com/sdk/gcloud/reference/beta/compute/instance-groups/managed/create
관리형 인스턴스 그룹을 생성한다. --base-instance-name 옵션은 인스턴스가 자동으로 생성될 때 접두사가 될 이름을 지정한다. 만약에 위처럼 gw-web-dev로 지정하게 되면 인스턴스 이름은 gw-web-dev-<랜덤 문자열> 형식이 된다. --size 옵션은 초기 인스턴스 개수를 지정한다. --initial-delay 옵션은 인스턴스가 정상이지 않더라도 자동 복구하지 않고 대기하는 시간이다.
자동복구 기능을 사용하기 위해서는 자동 복구 용 health-check를 생성해 인스턴스 그룹에 지정해주기만 하면 된다.
MIG 중 Compute Engine과 관련된 모든 작업은 Google API 서비스 에이전트를 통해 진행 되는데, 이 서비스 에이전트는 이메일로 식별가능한 서비스 계정으로 제공된다. 기본적으로 이 계정은 편집자 역할을 가지고 있기 때문에 신경쓰지 않아도 되지만 최소 권한을 유지하기 위해 역할을 편집해야 한다면 MIG에서는 다음과 같은 역할을 요구한다.
roles/compute.instanceAdmin.v1
roles/iam.serviceAccountUser
만약 MIG가 다른 프로젝트의 네트워크(예를들면 shared-vpc)에 인스턴스를 생성해야 한다고 하면 Google API 서비스 에이전트 계정에게 shared-vpc 프로젝트 내 위 두 역할을 부여해주면 된다. 자세한 내용은 아래 문서 참고.
https://cloud.google.com/compute/docs/access/service-accounts#google_apis_service_agent
MIG 사용시 다른 프로젝트의 비공개 이미지를 사용하게 될 수도 있는데, 이 경우 Google API 서비스 에이전트 계정에게 이미지가 속한 프로젝트 내 roles/compute.imageUser 역할을 부여해주면 된다.
https://cloud.google.com/sdk/gcloud/reference/beta/compute/instance-groups/managed/set-autoscaling
관리형 인스턴스 그룹에 오토스케일링을 지정한다. --cool-down-period 옵션은 인스턴스가 새로 생성되고 난뒤 이 인스턴스에 대한 정보를 수집하기전에 대기하는 시간이다. 위 경우 60으로 되어있으므로 새로운 인스턴스가 생성되더라도 60초 동안은 이 인스턴스에 대한 정보를 수집하지 않는다. --max-num-replicas, --min-num-replicas는 각각 최대 인스턴스 개수, 최소 인스턴스 개수이다.--mode 옵션은 오토스케일링 모드를 설정한다. on이면 인스턴스 추가/감소를 둘 다 사용한다는 뜻이며, 감소는 허용하지 않고 증가만 허용하는 옵션도 존재한다. --target-cpu-utilization 옵션은 오토스케일링의 기준이 되는 사용량으로 0.6이면 cpu 사용량 60% 기준으로 인스턴스를 추가, 감소하겠다는 뜻이 된다.
오토스케일링의 경우 기본적으로 위처럼 cpu 사용량에 따라 인스턴스를 추가, 삭제하지만 시간대 별로 추가하고 삭제할 수도 있다. 위 옵션들은 업무시간(9시 ~ 18시) 동안 인스턴스 수를 2개 이상으로 유지하겠다고 설정한 것인데 옵션별 설명은 아래와 같다.
–-set-schedule : 일정 이름을 지정한다. 중요한 것은 이 옵션 없이 다른 일정 옵션만 추가해도 명령어는 정상적으로 실행된다. 하지만 이 경우 오토스케일링은 생성되지만 일정은 생성되지 않는다.
--schedule-cron : 분 시 일 월 요일 순으로 입력한다. 위 경우는 매 월(1)-금(5) 오전 9시에 반복한다는 것을 의미한다.
cron 작성법 -https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules
--schedule-min-required-replicas : 업무시간 동안 최소 몇개의 인스턴스를 유지할 것인지 설정한다. 원래는 1~3개의 인스턴스 수를 유지하지만 이 값을 2로 지정했으므로 9시 ~ 18시 까지는 2~3개의 인스턴스를 유지하게 된다..
–-schedule-duration-sec : 위 일정을 유지하는 시간이다. 오전 9시에 일정을 시작해서 얼마나 유지할 것인지 초단위로 설정한다. 위 경우는 9시간동안 유지할 것이므로 32400(60 * 60 * 9)초로 설정한 것이다.
--schedule-time-zone : timezone을 설정한다. 기본 값은 UTC로 꼭 설정을 해줘야한다.
timezone 목록 - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones