Google Kubernetes Engine을 사용한 분산 부하 테스트

이 가이드에서는 단순한 REST 기반 API에 대한 트래픽을 생성하는 여러 컨테이너를 사용하는 분산 부하 테스트 프레임워크를 배포하기 위해 Google Kubernetes Engine(GKE)을 사용하는 방법을 설명합니다. 그리고 수신되는 HTTP POST 요청을 캡처하기 위해 REST 스타일 엔드포인트를 노출하는 App Engine에 배포된 웹 애플리케이션의 부하 테스트를 수행합니다.

이와 동일한 패턴을 사용하여 메시징 시스템, 데이터 스트림 관리 시스템, 데이터베이스 시스템과 같은 다양한 시나리오 및 애플리케이션의 부하 테스트 프레임워크를 만들 수 있습니다.

목표

  • 배포 구성을 제어하는 환경 변수를 정의합니다.
  • GKE 클러스터를 만듭니다.
  • 부하 테스트를 수행합니다.
  • 선택적으로 사용자 수를 늘리거나 패턴을 다른 사용 사례로 확장합니다.

비용

이 가이드는 Google Cloud Platform의 다음 청구 가능 구성요소를 사용합니다.

  • Google Kubernetes Engine
  • App Engine
  • Cloud Build
  • Cloud Storage

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 생성할 수 있습니다. GCP 신규 사용자는 무료 평가판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Platform 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

  3. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Cloud Build, Compute Engine, 컨테이너 분석, Container Registry APIs를 사용 설정합니다.

    APIs 사용 설정

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

예시 작업 부하

다음 다이어그램은 요청이 클라이언트에서 애플리케이션으로 이동하는 작업 부하의 예시를 보여줍니다.

클라이언트에서 애플리케이션으로 이동하는 요청

이 상호작용을 모델링하려면 요청을 여러 대상 경로에 분산할 수 있는 Python 기반의 분산형 부하 테스트 도구인 Locust를 사용합니다. 예를 들어 Locust는 요청을 /login/metrics 대상 경로로 분산할 수 있습니다. 작업 부하는 Locust에서 일련의 태스크로 모델링됩니다.

아키텍처

이 아키텍처에는 두 개의 주요 구성요소가 포함됩니다.

  • Locust Docker 컨테이너 이미지
  • 컨테이너 조정 및 관리 메커니즘

Locust Docker 컨테이너 이미지에는 Locust 소프트웨어가 포함되어 있습니다. 이 가이드에 포함된 GitHub 저장소를 클론할 때 얻는 Dockerfile은 기본 Python 이미지를 사용하며, Locust 서비스를 시작하고 태스크를 실행하는 스크립트를 포함합니다. 실제 클라이언트를 모방하기 위해 각 Locust 태스크에 가중치가 부여됩니다. 예를 들어 등록은 총 클라이언트 요청 1,000회당 한 번 발생합니다.

GKE는 컨테이너 조정 및 관리 기능을 제공합니다. GKE를 사용하면 부하 테스트 프레임워크의 기반을 제공하는 컨테이너 노드의 개수를 지정할 수 있습니다. 또한 부하 테스트 작업자를 pod로 구성하고, GKE에서 계속 실행할 pod의 수를 지정할 수 있습니다.

부하 테스트 작업을 배포하는 방법은 다음과 같습니다.

  1. 부하 테스트 마스터를 배포합니다.
  2. 부하 테스트 작업자 그룹을 배포합니다. 이러한 부하 테스트 작업자를 통해 테스트 용도로 상당한 양의 트래픽을 생성할 수 있습니다.

다음 다이어그램은 마스터 노드와 작업자 노드의 콘텐츠를 보여줍니다.

마스터에는 API 서버, 스케줄러, 관리자가 포함됩니다. 2개의 노드에 각각 Kublet, 프록시, 그리고 4개의 pod가 있는 Docker 이미지가 포함되어 있습니다.

부하 테스트 마스터 정보

Locust 마스터는 부하 테스트 태스크를 실행하기 위한 진입점입니다. Locust 마스터 구성은 컨테이너에 의해 노출되는 포트를 포함하여 여러 요소를 지정합니다.

  • 8089: 웹 인터페이스용
  • 55575558: 작업자와 통신하기 위한 용도

이 정보는 나중에 Locust 작업자를 구성하는 데 사용됩니다.

클러스터 내의 다른 pod가 hostname:port를 통해 노출된 포트에 액세스할 수 있도록 하는 서비스를 배포합니다. 노출된 포트는 설명적인 포트 이름을 통해 참조할 수도 있습니다.

마스터가 장애를 일으켜 배포를 통해 새로운 pod로 교체되더라도 Locust 작업자가 마스터를 쉽게 발견하고 마스터와 안정적으로 통신할 수 있도록 하는 서비스를 사용합니다. 또한 이 서비스에는 외부 트래픽이 클러스터 리소스에 액세스할 수 있도록 클러스터 수준에서 외부 전달 규칙을 생성하는 지시문이 포함됩니다.

Locust 마스터가 배포된 후에는 외부 전달 규칙의 공개 IP 주소를 사용하여 웹 인터페이스를 열 수 있습니다. Locust 작업자가 배포된 후에는 시뮬레이션을 시작하여 Locust 웹 인터페이스를 통해 집계 통계를 확인할 수 있습니다.

부하 테스트 작업자 정보

Locast 작업자는 부하 테스트 태스크를 실행합니다. 단일 배포를 사용하여 여러 pod를 생성할 수 있습니다. pod는 Kubernetes 클러스터 전체에 분산됩니다. 각 pod는 환경 변수를 사용하여 테스트 대상 시스템의 호스트 이름, Locust 마스터의 호스트 이름과 같은 구성 정보를 제어합니다.

아래 다이어그램은 Locust 마스터와 Locust 작업자 사이의 관계를 보여줍니다.

Locust 마스터는 여러 작업자가 속한 계층 구조의 맨 위에 있습니다.

공통 변수 초기화

인프라 요소가 배치되는 위치를 제어하는 여러 변수를 정의해야 합니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

    Cloud Shell에서 이 가이드의 모든 터미널 명령어를 실행합니다.

  2. 환경 변수를 설정합니다.

    REGION=us-central1
    ZONE=${REGION}-b
    PROJECT=$(gcloud config get-value project)
    CLUSTER=gke-load-test
    TARGET=${PROJECT}.appspot.com
    SCOPE="https://www.googleapis.com/auth/cloud-platform"
    
  3. 이후의 모든 명령어에서 기본 영역과 프로젝트 ID를 지정할 필요가 없도록 해당 값을 지정합니다.

    gcloud config set compute/zone ${ZONE}
    gcloud config set project ${PROJECT}
    

환경 설정

  1. GitHub에서 샘플 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/distributed-load-testing-using-kubernetes
    
  2. 작업 디렉터리를 다음의 클론된 저장소로 변경합니다.

    cd distributed-load-testing-using-kubernetes
    

GKE 클러스터 만들기

  1. GKE 클러스터를 만듭니다.

    gcloud container clusters create $CLUSTER \
       --zone $ZONE \
       --scopes $SCOPE \
       --enable-autoscaling --min-nodes "3" --max-nodes "10" \
       --scopes=logging-write \
       --addons HorizontalPodAutoscaling,HttpLoadBalancing
    
  2. GKE 클러스터에 연결합니다.

    gcloud container clusters get-credentials $CLUSTER \
       --zone $ZONE \
       --project $PROJECT
    

Docker 이미지 빌드

  1. Docker 이미지를 빌드하고 프로젝트의 Container Registry에 저장합니다.

    gcloud builds submit \
        --tag gcr.io/$PROJECT/locust-tasks:latest docker-image
    
  2. Docker 이미지가 프로젝트의 컨테이너 저장소에 있는지 확인합니다.

    gcloud container images list | grep locust-tasks
    

    결과는 다음과 같이 표시됩니다.

    gcr.io/[PROJECT]/locust-tasks
    Only listing images in gcr.io/[PROJECT]. Use --repository to list images in other repositories.
    

샘플 애플리케이션 배포

  • 샘플 애플리케이션을 App Engine에 배포합니다.

    gcloud app deploy sample-webapp/app.yaml \
      --project=$PROJECT
    

    결과는 다음과 같이 표시됩니다.

    File upload done.
    Updating service [default]...done.
    Setting traffic split for service [default]...done.
    Deployed service [default] to [https://[PROJECT].appspot.com]
    

Locast 마스터 및 작업자 노드 배포

  1. locust-master-controller.yamllocust-worker-controller.yaml 파일에서 대상 호스트와 프로젝트 ID를 배포된 엔드포인트와 프로젝트 ID로 바꿉니다.

    sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-master-controller.yaml
    sed -i -e "s/\[TARGET_HOST\]/$TARGET/g" kubernetes-config/locust-worker-controller.yaml
    sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-master-controller.yaml
    sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" kubernetes-config/locust-worker-controller.yaml
    
  2. Locust 마스터 노드와 작업자 노드를 배포합니다.

    kubectl apply -f kubernetes-config/locust-master-controller.yaml
    kubectl apply -f kubernetes-config/locust-master-service.yaml
    kubectl apply -f kubernetes-config/locust-worker-controller.yaml
    
  3. Locust 배포를 확인합니다.

    kubectl get pods -o wide
    

    결과는 다음과 같이 표시됩니다.

    Locust 마스터 및 작업자 노드가 배포됩니다.
  4. 서비스를 확인합니다.

    kubectl get services
    

    결과는 다음과 같이 표시됩니다.

    서비스가 배포됩니다.
  5. 외부 IP 주소가 Locust 마스터 서비스에 할당되어 있는 동안 감시 루프를 실행합니다.

    kubectl get svc locust-master --watch
    
  6. Ctrl+C를 눌러 감시 루프를 종료한 후 다음 명령어를 실행하여 외부 IP 주소를 기록합니다.

    EXTERNAL_IP=$(kubectl get svc locust-master -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
    

부하 테스트

Locust 마스터 웹 인터페이스를 사용하여 테스트 중인 시스템의 부하 테스트 태스크를 실행할 수 있습니다.

  1. 시스템의 외부 IP 주소를 가져옵니다.

    echo $EXTERNAL_IP
    

  2. 브라우저를 열고 Locust 마스터 웹 인터페이스를 엽니다. 다음 URL의 [EXTERNAL_IP]를 이전 단계에서 얻은 IP 주소 http://[EXTERNAL_IP]:8089로 대체합니다.

    Locust 마스터 웹 인터페이스는 새로운 생성을 시작하고 사용자 수와 생성 속도를 지정하는 대화상자를 제공합니다.

  3. Number of users to simulate(시뮬레이션할 사용자 수)10명으로 지정하고 사용자가 생성되는 Hatch rate(생성 속도)를 초당 5명으로 지정합니다.

  4. 그런 다음 Start swarming(생성 시작)을 클릭하여 시뮬레이션을 시작합니다.

    요청이 생성되기 시작하면 다음 이미지처럼 요청 수 및 초당 요청 수와 같은 시뮬레이션 측정항목의 통계가 집계되기 시작합니다.

    Locust 웹 인터페이스는 통계가 집계되기 시작함을 보여줍니다.
  5. Stop(중지)를 클릭하여 테스트를 종료합니다.

GCP Console에서 배포된 서비스와 기타 측정항목을 볼 수 있습니다.

App Engine 대시보드에는 한 시간 동안의 요청 그래프가 유형별로 표시됩니다.

사용자 수 확장(선택사항)

애플리케이션의 부하 증가를 테스트하려면 시뮬레이션된 사용자를 추가합니다. 시뮬레이션된 사용자를 추가하기 전에 먼저 부하 증가를 지원하기에 충분한 리소스가 있는지 확인해야 합니다. GCP를 사용할 경우 증가된 수의 pod를 지원할 기본 VM 리소스가 있는 한 기존 pod를 재배포하지 않고 Locust 작업자 pod를 배포에 추가할 수 있습니다. 초기 GKE 클러스터는 3개의 노드로 시작하여 최대 10개의 노드로 자동 확장할 수 있습니다.

  • Locust 작업자 pod의 풀을 20개로 확장합니다.

    kubectl scale deployment/locust-worker --replicas=20
    

    새로운 pod를 배포하고 시작하는 데 몇 분이 걸립니다.

Pod Unschedulable(Pod를 예약할 수 없음) 오류가 표시되면 클러스터에 역할을 추가해야 합니다. 자세한 내용은 GKE 클러스터 크기 조절을 참조하세요.

pod가 시작되면 Locust 마스터 웹 인터페이스로 돌아가서 부하 테스트를 다시 시작하세요.

패턴 확장

이 패턴을 확장하려면 새로운 Locust 태스크를 생성하거나 다른 부하 테스트 프레임워크로 전환합니다.

수집하는 측정항목을 맞춤설정할 수 있습니다. 예를 들어 초당 요청을 측정하거나, 부하 증가에 따른 응답 지연 시간을 모니터링하거나, 응답 실패율 및 오류 유형을 확인할 수 있습니다.

자세한 내용은 Stackdriver Monitoring 문서를 참조하세요.

삭제

가이드를 마친 후에는 GCP에서 생성한 리소스를 정리하여 나중에 다시 청구되지 않도록 할 수 있습니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

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

GKE 클러스터 삭제

전체 프로젝트를 삭제하지 않으려면 다음 명령어를 실행하여 GKE 클러스터를 삭제하세요.

   gcloud container clusters delete $CLUSTER --zone $ZONE
   

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...