이 가이드에서는 Google Kubernetes Engine(GKE)에 예약된 자동 확장 처리를 배포하여 비용을 줄이는 방법을 설명합니다. 이러한 유형의 자동 확장 처리는 요일 또는 시간에 따라 클러스터를 확장하거나 축소합니다. 예약된 자동 확장 처리는 트래픽에 예측 가능한 ebb 및 흐름이 있는 경우(예: 지역 소매업체이거나 업무 시간이 하루 중 특정 시간으로 제한된 직원용 소프트웨어일 경우)에 유용합니다.
이 튜토리얼은 트래픽이 급증하기 전에 클러스터를 안정적으로 수직 확장하고, 야간이나 주말에 또는 온라인 사용자가 적은 다른 시간에 클러스터를 다시 축소하여 비용을 절감하려는 개발자와 운영자를 위한 것입니다. 이 문서는 사용자가 Docker, Kubernetes, Kubernetes CronJob, GKE 및 Linux에 익숙하다고 가정합니다.
소개
많은 애플리케이션이 균일하지 않은 트래픽 패턴을 경험합니다. 예를 들어 조직의 작업자는 낮 동안에만 애플리케이션에 참여할 수 있습니다. 따라서 해당 애플리케이션의 데이터 센터 서버는 야간에 유휴 상태입니다.
Google Cloud는 다른 이점 외에도 트래픽 부하에 따라 인프라를 동적으로 할당하여 비용을 절약할 수 있습니다. 일부 경우에는 단순한 자동 확장 구성으로 불균등한 트래픽의 할당 문제를 해결할 수 있습니다. 이 경우 계속 유지하세요. 하지만 다른 경우에 트래픽 패턴의 급격한 변화가 있으면 수직 확장 중에 시스템 불안정을 방지하고 클러스터를 과도하게 프로비저닝하지 않도록 더욱 정교하게 조정된 자동 확장 구성이 필요합니다.
이 튜토리얼에서는 트래픽 패턴의 급격한 변화를 잘 이해하고 있는 시나리오에 초점을 맞추고 있으며 자동 확장 처리기에 인프라가 곧 급증할 것이라는 힌트를 주고자 합니다. 이 문서에서는 아침에 새 환경의 GKE 클러스터를 확장하고 밤에는 축소하는 방법을 보여 주지만 비슷한 접근법을 사용하여 피크 확장 이벤트, 광고 캠페인, 주말 트래픽 등의 모든 알려진 이벤트를 위한 용량을 늘리거나 줄일 수 있습니다.
약정 사용 할인이 있는 경우 클러스터 축소
이 튜토리얼에서는 사용량이 적은 시간 동안 GKE 클러스터를 최소로 축소하여 비용을 줄이는 방법을 설명합니다. 그러나 약정 사용 할인을 구매한 경우 자동 확장과 함께 이러한 할인이 작동하는 방식을 이해하는 것이 중요합니다.
약정 사용 계약은 일정량의 리소스 (vCPU, 메모리 등)를 지불하기로 약정할 경우 대폭 할인된 가격을 제공합니다. 그러나 약정할 리소스 양을 결정하려면 워크로드가 시간이 지남에 따라 사용하는 리소스의 수를 사전에 알아야 합니다. 비용 절감을 돕기 위해 다음 다이어그램은 계획에 포함해야할 리소스와 포함하지 말아야 하는 리소스를 보여줍니다.
다이어그램에 표시된 것처럼 약정 사용 계약에 따른 리소스 할당은 고정적입니다. 계약이 적용되는 리소스는 약정한 만큼 소비하기 위해 대부분의 시간동안 사용중이어야 합니다. 따라서 약정된 리소스를 계산할 때 사용량이 급증하는 동안 사용된 리소스는 포함하면 안됩니다. 리소스가 급증하는 경우 GKE 자동 확장 처리 옵션을 사용하는 것이 좋습니다. 이러한 옵션에는 이 문서에서 설명하는 예약된 자동 확장 처리와 다른 관리형 옵션이 포함됩니다.
이미 일정량의 리소스에 대한 약정 사용 계약이 있는 경우 이 최소 한도 미만으로 클러스터를 축소해도 비용을 줄일 수 없습니다. 이러한 시나리오에서는 컴퓨팅 수요가 적은 기간 동안 격차를 채울 수 있도록 일부 작업을 예약하는 것이 좋습니다.
아키텍처
다음 다이어그램은 이 튜토리얼에서 배포하는 인프라와 예약된 자동 확장 처리의 아키텍처를 보여줍니다. 예약된 자동 확장 처리는 일정에 따라 확장을 관리하기 위해 함께 작동하는 일련의 구성요소로 이루어집니다.
이 아키텍처에서 Kubernetes CronJobs 집합은 트래픽 패턴에 대한 알려진 정보를 Cloud Monitoring 커스텀 측정항목으로 내보냅니다. 그런 다음 이 데이터는 Kubernetes 수평형 포드 자동 확장 처리(HPA)에서 HPA가 워크로드를 확장해야 할 시점에 관한 입력으로 읽혀집니다. 대상 CPU 사용률과 같은 다른 부하 측정항목과 함께 HPA는 특정 배포의 복제본을 확장하는 방법을 결정합니다.
목표
- GKE 클러스터를 만듭니다.
- Kubernetes HPA를 사용하는 예시 애플리케이션을 배포합니다.
- 예약된 자동 확장 처리의 구성요소를 설정하고 예약된 커스텀 측정항목에서 읽을 수 있도록 HPA를 업데이트합니다.
- 예약된 austoscaler가 제대로 작동하지 않을 때 트리거되는 알림을 설정합니다.
- 애플리케이션에 대한 부하를 생성합니다.
- HPA가 일반적인 트래픽 증가 및 사용자가 구성한 예약된 커스텀 측정항목에 응답하는 방식을 살펴보세요.
이 튜토리얼의 코드는 GitHub 저장소에 있습니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the GKE, Artifact Registry and the Cloud Monitoring APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the GKE, Artifact Registry and the Cloud Monitoring APIs.
개발 환경 준비
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Cloud Shell에서 Google Cloud 프로젝트 ID, 이메일 주소 및 컴퓨팅 영역과 리전을 구성합니다.
PROJECT_ID=YOUR_PROJECT_ID ALERT_EMAIL=YOUR_EMAIL_ADDRESS gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1 gcloud config set compute/zone us-central1-f
다음을 바꿉니다.
YOUR_PROJECT_ID
: 사용 중인 프로젝트의 Google Cloud 프로젝트 이름입니다.YOUR_EMAIL_ADDRESS
: 예약된 자동 확장 처리가 제대로 작동하지 않을 때 알림을 받을 이메일 주소입니다.
원하는 경우 이 튜토리얼의 다른 리전과 영역을 선택할 수 있습니다.
kubernetes-engine-samples
GitHub 저장소를 클론합니다.git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/ cd kubernetes-engine-samples/cost-optimization/gke-scheduled-autoscaler
이 예시의 코드는 다음 폴더에 구성됩니다.
- 루트: CronJob에서 커스텀 측정항목을 Cloud Monitoring으로 내보내는 데 사용하는 코드를 포함합니다.
k8s/
: Kubernetes HPA가 있는 배포 예시를 포함합니다.k8s/scheduled-autoscaler/
: 커스텀 측정항목에서 읽을 커스텀 측정항목 및 HPA의 업데이트된 버전을 내보내는 CronJob을 포함합니다.k8s/load-generator/
: 시간당 사용량을 시뮬레이션하는 애플리케이션이 있는 Kubernetes 배포를 포함합니다.monitoring/
: 이 튜토리얼에서 구성하는 Cloud Monitoring 구성요소를 포함합니다.
GKE 클러스터 만들기
Cloud Shell에서 예약된 자동 확장 처리를 실행하기 위한 GKE 클러스터를 만듭니다.
gcloud container clusters create scheduled-autoscaler \ --enable-ip-alias \ --release-channel=stable \ --machine-type=e2-standard-2 \ --enable-autoscaling --min-nodes=1 --max-nodes=10 \ --num-nodes=1 \ --autoscaling-profile=optimize-utilization
출력은 다음과 비슷합니다.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS scheduled-autoscaler us-central1-f 1.22.15-gke.100 34.69.187.253 e2-standard-2 1.22.15-gke.100 1 RUNNING
프로덕션 구성이 아니지만 이 튜토리얼에 적합한 구성입니다. 이 설정에서는 최소 1개 노드와 최대 10개의 노드로 클러스터 자동 확장 처리를 구성합니다. 또한
optimize-utilization
프로필을 사용 설정하여 축소 프로세스의 속도를 높입니다.
예시 애플리케이션 배포
예약된 자동 확장 처리 없이 예시 애플리케이션을 배포합니다.
kubectl apply -f ./k8s
k8s/hpa-example.yaml
파일을 엽니다.다음 목록은 파일의 콘텐츠를 보여줍니다.
최소 복제본 수 (
minReplicas
)는 10으로 설정됩니다. 또한 이 구성은 CPU 사용률(name: cpu
및type: Utilization
설정)에 따라 확장되도록 클러스터를 설정합니다.애플리케이션을 사용할 수 있을 때까지 기다립니다.
kubectl wait --for=condition=available --timeout=600s deployment/php-apache EXTERNAL_IP='' while [ -z $EXTERNAL_IP ] do EXTERNAL_IP=$(kubectl get svc php-apache -o jsonpath={.status.loadBalancer.ingress[0].ip}) [ -z $EXTERNAL_IP ] && sleep 10 done curl -w '\n' http://$EXTERNAL_IP
애플리케이션을 사용할 수 있는 경우 출력은 다음과 같습니다.
OK!
설정을 확인합니다.
kubectl get hpa php-apache
출력은 다음과 비슷합니다.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 9%/60% 10 20 10 6d19h
REPLICAS
열에는hpa-example.yaml
파일의minReplicas
필드 값과 일치하는10
가 표시됩니다.노드 수가 4로 증가되었는지 확인합니다.
kubectl get nodes
출력은 다음과 비슷합니다.
NAME STATUS ROLES AGE VERSION gke-scheduled-autoscaler-default-pool-64c02c0b-9kbt Ready <none> 21S v1.17.9-gke.1504 gke-scheduled-autoscaler-default-pool-64c02c0b-ghfr Ready <none> 21s v1.17.9-gke.1504 gke-scheduled-autoscaler-default-pool-64c02c0b-gvl9 Ready <none> 21s v1.17.9-gke.1504 gke-scheduled-autoscaler-default-pool-64c02c0b-t9sr Ready <none> 21s v1.17.9-gke.1504
클러스터를 만들 때
min-nodes=1
플래그를 사용하여 최소 구성을 설정합니다. 그러나hpa-example.yaml
파일의minReplicas
이 10으로 설정되기 때문에 이 절차 시작 시 배포한 애플리케이션은 추가 인프라를 요청합니다.minReplicas
를 10과 같은 값으로 설정하는 것은 소매업체와 같은 회사에서 공통적으로 사용하는 전략으로, 영업일 처음 몇 시간 후에 트래픽이 갑자기 증가할 것으로 예상됩니다. 그러나 HPAminReplicas
에 높은 값을 설정하면 애플리케이션 트래픽이 낮은 야간에도 클러스터를 줄일 수 없으므로 비용이 증가할 수 있습니다.
예약된 자동 확장 처리 설정
Cloud Shell에서 GKE 클러스터에 커스텀 측정항목 - Cloud Monitoring 어댑터를 설치합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml kubectl wait --for=condition=available --timeout=600s deployment/custom-metrics-stackdriver-adapter -n custom-metrics
이 어댑터는 Cloud Monitoring 커스텀 측정항목을 기반으로 포드 자동 확장을 사용 설정합니다.
Artifact Registry에서 저장소를 만들고 읽기 권한을 부여합니다.
gcloud artifacts repositories create gke-scheduled-autoscaler \ --repository-format=docker --location=us-central1 gcloud auth configure-docker us-central1-docker.pkg.dev gcloud artifacts repositories add-iam-policy-binding gke-scheduled-autoscaler \ --location=us-central1 --member=allUsers --role=roles/artifactregistry.reader
커스텀 측정항목 내보내기 코드를 빌드하고 푸시합니다.
docker build -t us-central1-docker.pkg.dev/$PROJECT_ID/gke-scheduled-autoscaler/custom-metric-exporter . docker push us-central1-docker.pkg.dev/$PROJECT_ID/gke-scheduled-autoscaler/custom-metric-exporter
커스텀 측정항목을 내보내는 CronJob을 배포하고 이러한 커스텀 측정항목에서 읽는 HPA의 업데이트된 버전을 배포합니다.
sed -i.bak s/PROJECT_ID/$PROJECT_ID/g ./k8s/scheduled-autoscaler/scheduled-autoscale-example.yaml kubectl apply -f ./k8s/scheduled-autoscaler
k8s/scheduled-autoscaler/scheduled-autoscale-example.yaml
파일을 열고 검사합니다.다음 목록은 파일의 콘텐츠를 보여줍니다.
이 구성은 CronJob이 하루 중 시간을 기준으로 추천 pod 복제본 수를
custom.googleapis.com/scheduled_autoscaler_example
이라는 커스텀 측정항목으로 내보내도록 지정합니다. 이 튜토리얼의 모니터링 섹션을 용이하게 하기 위해 일정 필드 구성은 시간별 수직 확장 및 축소를 정의합니다. 프로덕션의 경우 이 일정을 비즈니스 요구에 맞게 맞춤설정할 수 있습니다.k8s/scheduled-autoscaler/hpa-example.yaml
파일을 열고 검사합니다.다음 목록은 파일의 콘텐츠를 보여줍니다.
이 구성은 HPA 객체가 이전에 배포된 HPA를 대체해야 함을 지정합니다. 이 구성은
minReplicas
의 값을 1로 줄입니다. 즉, 워크로드는 최소로 축소될 수 있습니다. 구성은 외부 측정항목(type: External
)도 추가합니다. 이렇게 하면 자동 확장이 두 가지 요소에 의해 트리거됩니다.이러한 다중 측정항목 시나리오에서 HPA는 각 측정항목에 대해 제안된 복제본 수를 계산한 다음 가장 높은 값을 반환하는 측정항목을 선택합니다. 이 내용을 이해하는 것이 중요합니다.예약된 자동 확장 처리가 주어진 시점에서 pod 수가 1이어야 한다고 제안할 수 있습니다. 그러나 하나의 pod에 대해 실제 CPU 사용률이 예상보다 높은 경우 HPA는 더 많은 복제본을 만듭니다.
각 명령어를 다시 실행하여 노드 및 HPA 복제본 수를 다시 확인합니다.
kubectl get nodes kubectl get hpa php-apache
표시되는 결과는 예약된 자동 확장 처리가 최근에 수행한 작업에 따라 달라집니다. 특히
minReplicas
와nodes
값은 확장 주기에서 각기 다른 시점에 각기 다른 값이 됩니다.예를 들어 매시간마다 약 51분에서 60분 (최대 트래픽 기간을 나타냄)은
minReplicas
의 HPA 값이 10이고nodes
값은 4가 됩니다.반면 1분에서 50분 (트래픽이 더 적은 기간을 나타냄)의 경우 할당 혹은 제거된 pod수에 따라서 HPA
minReplicas
값은 1,nodes
값은 1 또는 2가 됩니다. 더 낮은 값 (1분에서 50분)에서는 클러스터가 축소를 완료하는 데 최대 10분이 걸릴 수 있습니다.
예약된 자동 확장 처리가 제대로 작동하지 않을 때 알림 구성
프로덕션 환경에서는 일반적으로 CronJob이 커스텀 측정항목을 채울 수 없는 경우를 알고자 합니다. 이를 위해 5분 동안 custom.googleapis.com/scheduled_autoscaler_example
스트림이 전송되지 않을 때 트리거되는 알림을 만들 수 있습니다.
Cloud Shell에서 알림 채널을 만듭니다.
gcloud beta monitoring channels create \ --display-name="Scheduled Autoscaler team (Primary)" \ --description="Primary contact method for the Scheduled Autoscaler team lead" \ --type=email \ --channel-labels=email_address=${ALERT_EMAIL}
출력은 다음과 비슷합니다.
Created notification channel NOTIFICATION_CHANNEL_ID.
이 명령어는 튜토리얼 단계를 단순화하기 위해
email
유형의 알림 채널을 만듭니다. 프로덕션 환경에서는 알림 채널을sms
또는pagerduty
으로 설정하여 비동기 전략을 더 적게 사용하는 것이 좋습니다.NOTIFICATION_CHANNEL_ID
자리표시자에 표시된 값이 있는 변수를 설정합니다.NOTIFICATION_CHANNEL_ID=NOTIFICATION_CHANNEL_ID
알림 정책을 배포합니다.
gcloud alpha monitoring policies create \ --policy-from-file=./monitoring/alert-policy.yaml \ --notification-channels=$NOTIFICATION_CHANNEL_ID
alert-policy.yaml
파일에는 5분 후에 측정항목이 없는 경우 알림을 보내는 사양이 포함됩니다.Cloud Monitoring 알림 페이지로 이동하여 알림 정책을 확인합니다.
예약된 자동 확장 처리 정책을 클릭하고 알림 정책의 세부정보를 확인합니다.
예시 애플리케이션에 대한 부하 생성
Cloud Shell에서 부하 생성기를 배포합니다.
kubectl apply -f ./k8s/load-generator
다음 목록은
load-generator
스크립트를 보여줍니다.command: ["/bin/sh", "-c"] args: - while true; do RESP=$(wget -q -O- http://php-apache.default.svc.cluster.local); echo "$(date +%H)=$RESP"; sleep $(date +%H | awk '{ print "s("$0"/3*a(1))*0.5+0.5" }' | bc -l); done;
이 스크립트는
load-generator
배포를 삭제할 때까지 클러스터에서 실행됩니다. 몇 밀리초 간격으로php-apache
서비스에 요청이 전송됩니다.sleep
명령어는 하루 동안 부하 분산 변경사항을 시뮬레이션합니다. 이 방법으로 트래픽을 생성하는 스크립트를 사용하면 HPA 구성에서 CPU 사용률 및 커스텀 측정항목을 조합할 때 어떻게 되는지 이해할 수 있습니다.
트래픽 또는 예약된 측정항목에 따라 확장 시각화
이 섹션에서는 확장 및 축소의 효과를 보여주는 시각화를 검토합니다.
Cloud Shell에서 새 대시보드를 만듭니다.
gcloud monitoring dashboards create \ --config-from-file=./monitoring/dashboard.yaml
Cloud Monitoring 대시보드 페이지로 이동합니다.
예약된 자동 확장 처리 대시보드를 클릭합니다.
대시보드에 세 개의 그래프가 표시됩니다. 수직 확장 및 축소의 역학관계를 확인하고 하루 동안 다양한 부하 분산이 자동 확장에 미치는 영향을 확인하려면 최소 2시간(이상적으로 24시간 이상)을 기다려야 합니다.
그래프가 표시되는 바를 이해할 수 있도록 다음 그래프를 확인하면 하루 전체 보기를 확인할 수 있습니다.
예약된 측정항목 (원하는 pod 수)에는 예약된 자동 확장 처리 설정에서 사용자가 구성한 CronJob을 통해 Cloud Monitoring으로 내보내는 커스텀 측정항목의 시계열이 표시됩니다.
CPU 사용률 (요청과 사용 비교)은 요청된 CPU (빨간색) 및 실제 CPU 사용률 (파란색)의 시계열을 보여줍니다. 부하가 낮으면 HPA는 예약된 자동 확장 처리에서 사용률 결정을 고려합니다. 하지만 트래픽이 증가하면 오후 12시부터 오후 6시 사이에 데이터 포인트를 볼 수 있으므로 HPA는 필요에 따라 pod 수를 늘립니다.
pod 수 (예약과 실제 비교) + 평균 CPU 사용률은 이전 pod와 유사한 뷰를 표시합니다. pod 수 (빨간색)는 예약된대로 매시간 10으로 증가합니다. pod 수는 부하에 반응하여 시간이 지남에 따라 자연스럽게 증가하고 감소합니다 (오후 12시 및 오후 6시). 평균 CPU 사용률 (주황색)은 설정된 타겟 (60%) 아래로 유지됩니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
다음 단계
- Google Cloud 아키텍처 프레임워크: 비용 최적화에서 Google Cloud 워크로드 비용을 최적화하기 위한 설계 추천과 권장사항을 찾아봅니다.
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항을 살펴봅니다. Cloud 아키텍처 센터 살펴보기