이 튜토리얼에서는 Google Kubernetes Engine(GKE)에서 규모에 맞게 고가용성 관계형 데이터베이스에서 지원되는 웹 애플리케이션을 실행하는 방법을 보여줍니다.
이 튜토리얼에 사용된 샘플 애플리케이션은 은행의 결제 처리 네트워크를 시뮬레이션하는 HTTP 기반 웹 애플리케이션인 Bank of Anthos입니다. Bank of Anthos는 여러 서비스를 사용하여 작동합니다. 이 튜토리얼은 Bank of Anthos 서비스를 지원하는 웹사이트 프런트엔드 및 관계형 PostgreSQL 데이터베이스에 중점을 두고 있습니다. 아키텍처 및 배포 서비스를 포함하여 Bank of Anthos에 대해 자세히 알아보려면 GitHub의 Bank of Anthos를 참조하세요.
목표
- GKE 클러스터를 만들고 구성합니다.
- 샘플 웹 애플리케이션 및 고가용성 PostgreSQL 데이터베이스를 배포합니다.
- 웹 애플리케이션 및 데이터베이스의 자동 확장을 구성합니다.
- 부하 생성기를 사용하여 트래픽 급증을 시뮬레이션합니다.
- 서비스 확장 및 축소 방법을 관찰합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Helm CLI를 설치합니다.
환경 준비
이 튜토리얼에 사용된 샘플 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git cd bank-of-anthos/
환경 변수를 설정합니다.
PROJECT_ID=PROJECT_ID GSA_NAME=bank-of-anthos GSA_EMAIL=bank-of-anthos@${PROJECT_ID}.iam.gserviceaccount.com KSA_NAME=default
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.
클러스터 및 서비스 계정 설정
클러스터 만들기:
gcloud container clusters create-auto bank-of-anthos --region=us-central1
클러스터를 시작하려면 최대 5분 정도 걸릴 수 있습니다.
IAM 서비스 계정을 만듭니다.
gcloud iam service-accounts create bank-of-anthos
IAM 서비스 계정에 대한 액세스 권한을 부여합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
이 단계에서는 다음 액세스 권한을 부여합니다.
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=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
이렇게 하면
default
네임스페이스의default
Kubernetes 서비스 계정을 사용하는 포드가 IAM 서비스 계정과 동일한 Google Cloud 리소스에 액세스할 수 있습니다.
Bank of Anthos 및 PostgreSQL 배포
이 섹션에서는 데이터베이스 서버 복제본을 자동 확장할 수 있도록 Bank of Anthos 및 PostgreSQL 데이터베이스를 고가용성(HA) 모드로 설치합니다. 이 섹션에 사용된 스크립트, Helm 차트, Kubernetes 매니페스트를 보려면 GitHub의 Bank of 저장소를 확인합니다.
데이터베이스 스키마 및 데이터 정의 언어(DDL) 스크립트를 배포합니다.
kubectl create configmap initdb \ --from-file=src/accounts/accounts-db/initdb/0-accounts-schema.sql \ --from-file=src/accounts/accounts-db/initdb/1-load-testdata.sql \ --from-file=src/ledger/ledger-db/initdb/0_init_tables.sql \ --from-file=src/ledger/ledger-db/initdb/1_create_transactions.sh
샘플 Helm 차트를 사용하여 PostgreSQL을 설치합니다.
helm repo add bitnami https://charts.bitnami.com/bitnami helm install accounts-db bitnami/postgresql-ha \ --version 10.0.1 \ --values extras/postgres-hpa/helm-postgres-ha/values.yaml \ --set="postgresql.initdbScriptsCM=initdb" \ --set="postgresql.replicaCount=1" \ --wait
이 명령어는 시작 복제본 수가 1인 PostgreSQL 클러스터를 만듭니다. 이 튜토리얼의 후반부에서는 들어오는 연결을 기반으로 클러스터를 확장합니다. 이 작업을 완료하려면 10분 정도 걸릴 수 있습니다.
Bank of Anthos를 배포합니다.
kubectl apply -f extras/jwt/jwt-secret.yaml kubectl apply -f extras/postgres-hpa/kubernetes-manifests
이 작업을 완료하려면 몇 분 정도 걸릴 수 있습니다.
체크포인트: 설정 검증
모든 Bank of Anthos 포드가 실행되는지 확인합니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS accounts-db-pgpool-57ffc9d685-c7xs8 3/3 Running accounts-db-postgresql-0 1/1 Running balancereader-57b59769f8-xvp5k 1/1 Running contacts-54f59bb669-mgsqc 1/1 Running frontend-6f7fdc5b65-h48rs 1/1 Running ledgerwriter-cd74db4cd-jdqql 1/1 Running pgpool-operator-5f678457cd-cwbhs 1/1 Running transactionhistory-5b9b56b5c6-sz9qz 1/1 Running userservice-f45b46b49-fj7vm 1/1 Running
웹사이트 프런트엔드에 액세스할 수 있는지 확인합니다.
frontend
서비스의 외부 IP 주소를 가져옵니다.kubectl get ingress frontend
출력은 다음과 비슷합니다.
NAME CLASS HOSTS ADDRESS PORTS AGE frontend <none> * 203.0.113.9 80 12m
브라우저에서 외부 IP 주소로 이동합니다. Bank of Anthos 로그인 페이지가 표시됩니다. 궁금하면 애플리케이션을 둘러봅니다.
404 오류가 발생하면 마이크로서비스가 프로비저닝되도록 몇 분 정도 기다린 후 다시 시도합니다.
웹 앱 및 PostgreSQL 데이터베이스 자동 확장
GKE Autopilot은 클러스터의 워크로드 수를 기반으로 클러스터 컴퓨팅 리소스를 자동 확장합니다. 리소스 측정항목을 기반으로 클러스터에서 포드 수를 자동으로 확장하려면 Kubernetes 수평형 포드 자동 확장을 구현해야 합니다. 기본 제공되는 Kubernetes CPU 및 메모리 측정항목을 사용하거나 초당 HTTP 요청 수 또는 Cloud Monitoring에서 가져온 SELECT 문 수량과 같은 커스텀 측정항목을 사용할 수 있습니다.
이 섹션에서는 다음과 같은 작업을 수행하게 됩니다.
- 기본 제공되는 측정항목 및 커스텀 측정항목을 사용하여 Bank of Anthos 마이크로서비스에 대해 수평형 포드 자동 확장을 구성할 수 있습니다.
- Bank of Anthos 애플리케이션 부하를 시뮬레이션하여 자동 확장 이벤트를 트리거합니다.
- 클러스터의 포드 및 노드 수가 부하에 따라 자동으로 확장 및 축소되는 방식을 관측합니다.
커스텀 측정항목 수집 설정
Monitoring에서 커스텀 측정항목을 읽으려면 클러스터에서 커스텀 측정항목 - Stackdriver 어댑터를 배포해야 합니다.
어댑터를 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
GKE용 워크로드 아이덴티티 제휴를 사용하여 측정항목을 가져오도록 어댑터를 구성합니다.
IAM 서비스 계정을 구성합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
어댑터에 사용되는 Kubernetes 서비스 계정에 주석을 추가합니다.
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
변경사항이 전파되도록 어댑터 배포를 다시 시작합니다.
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
데이터베이스의 자동 확장 구성
이 튜토리얼의 초반부에서 Bank of Anthos 및 PostgreSQL을 배포한 경우 모든 수신되는 SQL 문을 처리하도록 하나의 기본 읽기/쓰기 복제본이 있는 StatefulSet로 데이터베이스가 배포되었습니다. 이 섹션에서는 수신되는 SELECT 문을 처리하기 위해 새로운 대기 읽기 전용 복제본을 추가하도록 수평형 포드 자동 확장을 구성합니다. 각 복제본에서 부하를 줄이는 좋은 방법은 읽기 작업인 SELECT 문을 분산시키는 것입니다. PostgreSQL 배포에는 이러한 부하 분산을 달성하고 시스템 처리량을 향상시켜 주는 Pgpool-II
라는 도구가 포함되어 있습니다.
PostgreSQL은 SELECT 문 측정항목을 Prometheus 측정항목으로 내보냅니다.
prometheus-to-sd
라는 경량형 측정항목 내보내기 도구를 사용하여 이러한 측정항목을 지원되는 형식으로 Cloud Monitoring으로 전송합니다.
HorizontalPodAutoscaler
객체를 검토합니다.이 매니페스트는 다음을 수행합니다.
5
로 수직 확장하는 동안 최대 복제본 수를 설정합니다.1
로 수직 축소하는 동안 최소 복제본 수를 설정합니다.- 외부 측정항목을 사용하여 확장 결정을 수행합니다. 이 샘플에서 측정항목은 SELECT 문의 개수입니다. 들어오는 SELECT 문 수가 15를 초과하면 확장 이벤트가 발생합니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f extras/postgres-hpa/hpa/postgresql-hpa.yaml
웹 인터페이스의 자동 확장 구성
Bank of Anthos 및 PostgreSQL 배포에서 Bank of Anthos 웹 인터페이스를 배포했습니다. 사용자 수가 증가하면 userservice
서비스가 더 많은 CPU 리소스를 소비합니다. 이 섹션에서는 기존 포드가 요청된 CPU를 60% 넘게 사용하는 경우에는 userservice
배포에 대해 그리고 부하 분산기에 대해 들어오는 HTTP 요청 수가 초당 5개를 초과할 경우에는 frontend
배포에 대해 수평형 포드 자동 확장을 구성합니다.
사용자 서비스 배포에 대해 자동 확장 구성
userservice
배포에 대해HorizontalPodAutoscaler
매니페스트를 검토합니다.이 매니페스트는 다음을 수행합니다.
50
로 수직 확장하는 동안 최대 복제본 수를 설정합니다.5
로 수직 축소하는 동안 최소 복제본 수를 설정합니다.- 기본 제공되는 Kubernetes 측정항목을 사용하여 확장 결정을 수행합니다. 이 샘플에서 측정항목은 CPU 활용률이고 목표 활용률은 초과 활용률 및 미만 활용률을 모두 방지하는 60%입니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
프런트엔드 배포를 위한 자동 확장 구성
userservice
배포에 대해HorizontalPodAutoscaler
매니페스트를 검토합니다.이 매니페스트에는 다음 필드가 사용됩니다.
spec.scaleTargetRef
: 확장할 Kubernetes 리소스입니다.spec.minReplicas
: 이 샘플의 경우5
에 해당하는 최소 복제본 수입니다.spec.maxReplicas
: 이 샘플의 경우25
에 해당하는 최대 복제본 수입니다.spec.metrics.*
: 사용할 측정항목입니다. 이 샘플에서는 배포한 어댑터로 제공되는 Cloud 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
출력은 다음과 비슷합니다.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
accounts-db-postgresql StatefulSet/accounts-db-postgresql 10905m/15 (avg) 1 5 2 5m2s
contacts Deployment/contacts 1%/70% 1 5 1 11m
frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s
userservice Deployment/userservice 0%/60% 5 50 5 4m56s
지금까지 애플리케이션 설정과 자동 확장 구성이 완료되었습니다. 이제 제공한 측정항목을 기준으로 프런트엔드 및 데이터베이스를 확장할 수 있습니다.
부하 시뮬레이션 및 GKE 확장 관찰
Bank of Anthos에는 트래픽을 시뮬레이션하여 부하에 따라 애플리케이션 확장을 테스트할 수 있게 해주는 loadgenerator
서비스가 포함되어 있습니다. 이 섹션에서는 loadgenerator
서비스를 배포하고, 부하를 생성하고, 결과 확장을 관찰합니다.
부하 테스트 생성기 배포
Bank of Anthos 부하 분산기의 IP 주소로 환경 변수를 만듭니다.
export LB_IP=$(kubectl get ingress frontend -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $LB_IP
출력은 다음과 비슷합니다.
203.0.113.9
부하 분산기의 IP 주소를 매니페스트에 추가합니다.
sed -i "s/FRONTEND_IP_ADDRESS/$LB_IP/g" "extras/postgres-hpa/loadgenerator.yaml"
클러스터에 매니페스트를 적용합니다.
kubectl apply -f extras/postgres-hpa/loadgenerator.yaml
부하 분산기에서 초당 한 명씩 최대 250명까지 사용자 추가가 시작됩니다.
부하 시뮬레이션
이 섹션에서는 부하 생성기를 사용하여 트래픽 급증을 시뮬레이션하고 시간에 따라 부하 증가를 수용하기 위해 복제본 수 및 노드 수 확장을 관찰합니다. 그런 후 테스트를 종료하고 응답에서 복제본 및 노드 수 축소를 관찰합니다.
부하 생성기 웹 인터페이스를 로컬로 노출합니다.
kubectl port-forward svc/loadgenerator 8080
오류 메시지가 표시되면 포드가 실행될 때 다시 시도합니다.
브라우저에서 부하 생성기 웹 인터페이스를 엽니다.
- 로컬 셸을 사용하는 경우 브라우저를 열고 http://127.0.0.1:8080으로 이동합니다.
- Cloud Shell을 사용하는 경우 웹 미리보기를 클릭한 후 포트 8080에서 미리보기를 클릭합니다.
차트 탭을 클릭하여 시간별 성능을 관측합니다.
새 터미널 창을 열고 수평형 포드 자동 확장 처리의 복제본 수를 관찰합니다.
kubectl get hpa -w
부하가 증가하면 복제본 수가 증가합니다. 확장에는 약 10분 정도 걸릴 수 있습니다.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS accounts-db-postgresql StatefulSet/accounts-db-postgresql 8326m/15 (avg) 1 5 5 contacts Deployment/contacts 51%/70% 1 5 2 frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
다른 터미널 창을 열고 클러스터에서 노드 수를 확인합니다.
gcloud container clusters list \ --filter='name=bank-of-anthos' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="us-central1"
새로운 복제본을 수용하기 위해 3개 노드의 시작 수량에서 증가하는 노드 수입니다.
부하 생성기 인터페이스를 열고 중지를 클릭하여 테스트를 종료합니다.
복제본 수와 노드 수를 다시 확인하고 부하 감소에 따른 숫자 감소를 확인합니다. Kubernetes
HorizontalPodAutoscaler
리소스의 복제본에 대한 기본 안정화 기간이 5분이기 때문에 축소하는 데 시간이 약간 걸릴 수 있습니다. 자세한 내용은 안정화 기간을 참조하세요.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
개별 리소스 삭제
Google Cloud는 사용자가 만든 Kubernetes 객체를 기반으로 부하 분산기와 같은 리소스를 만듭니다. 이 튜토리얼에서 모든 리소스를 삭제하려면 다음을 수행합니다.
샘플 Kubernetes 리소스를 삭제합니다.
kubectl delete \ -f extras/postgres-hpa/loadgenerator.yaml \ -f extras/postgres-hpa/hpa \ -f extras/postgres-hpa/kubernetes-manifests \ -f extras/jwt/jwt-secret.yaml \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
PostgreSQL 데이터베이스를 삭제합니다.
helm uninstall accounts-db kubectl delete pvc -l "app.kubernetes.io/instance=accounts-db" kubectl delete configmaps initdb
GKE 클러스터를 및 IAM 서비스 계정을 삭제합니다.
gcloud iam service-accounts delete "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" --quiet gcloud container clusters delete "bank-of-anthos" --region="us-central1" --quiet
프로젝트 삭제
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
다음 단계
- 이전 사용량 기반의 권장사항에 따라 장기 실행 워크로드의 리소스 요청을 자동으로 조정하기 위해 사용할 수 있는 수직형 포드 자동 확장 자세히 알아보기
- 수평형 포드 자동 확장 자세히 알아보기