학습 과정: 확장 가능한 애플리케이션 - 확장


이 튜토리얼 모음은 Google Kubernetes Engine(GKE) Enterprise 버전에서 실행되는 최신 애플리케이션 환경을 배포, 실행, 관리하려는 IT 관리자와 운영자를 대상으로 합니다. 이 튜토리얼 모음을 진행하면서 Cymbal Bank 샘플 마이크로서비스 애플리케이션을 사용하여 모니터링 및 알림을 구성하고, 워크로드를 확장하며, 장애를 시뮬레이션하는 방법을 알아봅니다.

  1. 클러스터 만들기 및 샘플 애플리케이션 배포
  2. Google Cloud Managed Service for Prometheus로 모니터링
  3. 워크로드 확장(이 튜토리얼)
  4. 장애 시뮬레이션

개요 및 목표

Cymbal Bank와 같은 소비자 애플리케이션은 때에 따라 사용자 수가 다른 경우가 많습니다. 조직에서 실제로 필요하지 않은 Cloud 리소스에 비용을 지출하지 않아도 웹사이트는 속도 저하나 다른 문제 없이 트래픽 급증을 처리할 수 있어야 합니다. 이를 위해 Google Cloud가 제공하는 솔루션은 자동 확장입니다.

이 튜토리얼에서는 기본 제공되는 Kubernetes 측정항목과 Cloud Monitoring 및 Cloud Trace의 커스텀 측정항목을 모두 사용하여 확장하도록 GKE 클러스터의 클러스터 및 워크로드를 구성하는 방법을 알아봅니다. 다음 작업을 완료하는 방법을 알아봅니다.

  • Cloud Monitoring에서 Trace용 커스텀 측정항목을 사용 설정합니다.
    • 커스텀 측정항목을 사용하면 Kubernetes 클러스터 인식 이외의 추가 모니터링 데이터 또는 외부 입력(예: 네트워크 트래픽 또는 HTTP 응답 코드)을 사용하여 확장할 수 있습니다.
  • 지정된 측정항목에 따라 워크로드의 포드 수를 자동으로 늘리거나 줄일 수 있는 GKE 기능인 수평형 포드 자동 확장 처리를 구성합니다.
  • 애플리케이션 부하를 시뮬레이션하고 클러스터 자동 확장 처리 및 수평형 포드 자동 확장 처리의 응답을 확인합니다.

비용

이 튜토리얼 시리즈에서 GKE Enterprise를 사용 설정하고 Cymbal Bank 샘플 애플리케이션을 배포하면 GKE Enterprise를 사용 중지하거나 프로젝트를 삭제할 때까지 가격 책정 페이지에 나열된 대로 Google Cloud에서 GKE Enterprise에 대해 클러스터별 요금이 발생합니다.

Compute Engine VM 및 Trace 요금과 같이 Cymbal Bank 샘플 애플리케이션을 실행하는 동안 발생하는 기타 Google Cloud 비용도 사용자가 부담합니다.

시작하기 전에

배포를 확장하는 방법을 알아보려면 첫 번째 튜토리얼을 완료하여 Autopilot을 사용하는 GKE 클러스터를 만들고 Cymbal Bank 샘플 마이크로서비스 기반 애플리케이션을 배포해야 합니다.

Cymbal Bank에 대한 이 튜토리얼 모음을 순서대로 완료하는 것이 좋습니다. 튜토리얼 모음을 진행하면서 새로운 기술을 배우고 추가적인 Google Cloud 제품 및 서비스를 사용하게 됩니다.

또한 IAM 서비스 계정을 만들고 수평형 포드 자동 확장 처리가 올바르게 작동하려면 일부 권한을 부여해야 합니다.

  1. IAM 서비스 계정을 만듭니다. 이 서비스 계정은 튜토리얼에서 수평형 포드 자동 확장 처리가 수직 확장 또는 축소 시기를 결정할 수 있게 해주는 커스텀 측정항목에 액세스 권한을 부여하기 위해 사용됩니다.

    gcloud iam service-accounts create scalable-apps
    
  2. 필요한 확장 작업을 수행하기 위해 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 서비스 계정이 워크로드 아이덴티티를 사용하여 IAM 서비스 계정으로 작동할 수 있게 허용합니다.
  3. 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의 커스텀 측정항목을 사용할 수 있습니다. 커스텀 측정항목은 애플리케이션 변경 없이 작동할 수 있으며, 애플리케이션이 애플리케이션의 전체 성능과 요구에 대한 더 많은 유용한 정보를 제공합니다. 이 튜토리얼에서는 기본 제공 측정항목과 커스텀 측정항목을 모두 사용하는 방법을 알아봅니다.

  1. 수평형 포드 자동 확장 처리가 Monitoring에서 커스텀 측정항목을 읽을 수 있게 하려면 클러스터에 커스텀 측정항목 - Stackdriver 어댑터를 설치해야 합니다.

    커스텀 측정항목 Stackdriver 어댑터를 클러스터에 배포합니다.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
    
  2. Stackdriver 어댑터가 클러스터에서 커스텀 측정항목을 가져올 수 있게 하려면 워크로드 아이덴티티를 사용합니다. 이 방법에서는 모니터링 측정항목을 읽을 수 있는 권한이 있는 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
    
  3. 워크로드 아이덴티티 및 모니터링 측정항목 읽기 권한이 있는 IAM 서비스 계정을 사용하도록 Stackdriver 어댑터를 구성합니다.

    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]"
    
  4. Kubernetes에는 클러스터 내에서 액세스할 수 있는 서비스 계정을 위한 자체 시스템이 있습니다. 애플리케이션이 Monitoring과 같은 Google Kubernetes Engine(GKE) Enterprise 버전 클러스터 외부의 서비스 및 리소스에 인증하도록 하려면 워크로드 아이덴티티를 사용합니다. 이 접근 방법은 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
    
  5. 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 매니페스트에서 수평형 포드 자동 확장 처리에 사용할 배포, 모니터링할 측정항목, 실행할 최소 및 최대 복제본 수를 정의합니다.

  1. userservice 배포에 대해 HorizontalPodAutoscaler 샘플 매니페스트를 검토합니다.

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: userservice
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: userservice
      minReplicas: 5
      maxReplicas: 50
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 60
    

    이 매니페스트는 다음을 수행합니다.

    • 50로 수직 확장하는 동안 최대 복제본 수를 설정합니다.
    • 5로 수직 축소하는 동안 최소 복제본 수를 설정합니다.
    • 기본 제공되는 Kubernetes 측정항목을 사용하여 확장 결정을 수행합니다. 이 샘플에서 측정항목은 CPU 활용률이고 목표 활용률은 초과 활용률 및 미만 활용률을 모두 방지하는 60%입니다.
  2. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
    

frontend 배포 확장

이전 섹션에서는 CPU 사용률에 대한 기본 제공되는 Kubernetes 측정항목을 기반으로 userservice 배포에서 수평형 포드 자동 확장 처리를 구성했습니다. frontend 배포의 경우 수신되는 HTTP 요청 수에 따라 대신 확장할 수 있습니다. 이 방법에서는 Stackdriver 어댑터를 사용하여 HTTP(S) 부하 분산기 인그레스 객체에 대해 Monitoring에서 커스텀 측정항목을 읽습니다.

  1. frontend 배포에 대해 HorizontalPodAutoscaler 매니페스트를 검토합니다.

    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: frontend
    spec:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          policies:
            - type: Percent
              value: 100
              periodSeconds: 5
          selectPolicy: Max
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: frontend
      minReplicas: 5
      maxReplicas: 25
      metrics:
        - type: External
          external:
            metric:
              name: loadbalancing.googleapis.com|https|request_count
              selector:
                matchLabels:
                  resource.labels.forwarding_rule_name: FORWARDING_RULE_NAME
            target:
              type: AverageValue
              averageValue: "5"
    

    이 매니페스트에는 다음 필드가 사용됩니다.

    • spec.scaleTargetRef: 확장할 Kubernetes 리소스입니다.
    • spec.minReplicas: 이 샘플의 경우 5에 해당하는 최소 복제본 수입니다.
    • spec.maxReplicas: 이 샘플의 경우 25에 해당하는 최대 복제본 수입니다.
    • spec.metrics.*: 사용할 측정항목입니다. 이 샘플에서는 배포한 어댑터로 제공되는 Monitoring의 커스텀 측정항목인 초당 HTTP 요청 수입니다.
    • spec.metrics.external.metric.selector.matchLabels: 확장 시 필터링할 특정 리소스 라벨입니다.
  2. 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
    
  3. 매니페스트에 전달 규칙을 추가합니다.

    sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
    

    이 명령어는 FORWARDING_RULE_NAME을 저장된 전달 규칙으로 바꿉니다.

  4. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
    

부하 시뮬레이션

이 섹션에서는 부하 생성기를 사용하여 트래픽 급증을 시뮬레이션하고 시간에 따라 부하 증가를 수용하기 위해 복제본 수 및 노드 수 수직 확장을 관찰합니다. 그런 후 트래픽 생성을 중지하고 응답에서 복제본 및 노드 수 축소를 관찰할 수 있습니다.

  1. 시작하기 전에 수평형 포드 자동 확장 처리의 상태를 확인하고 사용 중인 복제본 수를 확인합니다.

    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
    
  2. Cymbal Bank 샘플 애플리케이션에는 loadgenerator 서비스가 포함되어 있습니다. 이 서비스는 계속해서 사용자를 모방하는 요청을 프런트엔드로 전송하고 주기적으로 새 계정을 만들고 계정 간의 트랜잭션을 시뮬레이션합니다.

    loadgenerator 웹 인터페이스를 로컬로 노출합니다. 이 인터페이스를 사용하여 Cymbal Bank 샘플 애플리케이션의 부하를 시뮬레이션합니다.

    kubectl port-forward svc/loadgenerator 8080
    

    오류 메시지가 표시되면 포드가 실행될 때 다시 시도합니다.

  3. 컴퓨터의 브라우저에서 부하 생성기 웹 인터페이스를 엽니다.

    • 로컬 셸을 사용하는 경우 브라우저를 열고 http://127.0.0.1:8080으로 이동합니다.
    • Cloud Shell을 사용하는 경우 웹 미리보기를 클릭한 후 포트 8080에서 미리보기를 클릭합니다.
  4. 부하 생성기 웹 인터페이스에서 실패 값에 100%가 표시되면 다음 단계를 완료하여 테스트 설정을 업데이트합니다.

    1. 실패율 카운터 옆에 있는 중지 버튼을 클릭합니다.
    2. 상태에서 새 테스트 옵션을 클릭합니다.
    3. 호스트 값을 Cymbal Bank 인그레스의 IP 주소로 업데이트합니다.
    4. 생성 시작을 클릭합니다.
  5. 부하 생성기 웹 인터페이스에서 차트 탭을 클릭하여 시간 경과에 따른 성능을 관측합니다. 요청 수와 리소스 사용률을 확인합니다.

  6. 새 터미널 창을 열고 frontenduserservice 포드의 복제본 수를 확인합니다.

    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
    
  7. 다른 터미널 창을 열고 클러스터에서 노드 수를 확인합니다.

    gcloud container clusters list \
        --filter='name=scalable-apps' \
        --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \
        --region="REGION"
    

    REGION을 클러스터가 실행되는 리전으로 바꿉니다.

    새로운 복제본을 수용하기 위해 시작 수량에서 노드 수도 증가합니다. 이러한 노드 수 증가는 GKE Autopilot으로 구동됩니다. 이 노드 확장에는 구성할 것이 없습니다.

  8. 부하 생성기 인터페이스를 열고 중지를 클릭하여 테스트를 종료합니다.

  9. 복제본 수와 노드 수를 다시 확인하고 부하 감소에 따른 숫자 감소를 확인합니다. Kubernetes HorizontalPodAutoscaler 리소스의 복제본에 대한 기본 안정화 기간이 5분이기 때문에 축소하는 데 시간이 약간 걸릴 수 있습니다.

실제 환경에서는 이 환경의 노드 수와 포드 수가 모두 시뮬레이션된 부하와 동일한 방식으로 자동으로 수직 확장 및 축소됩니다. Cymbal Bank 샘플 애플리케이션은 이러한 종류의 확장을 수용하도록 설계되었습니다. 앱 운영자와 사이트 안정성 엔지니어링(SRE) 또는 애플리케이션 개발자에게 문의하여 워크로드가 이러한 확장 기능을 활용할 수 있는지 확인하세요.

삭제

Cymbal Bank 튜토리얼 모음은 하나씩 순서대로 완료되도록 설계되었습니다. 튜토리얼 모음을 진행하면서 새로운 기술을 배우고 Google Cloud 추가 제품과 서비스를 사용하게 됩니다.

다음 튜토리얼로 이동하기 전에 잠시 멈추고 이 튜토리얼에서 사용한 리소스에 대한 비용이 Google Cloud 계정에 청구되지 않도록 만든 프로젝트를 삭제합니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계

다음 튜토리얼에서 GKE Enterprise의 장애 시뮬레이션 방법 알아보기