수평형 pod 자동 확장 구성

이 페이지에서는 수평형 pod 자동 확장 처리(HPA)를 사용하여 다른 유형의 측정항목으로 배포를 자동 확장하는 방법을 설명합니다. 동일한 가이드라인을 사용하여 확장 가능한 배포 객체에 HPA를 구성할 수 있습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

One of [--zone, --region] must be supplied: Please specify location 오류가 표시되면 이 섹션을 완료합니다.

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 기본 Compute Engine 영역을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project PROJECT_ID
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone COMPUTE_ZONE
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region COMPUTE_REGION
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

HPA 객체용 API 버전

Google Cloud Console을 사용하면 HPA 객체가 autoscaling/v2beta2 API를 사용하여 생성됩니다.

kubectl을 사용하여 HPA에 대한 정보를 만들거나 볼 때 autoscaling/v1 API 또는 autoscaling/v2beta2 API를 지정할 수 있습니다.

  • 기본값은 apiVersion: autoscaling/v1이며 CPU 사용률에만 기반한 자동 확장을 허용합니다. 다른 측정항목을 기반으로 자동 확장하려면 `apiVersion: autoscaling/v2beta2을 사용하는 것이 좋습니다. 배포 구성의 예시에서는 apiVersion: autoscaling/v1을 사용합니다.

  • 새 HPA 객체를 만들 때는 apiVersion: autoscaling/v2beta2을 사용하는 것이 좋습니다. 커스텀 측정항목 또는 외부 측정항목을 비롯한 여러 측정항목을 기반으로 자동 확장할 수 있습니다. 이 주제의 다른 모든 예시에서는 apiVersion: autoscaling/v2beta2을 사용합니다.

지원되는 API 버전을 확인하려면 kubectl api-versions 명령어를 사용합니다.

apiVersion: autoscaling/v2beta2을 사용하는 HPA에 대한 세부정보를 볼 때 사용할 API를 지정할 수 있습니다.

배포 예시 만들기

HPA를 만들려면 먼저 모니터링하는 워크로드를 만들어야 합니다. 이 주제의 예시에서는 다음 nginx 배포에 서로 다른 HPA 구성을 적용합니다. 다른 예시에서는 리소스 사용률, 커스텀 측정항목 또는 외부 측정항목, 여러 측정항목을 기반으로 하는 HPA를 보여 줍니다.

다음 항목을 nginx.yaml 파일에 저장합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

이 매니페스트는 CPU 요청 값을 지정합니다. 리소스 사용률에 따라 백분율로 자동 확장하려면 해당 리소스에 대한 요청을 지정해야 합니다. 요청을 지정하지 않으면 CPU 사용률의 milliCPU와 같은 리소스 사용률의 절댓값만 기반으로 하여 자동 확장할 수 있습니다.

배포를 만들려면 nginx.yaml 매니페스트를 적용합니다.

kubectl apply -f nginx.yaml

배포에는 3으로 설정된 spec.replicas가 있으므로 3개의 pod가 배포됩니다. kubectl get deployment nginx 명령어를 사용하여 확인할 수 있습니다.

이 주제의 각 예시에서는 nginx 배포 예시에 다른 HPA를 적용합니다.

리소스 사용률 기반의 자동 확장

이 예시에서는 HPA 객체를 생성하여 CPU 사용률이 50%를 초과할 때 nginx 배포를 자동 확장하고 항상 최소 1개의 복제본과 최대 10개의 복제본이 있는지 확인합니다.

Cloud Console, kubectl apply 명령어를 사용하거나 평균 CPU만 해당되는 경우 kubectl autoscale 명령어를 사용하여 CPU를 타겟으로 하는 HPA를 만들 수 있습니다.

Console

  1. Cloud Console에서 GKE 워크로드 메뉴로 이동합니다.

    GKE 워크로드 메뉴로 이동

  2. nginx 배포 이름을 클릭합니다.

  3. 작업 > 자동 확장을 클릭합니다.

  4. 다음 값을 지정합니다.

    • 최소 복제본 수: 1
    • 최대 복제본 수: 10
    • 자동 확장 측정항목: CPU
    • 목표: 50
    • 단위: %
  5. 완료를 클릭합니다.

  6. 자동 확장을 클릭합니다.

kubectl apply

다음 YAML 매니페스트를 nginx-hpa.yaml이라는 파일로 저장합니다.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

HPA를 만들려면 다음 명령어를 사용하여 매니페스트를 적용합니다.

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

평균 CPU 사용률만 대상으로 하는 HPA 객체를 만들려면 kubectl autoscale 명령어를 사용하면 됩니다.

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

클러스터에서 HPA 객체 목록을 가져오려면 다음 명령어를 사용합니다.

kubectl get hpa

출력은 다음과 비슷합니다.

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

HPA의 세부정보를 확인하려면 Cloud Console 또는 kubectl 명령어를 사용합니다.

Console

  1. Cloud Console에서 Google Kubernetes Engine 워크로드 메뉴로 이동합니다.

    워크로드 메뉴로 이동

  2. nginx 배포 이름을 클릭합니다.

  3. 자동 확장 처리 섹션에서 HPA의 구성을 확인합니다.

  4. 자동 확장 이벤트에 대한 자세한 내용은 이벤트 탭을 참조하세요.

kubectl get

HPA의 세부정보를 확인하려면 kubectl get hpa-o yaml 플래그와 함께 사용합니다. status 필드에는 현재 복제본 수 및 최근 자동 확장 이벤트 정보가 포함됩니다.

kubectl get hpa nginx -o yaml

출력은 다음과 비슷합니다.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

이 주제의 나머지 예시를 따르기 전에 HPA를 삭제합니다.

kubectl delete hpa nginx

HPA를 삭제하면 배포의 복제본 수가 동일하게 유지됩니다. HPA가 적용되기 전에 배포가 자동으로 상태로 되돌아가지 않습니다.

HPA 삭제를 자세히 알아볼 수 있습니다.

커스텀 측정항목 또는 외부 측정항목에 기반한 자동 확장

단계별 가이드를 따라 커스텀 측정항목외부 측정항목의 HPA를 만들 수 있습니다.

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

이 예시에서는 CPU 사용률과 packets_per_second라는 커스텀 측정항목에 따라 자동 확장되는 HPA를 만듭니다.

위의 예시를 따랐지만 여전히 nginx라는 HPA가 있는 경우 먼저 삭제하고 이 예시를 따릅니다.

이 예시에는 apiVersion: autoscaling/v2beta2이 필요합니다. 사용 가능한 API에 대한 자세한 내용은 HPA 객체용 API 버전을 참조하세요.

이 YAML 매니페스트를 nginx-multiple.yaml이라는 파일로 저장합니다.

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

YAML 매니페스트를 적용합니다.

kubectl apply -f nginx-multiple.yaml

HPA는 생성된 후 평균 CPU 사용률, 평균 메모리 사용률, 커스텀 packets_per_second 측정항목(주석 처리를 삭제한 경우)의 nginx 배포를 모니터링합니다. HPA는 더 큰 자동 확장 이벤트를 생성하는 값을 가진 측정항목을 기반으로 배포를 자동 확장합니다.

HPA의 세부정보 보기

HPA의 구성 및 통계를 보려면 다음 명령어를 사용합니다.

kubectl describe hpa hpa-name

hpa-name을 HorizontalPodAutoscaler 객체의 이름으로 바꿉니다.

HPA가 apiVersion: autoscaling/v2beta2을 사용하고 여러 측정항목을 기반으로 하는 경우 kubectl describe hpa 명령어는 CPU 측정항목만 표시합니다. 모든 측정항목을 보려면 다음 명령어를 사용합니다.

kubectl describe hpa.v2beta2.autoscaling hpa-name

hpa-name을 HorizontalPodAutoscaler 객체의 이름으로 바꿉니다.

각 HPA의 현재 상태는 Conditions 필드에 표시되고 자동 확장 이벤트는 Events 필드에 나열됩니다.

출력은 다음과 비슷합니다.

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

HPA 삭제

Cloud Console이나 kubectl delete 명령어를 사용하여 HPA를 삭제할 수 있습니다.

Console

nginx HPA를 삭제하려면 다음 단계를 따르세요.

  1. Cloud Console에서 GKE 워크로드 메뉴로 이동합니다.

    GKE 워크로드 메뉴로 이동

  2. nginx 배포 이름을 클릭합니다.

  3. 작업 > 자동 확장을 클릭합니다.

  4. 삭제를 클릭합니다.

kubectl delete

nginx HPA를 삭제하려면 다음 명령어를 사용합니다.

kubectl delete hpa nginx

HPA를 삭제하면 배포 또는 다른 배포 객체가 기존 규모로 유지되며 배포의 원본 매니페스트에서 복제본 수로 되돌아가지 않습니다. 배포를 다시 3개의 pod로 수동 확장하려면 kubectl scale 명령어를 사용합니다.

kubectl scale deployment nginx --replicas=3

삭제

  1. HPA를 삭제하지 않은 경우 삭제합니다.

    kubectl delete hpa nginx
    
  2. nginx 배포를 삭제합니다.

    kubectl delete deployment nginx
    
  3. 선택적으로 클러스터를 삭제합니다.

다음 단계