수평형 포드 자동 확장 구성


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

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

HorizontalPodAutoscaler 객체용 API 버전

Google Cloud 콘솔을 사용하면 HorizontalPodAutoscaler 객체가 autoscaling/v2 API를 사용하여 생성됩니다.

kubectl을 사용하여 수평형 포드 자동 확장 처리에 대한 정보를 만들거나 볼 때 autoscaling/v1 API 또는 autoscaling/v2 API를 지정할 수 있습니다.

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

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

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

apiVersion: autoscaling/v2을 사용하는 수평형 포드 자동 확장 처리 세부정보를 확인할 때 사용할 API를 지정할 수 있습니다.

배포 예시 만들기

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

다음 항목을 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개의 포드가 배포됩니다. kubectl get deployment nginx 명령어를 사용하여 확인할 수 있습니다.

이 주제의 각 예시에서는 다른 수평형 포드 자동 확장 처리를 nginx 배포 예시에 적용합니다.

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

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

Google Cloud 콘솔, kubectl apply 명령어를 사용하거나 평균 CPU만 해당되는 경우 kubectl autoscale 명령어를 사용하여 CPU를 타겟팅하는 수평형 포드 자동 확장 처리를 만들 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  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 사용률만 대상으로 하는 HorizontalPodAutoscaler 객체를 만들려면 kubectl autoscale 명령어를 사용하면 됩니다.

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

클러스터에서 수평형 포드 자동 확장 처리 목록을 가져오려면 다음 명령어를 사용합니다.

kubectl get hpa

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

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

수평형 포드 자동 확장 처리의 세부정보를 확인하려면 Google Cloud 콘솔 또는 kubectl 명령어를 사용하면 됩니다.

콘솔

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

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

  3. 자동 확장 처리 섹션에서 수평형 포드 자동 확장 처리 구성을 확인합니다.

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

kubectl get

수평형 포드 자동 확장 처리에 대한 세부정보를 가져오려면 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

수평형 포드 자동 확장 처리를 삭제해도 배포의 복제본 수는 동일하게 유지됩니다. 수평형 포드 자동 확장 처리가 적용되기 전에 배포가 자동으로 원래 상태로 되돌아가지 않습니다.

수평형 포드 자동 확장 처리 삭제에 대해 자세히 알아보세요.

부하 분산기 트래픽 기반 자동 확장

트래픽 기반 자동 확장은 포드 자동 확장을 위해 부하 분산기의 트래픽 사용률 신호를 통합하는 GKE 기능입니다.

트래픽이 CPU 및 메모리에 상호 보완적인 부하에 대한 선행 지표이므로 트래픽을 자동 확장 신호로 사용하는 것이 도움이 됩니다. GKE와의 기본 제공 통합은 설정을 쉽게 수행하고 자동 확장이 트래픽 급증에 빠르게 대응해서 요구를 충족시킬 수 있게 해줍니다.

트래픽 기반 자동 확장은 게이트웨이 컨트롤러 및 해당 전역 트래픽 관리 기능으로 사용 설정됩니다. 자세한 내용은 트래픽 기반 자동 확장을 참조하세요.

부하 분산기 트래픽 기반의 자동 확장은 게이트웨이 워크로드에서만 사용할 수 있습니다.

요구사항

트래픽 기반 자동 확장의 요구사항은 다음과 같습니다.

  • GKE 버전 1.24 이상에서 지원됩니다.
  • GKE 클러스터에서 게이트웨이 API가 사용 설정됩니다.
  • Gateway API와 gke-l7-global-external-managed, gke-l7-regional-external-managed, gke-l7-rilb, gke-l7-gxlb GatewayClass 중 하나를 사용하여 배포된 부하 분산기를 통과하는 트래픽에 지원됩니다.

제한사항

트래픽 기반 자동 확장의 제한사항은 다음과 같습니다.

  • 멀티 클러스터 GatewayClass(gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-rilb-mc, gke-l7-gxlb-mc)에서는 지원되지 않습니다.
  • ClusterIP 또는 LoadBalancer 유형의 서비스를 사용하는 트래픽에는 지원되지 않습니다.

트래픽 기반 자동 확장 배포

다음 연습에서는 HorizontalPodAutoscaler를 사용해서 수신되는 트래픽을 기반으로 store-autoscale 배포를 자동 확장합니다. 게이트웨이는 포드에 대해 인터넷에서 인그레스 트래픽을 수락합니다. 자동 확장 처리는 게이트웨이의 트래픽 신호를 store-autoscale 서비스 리소스에 구성된 포드별 트래픽 용량과 비교합니다. 게이트웨이에 트래픽을 생성하면 배포된 포드 수에 영향을 줍니다.

다음 다이어그램은 트래픽 기반 자동 확장의 작동 방법을 보여줍니다.

트래픽 기반 자동 확장

트래픽 기반 자동 확장을 배포하려면 다음 단계를 수행합니다.

  1. Standard 클러스터의 경우 GatewayClass가 클러스터에 설치되어 있는지 확인합니다. Autopilot 클러스터의 경우 GatewayClass는 기본적으로 설치됩니다.

    kubectl get gatewayclass
    

    GKE GatewayClass 리소스를 클러스터에서 사용할 준비가 되었는지 출력으로 확인됩니다.

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    이 출력이 표시되지 않으면 GKE 클러스터에서 Gateway API를 사용 설정합니다.

  2. 샘플 애플리케이션과 게이트웨이 부하 분산기를 클러스터에 배포합니다.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    샘플 애플리케이션은 다음 항목을 만듭니다.

    • 복제본이 2개인 배포
    • max-rate-per-endpoint10으로 설정된 서비스 용량 이 기능은 미리보기에 있지만 서비스의 주석을 사용합니다. 이 기능이 정식 버전으로 제공되면 서비스 정책이 주석을 대체합니다. 게이트웨이 기능에 대한 자세한 내용은 GatewayClass 기능을 참조하세요.
    • 인터넷에서 애플리케이션에 액세스하기 위한 외부 게이트웨이. 게이트웨이 부하 분산기 사용 방법은 게이트웨이 배포를 참조하세요.
    • 모든 트래픽을 찾아서 store-autoscale 서비스로 전송하는 HTTPRoute

    서비스 용량은 자동 확장 이벤트를 트리거하는 포드별 트래픽 양을 결정하기 때문에 트래픽 기반 자동 확장을 사용할 때 중요한 요소입니다. 서비스 주석 networking.gke.io/max-rate-per-endpoint를 사용해서 구성된 서비스 용량이며, 포드별로 초당 요청 수로 서비스에 수신되는 최대 트래픽을 정의합니다. 서비스 용량은 애플리케이션에 따라 달라집니다. 자세한 내용은 서비스 용량 확인을 참조하세요.

  3. 다음 매니페스트를 hpa.yaml로 저장합니다.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            name: "autoscaling.googleapis.com|gclb-capacity-utilization"
          target:
            averageValue: 70
            type: AverageValue
    

    이 매니페스트는 다음 속성을 사용해서 HorizontalPodAutoscaler를 기술합니다.

    • minReplicasmaxReplicas: 이 배포의 최소 및 최대 복제본 수를 설정합니다. 이 구성에서 포드 수는 복제본 1에서 10까지 확장될 수 있습니다.
    • describedObject.name: store-autoscale: 트래픽 용량을 정의하는 store-autoscale 서비스에 대한 참조입니다.
    • scaleTargetRef.name: store-autoscale: 수평형 포드 자동 확장 처리로 확장되는 리소스를 정의하는 store-autoscale 배포에 대한 참조입니다.
    • averageValue: 70: 용량 사용률의 대상 평균 값입니다. 이렇게 하면 수평형 포드 자동 확장 처리에 성장 여유가 제공되어 새 포드를 생성하는 동안 실행 중인 포드가 여분의 트래픽을 처리할 수 있습니다.

수평형 포드 자동 확장 처리는 다음과 같은 트래픽 동작을 일으킵니다.

  • 엔드포인트당 최대 비율 70%를 달성하기 위해 1~10개 복제본 사이로 포드 수가 조정됩니다. 따라서 max-rate-per-endpoint=10인 경우 포드당 7 RPS로 조정됩니다.
  • 포드당 7 RPS가 넘으면 최댓값 10개 복제본에 도달할 때까지 또는 평균 트래픽이 포드당 7 RPS가 될 때까지 포드가 확장됩니다.
  • 트래픽이 줄어들면 수평형 포드 자동 확장 처리 알고리즘을 사용해서 적절한 비율로 포드가 축소됩니다.

또한 트래픽 생성기를 배포해서 트래픽 기반 자동 확장 동작을 검증할 수 있습니다.

30 RPS에서는 배포가 5개 복제본으로 확장되므로, 각 복제본에서 이상적으로 6 RPS 트래픽이 수신되며, 이것은 포드당 60% 사용률에 해당합니다. 이것은 70% 대상 사용률 미만에 해당하므로, 포드가 적절히 확장된 것입니다. 트래픽 변동에 따라 자동 확장된 복제본 수도 변동될 수 있습니다. 복제본 수의 계산 방법에 대한 자세한 내용은 자동 확장 동작을 참조하세요.

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

커스텀 측정항목 및 외부 측정항목에 대한 수평형 포드 자동 확장 처리를 만들려면 측정항목에 기반한 포드 자동 확장 최적화를 참조하세요.

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

이 예시에서는 CPU 사용률과 packets_per_second라는 커스텀 측정항목에 기반하여 자동 확장되는 수평형 포드 자동 확장 처리를 만듭니다.

위 예시를 따랐지만 여전히 nginx라는 수평형 포드 자동 확장 처리가 있는 경우 먼저 삭제하고 이 예시를 따릅니다.

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

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

apiVersion: autoscaling/v2
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

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

수평형 포드 자동 확장 처리에 대한 세부정보 보기

수평형 포드 자동 확장 처리의 구성 및 통계를 보려면 다음 명령어를 사용하세요.

kubectl describe hpa HPA_NAME

HPA_NAMEHorizontalPodAutoscaler 객체의 이름으로 바꿉니다.

수평형 포드 자동 확장 처리에서 apiVersion: autoscaling/v2를 사용하고 여러 측정항목을 기반으로 하는 경우 kubectl describe hpa 명령어는 CPU 측정항목만 표시합니다. 모든 측정항목을 보려면 다음 명령어를 사용합니다.

kubectl describe hpa.v2.autoscaling HPA_NAME

HPA_NAMEHorizontalPodAutoscaler 객체의 이름으로 바꿉니다.

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

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

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","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>

수평형 포드 자동 확장 처리 삭제

Google Cloud 콘솔 또는 kubectl delete 명령어를 사용하여 수평형 포드 자동 확장 처리를 삭제할 수 있습니다.

콘솔

nginx 수평형 포드 자동 확장 처리를 삭제하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

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

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

  4. 삭제를 클릭합니다.

kubectl delete

nginx 수평형 포드 자동 확장 처리를 삭제하려면 다음 명령어를 사용합니다.

kubectl delete hpa nginx

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

kubectl scale deployment nginx --replicas=3

삭제

  1. 수평형 포드 자동 확장 처리를 삭제하지 않은 경우 삭제합니다.

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

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

문제 해결

수평형 포드 자동 확장 처리를 설정하면 다음과 같은 경고 메시지가 표시될 수 있습니다.

unable to fetch pod metrics for pod

일반적으로 측정항목 서버가 시작될 때 이 메시지가 표시됩니다. 그러나 경고가 계속 표시되고 포드가 워크로드에 맞게 확장되지 않는 경우 워크로드의 각 컨테이너에 대한 리소스 요청을 지정했는지 확인하세요. 수평형 포드 자동 확장에서 리소스 사용률 백분율 타겟을 사용하려면 워크로드의 각 포드에서 실행되는 각 컨테이너에서 해당 리소스에 대한 요청을 구성해야 합니다. 그렇지 않으면 수평형 포드 자동 확장 처리는 필요한 계산을 수행할 수 없으며 해당 측정항목과 관련된 작업을 수행하지 않습니다.

다음 단계