이 튜토리얼에서는 다음 측정항목 중 하나를 기준으로 자동 확장을 설정할 수 있습니다.
CPU
CPU 사용률
노드 간 CPU 사용률을 기준으로 확장합니다. 이는 비용 효율적이며 CPU 리소스 사용률을 극대화할 수 있습니다. 그러나 CPU 사용량은 후행 측정항목이므로 확장이 진행되는 동안 사용자에게 지연이 발생할 수 있습니다.
Pub/Sub
Pub/Sub 백로그
Pub/Sub 구독에 남아 있는 확인되지 않은 메시지 수를 보고하는 외부 측정항목을 기준으로 확장합니다. 이렇게 하면 문제가 발생하기 전에 지연 시간을 효과적으로 줄일 수 있지만, CPU 사용률에 따라 자동 확장보다 리소스를 상대적으로 많이 사용할 수 있습니다.
커스텀 측정항목
커스텀 Prometheus 측정항목
Google 관리형 Prometheus를 통해 Prometheus 형식으로 내보낸 커스텀 사용자 정의 측정항목을 기준으로 확장합니다. Prometheus 측정항목은 Gauge 유형이어야 합니다.
자동 확장은 기본적으로 비용과 지연 시간 사이에서 허용되는 균형을 찾는 것입니다. 이러한 측정항목 및 기타 측정항목의 조합을 실험하여 자신에게 맞는 정책을 찾을 수 있습니다.
목표
이 튜토리얼에서는 다음 작업을 다룹니다.- 커스텀 측정항목 어댑터 배포 방법
- 애플리케이션 코드 내에서 측정항목을 내보내는 방법
- Cloud Monitoring 인터페이스에서 측정항목을 보는 방법
- HorizontalPodAutoscaler(HPA) 리소스를 배포하여 Cloud Monitoring 측정항목을 기준으로 애플리케이션을 확장하는 방법
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.- Google Cloud 콘솔에서 Kubernetes Engine 페이지로 이동합니다.
- 프로젝트를 만들거나 선택합니다.
- API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
이 튜토리얼에서 사용하는 gcloud
및 kubectl
명령줄 도구가 사전 설치되어 있는 Cloud Shell을 사용하여 이 튜토리얼의 내용을 따라 할 수 있습니다. Cloud Shell을 사용하는 경우 이러한 명령줄 도구를 워크스테이션에 설치할 필요가 없습니다.
Cloud Shell을 사용하려면 다음 안내를 따르세요.
- Google Cloud 콘솔로 이동합니다.
Google Cloud 콘솔 창 상단의 Cloud Shell 활성화 버튼을 클릭합니다.
Google Cloud 콘솔 하단의 새로운 프레임에서 Cloud Shell 세션이 열리고 명령줄 프롬프트가 표시됩니다.
환경 설정
Google Cloud CLI의 기본 영역을 설정합니다.
gcloud config set compute/zone zone
다음을 바꿉니다.
zone
: 가장 가까운 영역을 선택합니다. 자세한 내용은 리전 및 영역을 참조하세요.
PROJECT_ID
및PROJECT_NUMBER
환경 변수를 Google Cloud 프로젝트 ID 및 프로젝트 번호로 설정합니다.export PROJECT_ID=project-id export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'get(projectNumber)')
Google Cloud CLI의 기본 영역을 설정합니다.
gcloud config set project $PROJECT_ID
GKE 클러스터를 만듭니다.
Google Cloud 서비스에 액세스할 때 보안을 강화하려면 클러스터에서 GKE용 워크로드 아이덴티티 제휴를 사용 설정하는 것이 좋습니다. 이 페이지에는 기존 방법을 사용하는 예시(GKE용 워크로드 아이덴티티 제휴 사용 중지)가 포함되어 있지만, 이 기능을 사용 설정하면 보호 기능이 개선됩니다.
워크로드 아이덴티티
GKE용 워크로드 아이덴티티 제휴가 사용 설정된 클러스터를 만들려면 다음 명령어를 실행합니다.
gcloud container clusters create metrics-autoscaling --workload-pool=$PROJECT_ID.svc.id.goog
기존 인증
GKE용 워크로드 아이덴티티 제휴가 사용 중지된 클러스터를 만들려면 다음 명령어를 실행합니다.
gcloud container clusters create metrics-autoscaling
커스텀 측정항목 어댑터 배포
커스텀 측정항목 어댑터를 사용하면 클러스터에서 Cloud Monitoring을 통해 측정항목을 보내고 받을 수 있습니다.
CPU
해당 사항 없음: 수평형 포드 자동 확장 처리는 기본적으로 CPU 사용률에 따라 확장될 수 있으므로 커스텀 측정항목 어댑터가 필요하지 않습니다.
Pub/Sub
GKE용 워크로드 아이덴티티 제휴를 사용 설정한 클러스터와 사용 중지한 클러스터는 커스텀 측정항목 어댑터를 설치하는 절차가 서로 다릅니다. 클러스터를 만들 때 선택한 설정과 일치하는 옵션을 선택합니다.
워크로드 아이덴티티
사용자에게 필수 승인 역할을 만들 수 있는 권한을 부여합니다.
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
클러스터에 커스텀 측정항목 어댑터를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
어댑터는 custom-metrics
네임스페이스에서 custom-metrics-stackdriver-adapter
Kubernetes 서비스 계정을 사용합니다. Monitoring 뷰어 역할을 할당하여 이 서비스 계정이 Cloud Monitoring 측정항목을 읽을 수 있게 합니다.
gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
--role roles/monitoring.viewer \
--member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter
기존 인증
사용자에게 필수 승인 역할을 만들 수 있는 권한을 부여합니다.
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
클러스터에 커스텀 측정항목 어댑터를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
커스텀 측정항목
GKE용 워크로드 아이덴티티 제휴를 사용 설정한 클러스터와 사용 중지한 클러스터는 커스텀 측정항목 어댑터를 설치하는 절차가 서로 다릅니다. 클러스터를 만들 때 선택한 설정과 일치하는 옵션을 선택합니다.
워크로드 아이덴티티
사용자에게 필수 승인 역할을 만들 수 있는 권한을 부여합니다.
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
클러스터에 커스텀 측정항목 어댑터를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
어댑터는 custom-metrics
네임스페이스에서 custom-metrics-stackdriver-adapter
Kubernetes 서비스 계정을 사용합니다. Monitoring 뷰어 역할을 할당하여 이 서비스 계정이 Cloud Monitoring 측정항목을 읽을 수 있게 합니다.
gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
--role roles/monitoring.viewer \
--member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter
기존 인증
사용자에게 필수 승인 역할을 만들 수 있는 권한을 부여합니다.
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole cluster-admin --user "$(gcloud config get-value account)"
클러스터에 커스텀 측정항목 어댑터를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
측정항목으로 애플리케이션 배포
이 튜토리얼의 애플리케이션 코드가 포함된 저장소를 다운로드합니다.
CPU
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/quickstarts/hello-app
Pub/Sub
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/databases/cloud-pubsub
커스텀 측정항목
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/observability/custom-metrics-autoscaling/google-managed-prometheus
저장소에는 Cloud Monitoring으로 측정항목을 내보내는 코드가 포함되어 있습니다.
CPU
이 애플리케이션은 8080
포트의 모든 웹 요청에 대해 'Hello, world!'라고 응답합니다. Compute Engine CPU 측정항목은 Cloud Monitoring에서 자동으로 수집됩니다.
Pub/Sub
이 애플리케이션은 새 메시지의 Pub/Sub 구독을 폴링하여 메시지가 도착하면 이를 확인합니다. Pub/Sub 구독 측정항목은 Cloud Monitoring에서 자동으로 수집됩니다.
커스텀 측정항목
이 애플리케이션은 /metrics
경로에 대한 모든 웹 요청에 대해 Prometheus 형식을 사용하여 상수 값 측정항목으로 응답합니다.
저장소에는 애플리케이션을 클러스터에 배포하기 위한 Kubernetes 매니페스트도 포함됩니다.
CPU
Pub/Sub
GKE용 워크로드 아이덴티티 제휴를 사용 설정한 클러스터와 사용 중지한 클러스터는 매니페스트가 서로 다릅니다. 클러스터를 만들 때 선택한 설정과 일치하는 옵션을 선택합니다.
워크로드 아이덴티티
기존 인증
커스텀 측정항목
Google Cloud Managed Service for Prometheus에서는 PodMonitoring 리소스를 사용하여 Prometheus 측정항목을 Cloud Monitoring으로 내보냅니다.
애플리케이션을 클러스터에 배포합니다.
CPU
kubectl apply -f manifests/helloweb-deployment.yaml
Pub/Sub
GKE용 워크로드 아이덴티티 제휴를 사용 설정한 클러스터와 사용 중지한 클러스터는 애플리케이션을 배포하는 절차가 서로 다릅니다. 클러스터를 만들 때 선택한 설정과 일치하는 옵션을 선택합니다.
워크로드 아이덴티티
프로젝트에서 Pub/Sub API를 사용 설정합니다.
gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
Pub/Sub 주제 및 구독을 만듭니다.
gcloud pubsub topics create echo gcloud pubsub subscriptions create echo-read --topic=echo
애플리케이션을 클러스터에 배포합니다.
kubectl apply -f deployment/pubsub-with-workload-identity.yaml
이 애플리케이션은
pubsub-sa
Kubernetes 서비스 계정을 정의합니다. 애플리케이션에서 메시지를 Pub/Sub 주제에 게시할 수 있도록 Pub/Sub 구독자 역할을 애플리케이션에 할당합니다.gcloud projects add-iam-policy-binding projects/jmfran-gke-dev \ --role=roles/pubsub.subscriber \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/default/sa/pubsub-sa
기존 인증
프로젝트에서 Pub/Sub API를 사용 설정합니다.
gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com
Pub/Sub 주제 및 구독을 만듭니다.
gcloud pubsub topics create echo gcloud pubsub subscriptions create echo-read --topic=echo
Pub/Sub에 액세스할 수 있는 서비스 계정을 만듭니다.
gcloud iam service-accounts create autoscaling-pubsub-sa gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber"
서비스 계정 키 파일을 다운로드합니다.
gcloud iam service-accounts keys create key.json \ --iam-account autoscaling-pubsub-sa@$PROJECT_ID.iam.gserviceaccount.com
서비스 계정 키를 클러스터에 보안 비밀로 가져옵니다.
kubectl create secret generic pubsub-key --from-file=key.json=./key.json
애플리케이션을 클러스터에 배포합니다.
kubectl apply -f deployment/pubsub-with-secret.yaml
커스텀 측정항목
kubectl apply -f custom-metrics-gmp.yaml
애플리케이션이 배포될 때까지 잠시 기다리면 모든 포드가 Ready
상태에 도달합니다.
CPU
kubectl get pods
출력:
NAME READY STATUS RESTARTS AGE
helloweb-7f7f7474fc-hzcdq 1/1 Running 0 10s
Pub/Sub
kubectl get pods
출력:
NAME READY STATUS RESTARTS AGE
pubsub-8cd995d7c-bdhqz 1/1 Running 0 58s
커스텀 측정항목
kubectl get pods
출력:
NAME READY STATUS RESTARTS AGE
custom-metrics-gmp-865dffdff9-x2cg9 1/1 Running 0 49s
Cloud Monitoring에서 측정항목 보기
애플리케이션이 실행되면 측정항목이 Cloud Monitoring에 기록됩니다.
측정항목 탐색기를 사용하여 모니터링 리소스의 측정항목을 확인하려면 다음을 수행하세요.
-
Google Cloud 콘솔에서 leaderboard 측정항목 탐색기 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Monitoring인 결과를 선택합니다.
- 측정항목 요소에서 측정항목 선택 메뉴를 펼친 후 리소스 유형 및 측정항목 유형을 선택합니다. 예를 들어 가상 머신의 CPU 사용률을 차트로 표시하려면 다음 안내를 따르세요.
- (선택사항) 메뉴의 옵션을 줄이려면 필터 표시줄에서 측정항목 이름의 일부를 입력합니다. 이 예시에서는
utilization
을 입력합니다. - 활성 리소스 메뉴에서 VM 인스턴스를 선택합니다.
- 활성 측정항목 카테고리 메뉴에서 인스턴스를 선택합니다.
- 활성 측정항목 메뉴에서 CPU 사용량을 선택한 후 적용을 클릭합니다.
- (선택사항) 메뉴의 옵션을 줄이려면 필터 표시줄에서 측정항목 이름의 일부를 입력합니다. 이 예시에서는
표시할 시계열을 필터링하려면 필터 요소를 사용합니다.
시계열을 조합하려면 집계 요소의 메뉴를 사용합니다. 예를 들어 VM의 CPU 사용률을 영역에 따라 표시하려면 첫 번째 메뉴를 평균으로, 두 번째 메뉴를 영역으로 설정합니다.
집계 요소의 첫 번째 메뉴가 집계되지 않음으로 설정되면 모든 시계열이 표시됩니다. 집계 요소 기본 설정은 선택한 측정항목 유형에 따라 결정됩니다.
리소스 유형과 측정항목은 다음과 같습니다.
CPU
리소스 유형: gce_instance
측정항목: compute.googleapis.com/instance/cpu/utilization
Pub/Sub
리소스 유형: pubsub_subscription
측정항목: pubsub.googleapis.com/subscription/num_undelivered_messages
커스텀 측정항목
리소스 유형: prometheus_target
측정항목: prometheus.googleapis.com/custom_prometheus/gauge
HorizontalPodAutoscaler 객체 만들기
Cloud Monitoring에 측정항목이 표시되면 HorizontalPodAutoscaler
를 배포하여 측정항목에 따라 배포 크기를 조절할 수 있습니다.
CPU
Pub/Sub
커스텀 측정항목
HorizontalPodAutoscaler
를 클러스터에 배포합니다.
CPU
kubectl apply -f manifests/helloweb-hpa.yaml
Pub/Sub
kubectl apply -f deployment/pubsub-hpa.yaml
커스텀 측정항목
kubectl apply -f custom-metrics-gmp-hpa.yaml
부하 생성
일부 측정항목의 경우 자동 확장을 보기 위해 부하를 생성해야 할 수 있습니다.
CPU
helloweb
서버에 대한 요청 10,000개를 시뮬레이션합니다.
kubectl exec -it deployments/helloweb -- /bin/sh -c \
"for i in $(seq -s' ' 1 10000); do wget -q -O- localhost:8080; done"
Pub/Sub
Pub/Sub 주제에 메시지 200개를 게시합니다.
for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done
커스텀 측정항목
해당 사항 없음: 이 샘플에 사용된 코드는 커스텀 측정항목의 상수 값 40
을 내보냅니다. HorizontalPodAutoscaler는 대상 값 20
으로 설정되므로 배포를 자동으로 확장하려고 시도합니다.
HorizontalPodAutoscaler 확장 관찰
다음 명령어를 실행하여 배포의 현재 복제본 수를 확인할 수 있습니다.
kubectl get deployments
측정항목이 전파될 때까지 약간의 시간이 지나면 배포에서 백로그를 처리할 수 있는 포드 5개가 생성됩니다.
다음 명령어를 실행하여 HorizontalPodAutoscaler의 상태와 최근 활동도 검사할 수 있습니다.
kubectl describe hpa
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트는 유지하되 개별 리소스를 삭제하세요.
CPU
GKE 클러스터를 삭제합니다.
gcloud container clusters delete metrics-autoscaling
Pub/Sub
Pub/Sub 구독 및 주제를 삭제합니다.
gcloud pubsub subscriptions delete echo-read gcloud pubsub topics delete echo
GKE 클러스터를 삭제합니다.
gcloud container clusters delete metrics-autoscaling
커스텀 측정항목
GKE 클러스터를 삭제합니다.
gcloud container clusters delete metrics-autoscaling
다음 단계
워크로드 확장을 위한 커스텀 및 외부 측정항목 자세히 알아보기
다른 Kubernetes Engine 튜토리얼 살펴보기