외부 측정항목으로 배포 자동 확장

이 가이드에서는 Stackdriver에서 사용할 수 있는 측정항목을 기반으로 GKE 작업 부하를 자동으로 확장하는 방법을 보여 줍니다.

Kubernetes 작업 부하가 내보낸 측정항목 또는 포드나 노드 같은 Kubernetes 객체에 연결된 측정항목을 기반으로 자동 확장하려면 커스텀 측정항목을 사용한 자동 확장 배포를 대신 참조하세요.

이 예는 Cloud Pub/Sub 구독에 있는 전달되지 않은 메시지 수에 따른 자동 확장을 보여 주지만 Stackdriver에서 사용할 수 있는 모든 측정항목에 이 지침을 적용할 수 있습니다.

목표

이 가이드에는 다음 단계가 포함됩니다.

  1. 커스텀 측정항목 Stackdriver 어댑터를 배포하는 방법
  2. 다른 Google Cloud Platform 서비스의 Stackdriver 측정항목에 따라 배포를 확장하기 위해 HorizontalPodAutoscaler(HPA) 리소스를 배포하는 방법

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform Console에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

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

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하는 데 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

클러스터 만들기

Kubernetes 버전 1.10 이상을 실행하는 GKE 클러스터를 만듭니다.

Pub/Sub 구독자 애플리케이션 배포

Cloud Pub/Sub을 사용하여 애플리케이션을 실행하려면 Google Cloud 서비스 계정을 만들고 애플리케이션에 사용자 인증 정보를 제공해야 합니다. 이 내용은 서비스 계정으로 Cloud Platform 인증 가이드에서 다룹니다.

다음 단계는 서비스 계정으로 Cloud Platform 인증에서 만든 배포를 자동 확장하는 방법을 보여 줍니다. 계속하기 전에 해당 가이드의 1단계부터 6단계까지 완료해야 합니다.

1단계: 커스텀 측정항목 Stackdriver 어댑터 배포

GKE 객체에게 Stackdriver에 저장된 측정항목에 대한 액세스 권한을 부여하려면 커스텀 측정항목 Stackdriver 어댑터를 배포해야 합니다. 커스텀 측정항목 어댑터를 실행하려면 다음 Kubernetes 명령어를 실행하여 필수 승인 역할을 만들 수 있는 능력을 사용자에게 부여해야 합니다.

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

클러스터에 어댑터를 배포하려면 다음 명령어를 실행하세요.

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

2단계: HorizontalPodAutoscaler 객체 만들기

커스텀 측정항목 Stackdriver 어댑터를 배포한 후 HorizontalPodAutoscaler를 배포하여 배포를 자동 확장할 수 있습니다.

다음 매니페스트 파일은 Pub/Sub 구독의 확인되지 않은 메시지 수에 따라 타겟을 기준으로 배포를 확장하는 HorizontalPodAutoscaler 객체를 설명합니다.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

이 매니페스트를 배포하려면 hpa.yaml로 머신에 다운로드하고 다음을 실행하세요.

kubectl apply -f hpa.yaml

3단계: 부하 생성

이 예에서 배포되는 샘플 애플리케이션은 몇 초마다 하나의 메시지를 처리합니다. 지속적으로 게시하면 메시지가 대기열에 올라가 자동 확장이 트리거됩니다. 다음 명령어를 사용하여 200개의 메시지를 Pub/Sub 주제에 게시할 수 있습니다.

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

4단계: HPA가 애플리케이션의 추가 복제본을 만드는 것을 관찰

다음 명령어를 실행하여 배포의 현재 복제본 수를 확인할 수 있습니다.

kubectl get deployment pubsub

다음 명령어를 실행하여 HPA의 상태와 최근 활동도 검사할 수 있습니다.

kubectl describe hpa pubsub
출력:
Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

측정항목 섹션은 HPA가 관찰한 측정항목의 마지막 값을 보여 줍니다. 소수 값은 밀리 단위로 표시됩니다. 예를 들어 위의 출력에는 애플리케이션 복제본이 4개 있고 Pub/Sub 구독의 현재 확인되지 않은 메시지는 9개입니다. 따라서 복제본당 평균 메시지 수는 2.25 또는 2250m개입니다.

조건 섹션은 HorizontalPodAutoscaler가 확장할 수 있는지 여부를 설명합니다. 위의 예에서 ScalingLimited 조건은 복제본의 수가 허용되는 최댓값이고 HPA가 더 이상 증가시키지 않을 것임을 보여 줍니다.

마지막으로 HPA는 애플리케이션 복제본의 수를 변경할 때마다 이벤트를 만듭니다(위 출력의 '이벤트' 섹션 참조). 위의 예에서는 확인되지 않은 메시지 수가 타겟 이상이므로 복제본의 수가 4로 변경되었습니다.

다른 측정항목 사용

Stackdriver에서 사용할 수 있는 모든 측정항목은 metricTypeINT64 또는 DOUBLE이라면 자동 확장에 사용할 수 있습니다. 사용할 수 있는 측정항목을 찾아보려면 측정항목 탐색기 또는 GCP 측정항목 목록을 사용하면 됩니다. GAUGE 종류의 측정항목의 경우, 현재 측정항목 값이 자동 확장에 사용됩니다. DELTACUMULATIVE 측정항목의 경우, 초당 측정항목 변화율인 측정항목의 비율이 대신 사용됩니다. 비율 계산 방법에 대한 자세한 내용은 커스텀 측정항목 어댑터 문서에서 찾을 수 있습니다.

외부 측정항목 사양 작성

자동 확장할 측정항목을 선택한 다음 HorizontalPodAutoscaler의 외부 측정항목 사양을 작성해야 합니다. 그러려면 다음 3개의 필드를 지정해야 합니다.

  • metricName은 측정항목의 이름입니다. Kubernetes API에서는 측정항목 이름에 슬래시 사용이 허용되지 않으므로 파이프 기호(|)로 바꿔야 합니다. 이 가이드에서는 pubsub.googleapis.com/subscription/num_undelivered_messagespubsub.googleapis.com|subscription|num_undelivered_messages로 지정되었음에 유의하세요.
  • metricSelector는 측정항목의 특정 시계열을 선택하는 데 선택적으로 사용할 수 있습니다. metricSelector가 여러 시계열과 일치하는 경우, 그 값의 합계가 자동 확장에 사용됩니다. 이 가이드에서 metricSelector는 echo-read 구독의 메시지만 고려하도록 HPA를 제한하는 데 사용되었습니다. Stackdriver 시계열 및 라벨Kubernetes LabelSelector에 대해 자세히 알아보세요.
  • targetAverageValue는 각 복제본이 측정항목의 전체 값 중 얼마나 처리할 수 있는지 지정합니다. 예를 들어 Pub/Sub 메시지 또는 QPS 같이 복제본 간에 나눌 수 있는 작업이나 리소스를 설명하는 측정항목을 사용할 때 유용합니다. 평균 요청 지연 시간 같은 다른 측정항목의 경우, 전역 목표 값을 지정하는 것이 더 합리적입니다. targetAverageValue 대신 targetValue를 지정하면 됩니다.

여러 측정항목에 기반한 자동 확장

여러 측정항목을 단일 HorizontalPodAutoscaler와 함께 사용하여 외부 측정항목을 [커스텀 측정항목으로 배포 자동 확장]에 설명된 다른 측정항목 유형과 결합할 수 있습니다. 그러려면 HPA 객체 사양의 metrics 목록에서 별도의 항목으로 사용하려는 각 측정항목을 지정합니다. HPA는 각 측정항목을 기반으로 복제본의 수를 계산하고 가장 높은 것을 선택합니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. Pub/Sub 구독 및 항목을 삭제합니다.
gcloud pubsub subscriptions delete echo-read
gcloud pubsub topics delete echo
  1. 다음 명령어를 실행하여 GKE 클러스터를 삭제합니다.
gcloud container clusters delete [CLUSTER_NAME]

다음 단계

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

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

Kubernetes Engine 가이드