이 튜토리얼 모음은 Google Kubernetes Engine(GKE)에서 실행되는 최신 애플리케이션 환경을 배포, 실행, 관리하려는 IT 관리자와 운영자를 대상으로 합니다. 이 튜토리얼 모음을 진행하면서 Cymbal Bank 샘플 마이크로서비스 애플리케이션을 사용하여 모니터링과 알림을 구성하고 워크로드를 확장하며 장애를 시뮬레이션하는 방법을 알아봅니다.
개요 및 목표
Cymbal Bank와 같은 소비자 애플리케이션은 때에 따라 사용자 수가 다른 경우가 많습니다. 조직에서 실제로 필요하지 않은 Cloud 리소스에 비용을 지출하지 않아도 웹사이트는 속도 저하나 다른 문제 없이 트래픽 급증을 처리할 수 있어야 합니다. 이를 위해 Google Cloud가 제공하는 솔루션은 자동 확장입니다.
이 튜토리얼에서는 기본 제공되는 Kubernetes 측정항목과 Cloud Monitoring 및 Cloud Trace의 커스텀 측정항목을 모두 사용하여 확장하도록 GKE 클러스터에 클러스터와 워크로드를 구성하는 방법을 알아봅니다. 다음 작업을 완료하는 방법을 알아봅니다.
- Cloud Monitoring에서 Trace용 커스텀 측정항목을 사용 설정합니다.
- 커스텀 측정항목을 사용하면 Kubernetes 클러스터 인식 이외의 추가 모니터링 데이터나 외부 입력(예: 네트워크 트래픽 또는 HTTP 응답 코드)을 사용하여 확장할 수 있습니다.
- 지정된 측정항목에 따라 워크로드의 포드 수를 자동으로 늘리거나 줄일 수 있는 GKE 기능인 수평형 포드 자동 확장 처리를 구성합니다.
- 애플리케이션 부하를 시뮬레이션하고 클러스터 자동 확장 처리 및 수평형 포드 자동 확장 처리의 응답을 확인합니다.
비용
이 튜토리얼 시리즈에서 GKE를 사용 설정하고 Cymbal Bank 샘플 애플리케이션을 배포하면 GKE를 중지하거나 프로젝트를 삭제할 때까지 가격 책정 페이지에 나열된 대로 Google Cloud에서 GKE 요금이 클러스터별로 청구됩니다.
Compute Engine VM 및 Trace 요금과 같이 Cymbal Bank 샘플 애플리케이션을 실행하는 동안 발생하는 기타 Google Cloud 비용도 사용자가 부담합니다.
시작하기 전에
배포를 확장하는 방법을 알아보려면 첫 번째 튜토리얼을 완료하여 Autopilot을 사용하는 GKE 클러스터를 만들고 Cymbal Bank 샘플 마이크로서비스 기반 애플리케이션을 배포해야 합니다.
확장 가능한 앱에 대한 이 튜토리얼 모음을 순서대로 완료하는 것이 좋습니다. 튜토리얼 모음을 진행하면서 새로운 기술을 배우고 추가적인 Google Cloud 제품 및 서비스를 사용하게 됩니다.
또한 IAM 서비스 계정을 만들고 수평형 포드 자동 확장 처리가 올바르게 작동하려면 일부 권한을 부여해야 합니다.
IAM 서비스 계정을 만듭니다. 이 서비스 계정은 튜토리얼에서 수평형 포드 자동 확장 처리가 수직 확장 또는 축소 시기를 결정할 수 있게 해주는 커스텀 측정항목에 액세스 권한을 부여하기 위해 사용됩니다.
gcloud iam service-accounts create scalable-apps
필요한 확장 작업을 수행하기 위해 IAM 서비스 계정에 액세스 권한을 부여합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
다음 액세스 권한은 IAM 서비스 계정에 부여됩니다.
roles/cloudtrace.agent
: 지연 시간 정보와 같은 추적 데이터를 Trace에 기록합니다.roles/monitoring.metricWriter
: Cloud Monitoring에 측정항목을 기록합니다.roles/iam.workloadIdentityUser
: Kubernetes 서비스 계정이 GKE용 워크로드 아이덴티티 제휴를 사용하여 IAM 서비스 계정으로 작동할 수 있게 허용합니다.
default
네임스페이스의default
Kubernetes 서비스 계정이 사용자가 만든 IAM 서비스 계정으로 작동하도록 구성합니다.kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
이 구성을 사용하면
default
네임스페이스의default
Kubernetes 서비스 계정을 사용하는 포드가 IAM 서비스 계정과 동일한 Google Cloud 리소스에 액세스할 수 있습니다.
커스텀 측정항목 수집 설정
기본 제공 Kubernetes CPU 및 메모리 측정항목을 사용하도록 수평형 포드 자동 확장 처리를 구성하거나 초당 HTTP 요청 수 또는 SELECT
문 수량과 같은 Cloud Monitoring의 커스텀 측정항목을 사용할 수 있습니다. 커스텀 측정항목은 애플리케이션 변경 없이 작동할 수 있으며 애플리케이션이 애플리케이션의 전체 성능과 니즈에 대한 더 많은 인사이트를 클러스터에 제공합니다. 이 튜토리얼에서는 기본 제공 측정항목과 커스텀 측정항목을 모두 사용하는 방법을 알아봅니다.
수평형 포드 자동 확장 처리가 Monitoring에서 커스텀 측정항목을 읽을 수 있게 하려면 클러스터에 커스텀 측정항목 - Stackdriver 어댑터를 설치해야 합니다.
커스텀 측정항목 Stackdriver 어댑터를 클러스터에 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Stackdriver 어댑터가 클러스터에서 커스텀 측정항목을 가져올 수 있게 하려면 GKE용 워크로드 아이덴티티 제휴를 사용합니다. 이 방법에서는 모니터링 측정항목을 읽을 수 있는 권한이 있는 IAM 서비스 계정을 사용합니다.
IAM 서비스 계정에
roles/monitoring.viewer
역할을 부여합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer
Stackdriver 어댑터에서 GKE용 워크로드 아이덴티티 제휴와 모니터링 측정항목을 읽을 수 있는 권한이 있는 IAM 서비스 계정을 사용하도록 구성합니다.
gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Kubernetes에는 클러스터 내에서 액세스할 수 있는 서비스 계정을 위한 자체 시스템이 있습니다. 애플리케이션이 Monitoring과 같이 Google Kubernetes Engine 클러스터 외부에 있는 서비스와 리소스에 인증하게 하려면 GKE용 워크로드 아이덴티티 제휴를 사용합니다. 이 접근 방법은 GKE에 IAM 서비스 계정을 사용하도록 Kubernetes 서비스 계정을 구성합니다.
어댑터에 사용되는 Kubernetes 서비스 계정에 주석을 추가합니다.
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
Stackdriver 어댑터 배포를 다시 시작하여 변경사항을 적용합니다.
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
수평형 포드 자동 확장 처리 구성
GKE Autopilot은 몇 가지 방식으로 확장할 수 있습니다. 이 튜토리얼에서는 다음 방법을 사용하여 클러스터를 확장하는 방법을 설명합니다.
- 수평형 포드 자동 확장 처리: 워크로드에 대해 포드 수를 확장합니다.
- 클러스터 자동 확장 처리: 클러스터에서 사용할 수 있는 노드 리소스를 확장합니다.
이 두 가지 방법이 함께 작동하여 애플리케이션의 포드 수가 변경되면 포드를 지원하는 노드 리소스도 변경됩니다.
수평형 포드 자동 확장 처리를 기반으로 빌드하는 포드를 확장하는 데 다른 구현을 사용할 수 있으며, 수직형 포드 자동 확장을 사용하여 포드 수 대신 포드의 CPU와 메모리 요청을 조정할 수도 있습니다.
이 튜토리얼에서는 기본 제공 측정항목을 사용하는 userservice
배포와 커스텀 측정항목을 사용하는 frontend
배포에 대한 수평형 포드 자동 확장 처리를 구성합니다.
자체 애플리케이션의 경우 애플리케이션 개발자 및 플랫폼 엔지니어와 협력하여 요구사항을 이해하고 수평형 포드 자동 확장 처리 규칙을 구성합니다.
userservice
배포 확장
Cymbal Bank 샘플 애플리케이션 사용자 수가 증가하면 userservice
서비스가 더 많은 CPU 리소스를 소비합니다. HorizontalPodAutoscaler
객체를 사용하여 애플리케이션이 로드에 응답하는 방법을 제어합니다. HorizontalPodAutoscaler
의 YAML 매니페스트에서 수평형 포드 자동 확장 처리에 사용할 배포, 모니터링할 측정항목, 실행할 최소 및 최대 복제본 수를 정의합니다.
userservice
배포에 대해HorizontalPodAutoscaler
샘플 매니페스트를 검토합니다.이 매니페스트는 다음을 수행합니다.
50
로 수직 확장하는 동안 최대 복제본 수를 설정합니다.5
로 수직 축소하는 동안 최소 복제본 수를 설정합니다.- 기본 제공되는 Kubernetes 측정항목을 사용하여 확장 결정을 수행합니다. 이 샘플에서 측정항목은 CPU 활용률이고 목표 활용률은 초과 활용률 및 미만 활용률을 모두 방지하는 60%입니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
frontend
배포 확장
이전 섹션에서는 CPU 사용률에 대한 기본 제공되는 Kubernetes 측정항목을 기반으로 userservice
배포에서 수평형 포드 자동 확장 처리를 구성했습니다. frontend
배포의 경우 수신되는 HTTP 요청 수에 따라 대신 확장할 수 있습니다. 이 방법에서는 Stackdriver 어댑터를 사용하여 HTTP(S) 부하 분산기 인그레스 객체에 대해 Monitoring에서 커스텀 측정항목을 읽습니다.
frontend
배포에 대해HorizontalPodAutoscaler
매니페스트를 검토합니다.이 매니페스트에는 다음 필드가 사용됩니다.
spec.scaleTargetRef
: 확장할 Kubernetes 리소스입니다.spec.minReplicas
: 이 샘플의 경우5
에 해당하는 최소 복제본 수입니다.spec.maxReplicas
: 이 샘플의 경우25
에 해당하는 최대 복제본 수입니다.spec.metrics.*
: 사용할 측정항목입니다. 이 샘플에서는 배포한 어댑터로 제공되는 Monitoring의 커스텀 측정항목인 초당 HTTP 요청 수입니다.spec.metrics.external.metric.selector.matchLabels
: 확장 시 필터링할 특정 리소스 라벨입니다.
frontend
인그레스 부하 분산기에서 전달 규칙의 이름을 찾습니다.export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
출력은 다음과 비슷합니다.
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
매니페스트에 전달 규칙을 추가합니다.
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
이 명령어는
FORWARDING_RULE_NAME
을 저장된 전달 규칙으로 바꿉니다.클러스터에 매니페스트를 적용합니다.
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
부하 시뮬레이션
이 섹션에서는 부하 생성기를 사용하여 트래픽 급증을 시뮬레이션하고 시간에 따라 부하 증가를 수용하기 위해 복제본 수 및 노드 수 수직 확장을 관찰합니다. 그런 후 트래픽 생성을 중지하고 응답에서 복제본 및 노드 수 축소를 관찰할 수 있습니다.
시작하기 전에 수평형 포드 자동 확장 처리 상태와 사용 중인 복제본 수를 확인합니다.
HorizontalPodAutoscaler
리소스 상태를 가져옵니다.kubectl get hpa
출력은 다음과 비슷합니다.
frontend
복제본 1개와userservice
복제본 5개가 있습니다.NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s userservice Deployment/userservice 0%/60% 5 50 5 4m56s
Cymbal Bank 샘플 애플리케이션에는
loadgenerator
서비스가 포함되어 있습니다. 이 서비스는 계속해서 사용자를 모방하는 요청을 프런트엔드로 전송하고 주기적으로 새 계정을 만들고 계정 간의 트랜잭션을 시뮬레이션합니다.loadgenerator
웹 인터페이스를 로컬로 노출합니다. 이 인터페이스를 사용하여 Cymbal Bank 샘플 애플리케이션의 부하를 시뮬레이션합니다.kubectl port-forward svc/loadgenerator 8080
오류 메시지가 표시되면 포드가 실행될 때 다시 시도합니다.
컴퓨터의 브라우저에서 부하 생성기 웹 인터페이스를 엽니다.
- 로컬 셸을 사용하는 경우 브라우저를 열고 http://127.0.0.1:8080으로 이동합니다.
- Cloud Shell을 사용하는 경우 웹 미리보기를 클릭한 후 포트 8080에서 미리보기를 클릭합니다.
부하 생성기 웹 인터페이스에서 실패 값에
100%
가 표시되면 다음 단계를 완료하여 테스트 설정을 업데이트합니다.- 실패율 카운터 옆에 있는 중지 버튼을 클릭합니다.
- 상태에서 새 테스트 옵션을 클릭합니다.
- 호스트 값을 Cymbal Bank 인그레스의 IP 주소로 업데이트합니다.
- 생성 시작을 클릭합니다.
부하 생성기 웹 인터페이스에서 차트 탭을 클릭하여 시간 경과에 따른 성능을 관측합니다. 요청 수와 리소스 사용률을 확인합니다.
새 터미널 창을 열고
frontend
및userservice
포드의 복제본 수를 확인합니다.kubectl get hpa -w
부하가 증가하면 복제본 수가 증가합니다. 클러스터가 구성된 측정항목이 정의된 기준점에 도달함을 인식하고 수평형 포드 자동 확장 처리를 사용하여 포드 수를 수직 확장하므로 scaleUp 작업은 약 10분 정도 걸릴 수 있습니다.
다음 출력 예시는 부하 생성기가 실행될 때 복제본 수가 증가했음을 보여줍니다.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
다른 터미널 창을 열고 클러스터에서 노드 수를 확인합니다.
gcloud container clusters list \ --filter='name=scalable-apps' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="REGION"
REGION
을 클러스터가 실행되는 리전으로 바꿉니다.새로운 복제본을 수용하기 위해 시작 수량에서 노드 수도 증가합니다. 이러한 노드 수 증가는 GKE Autopilot으로 구동됩니다. 이 노드 확장에는 구성할 것이 없습니다.
부하 생성기 인터페이스를 열고 중지를 클릭하여 테스트를 종료합니다.
복제본 수와 노드 수를 다시 확인하고 부하 감소에 따른 숫자 감소를 확인합니다. Kubernetes
HorizontalPodAutoscaler
리소스의 복제본에 대한 기본 안정화 기간이 5분이기 때문에 축소하는 데 시간이 약간 걸릴 수 있습니다.
실제 환경에서는 이 환경의 노드 수와 포드 수가 모두 시뮬레이션된 부하와 동일한 방식으로 자동으로 수직 확장 및 축소됩니다. Cymbal Bank 샘플 애플리케이션은 이러한 종류의 확장을 수용하도록 설계되었습니다. 앱 운영자와 사이트 안정성 엔지니어링(SRE) 또는 애플리케이션 개발자에게 문의하여 워크로드가 이러한 확장 기능을 활용할 수 있는지 확인하세요.
삭제
Cymbal Bank 튜토리얼 모음은 하나씩 순서대로 완료되도록 설계되었습니다. 튜토리얼 모음을 진행하면서 새로운 기술을 배우고 Google Cloud 추가 제품과 서비스를 사용하게 됩니다.
다음 튜토리얼로 이동하기 전에 잠시 멈추고 이 튜토리얼에서 사용한 리소스에 대한 비용이 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.
다음 단계
다음 튜토리얼에서 GKE에서 장애를 시뮬레이션하는 방법 알아보기