2.4. 수평 Pod 자동 스케일러를 사용하여 Pod 자동 스케일링


개발자는 HPA(수평 Pod 자동 스케일러)를 사용하여 해당 복제 컨트롤러 또는 배포 구성에 속하는 Pod에서 수집한 메트릭을 기반으로 OpenShift Container Platform에서 복제 컨트롤러 또는 배포 구성의 규모를 자동으로 늘리거나 줄이는 방법을 지정할 수 있습니다. 배포, 배포 구성, 복제본 세트, 복제 컨트롤러 또는 상태 저장 세트에 대해 HPA를 생성할 수 있습니다.

사용자 정의 메트릭을 기반으로 Pod 스케일링에 대한 자세한 내용은 사용자 정의 메트릭을 기반으로 Pod 자동 스케일링을 참조하십시오.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다. 이러한 오브젝트에 대한 자세한 내용은 Understanding Deployment and DeploymentConfig objects 에서 참조하십시오.

2.4.1. 수평 Pod 자동 스케일러 이해

수평 Pod 자동 스케일러를 생성하여 실행하려는 최소 및 최대 Pod 수와 Pod에서 목표로 하는 CPU 사용률 또는 메모리 사용률을 지정할 수 있습니다.

수평 Pod 자동 스케일러를 생성하면 OpenShift Container Platform에서 Pod의 CPU 및/또는 메모리 리소스 메트릭을 쿼리합니다. 이러한 메트릭을 사용할 수 있는 경우 수평 Pod 자동 스케일러에서 현재 메트릭 사용률과 원하는 메트릭 사용률의 비율을 계산하고 그에 따라 확장 또는 축소합니다. 쿼리 및 스케일링은 정기적으로 수행되지만 메트릭을 사용할 수 있을 때까지 1~2분이 걸릴 수 있습니다.

복제 컨트롤러의 경우 이러한 스케일링은 복제 컨트롤러의 복제본과 직접적으로 일치합니다. 배포 구성의 경우 스케일링은 배포 구성의 복제본 수와 직접적으로 일치합니다. 자동 스케일링은 Complete 단계에서 최신 배포에만 적용됩니다.

OpenShift Container Platform은 리소스를 자동으로 차지하여 시작하는 동안과 같이 리소스가 급증하는 동안 불필요한 자동 스케일링을 방지합니다. unready 상태의 Pod는 확장 시 CPU 사용량이 0이고, 축소 시에는 자동 스케일러에서 Pod를 무시합니다. 알려진 메트릭이 없는 Pod는 확장 시 CPU 사용량이 0%이고, 축소 시에는 100%입니다. 이를 통해 HPA를 결정하는 동안 안정성이 향상됩니다. 이 기능을 사용하려면 준비 상태 점검을 구성하여 새 Pod를 사용할 준비가 되었는지 확인해야 합니다.

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다.

2.4.1.1. 지원되는 메트릭

수평 Pod 자동 스케일러에서는 다음 메트릭을 지원합니다.

표 2.1. 메트릭
메트릭설명API 버전

CPU 사용

사용되는 CPU 코어의 수입니다. Pod에서 요청하는 CPU의 백분율을 계산하는 데 사용할 수 있습니다.

autoscaling/v1, autoscaling/v2

메모리 사용률

사용되는 메모리의 양입니다. Pod에서 요청하는 메모리의 백분율을 계산하는 데 사용할 수 있습니다.

autoscaling/v2

중요

메모리 기반 자동 스케일링의 경우 메모리 사용량이 복제본 수에 비례하여 증가 및 감소해야 합니다. 평균적으로 다음과 같습니다.

  • 복제본 수가 증가하면 Pod당 메모리(작업 집합) 사용량이 전반적으로 감소해야 합니다.
  • 복제본 수가 감소하면 Pod별 메모리 사용량이 전반적으로 증가해야 합니다.

메모리 기반 자동 스케일링을 사용하기 전에 OpenShift Container Platform 웹 콘솔을 사용하여 애플리케이션의 메모리 동작을 확인하고 애플리케이션이 해당 요구 사항을 충족하는지 확인하십시오.

다음 예제에서는 image-registry Deployment 오브젝트의 자동 스케일링을 보여줍니다. 초기 배포에는 Pod 3개가 필요합니다. HPA 오브젝트에서 최소값을 5개로 늘립니다. Pod의 CPU 사용량이 75%에 도달하면 Pod가 7으로 증가합니다.

$ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75

출력 예

horizontalpodautoscaler.autoscaling/image-registry autoscaled

minReplicas 가 3으로 설정된 image-registry Deployment 오브젝트의 샘플 HPA

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: image-registry
  namespace: default
spec:
  maxReplicas: 7
  minReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: image-registry
  targetCPUUtilizationPercentage: 75
status:
  currentReplicas: 5
  desiredReplicas: 0

  1. 배포의 새 상태를 확인합니다.

    $ oc get deployment image-registry

    이제 배포에 Pod 5개가 있습니다.

    출력 예

    NAME             REVISION   DESIRED   CURRENT   TRIGGERED BY
    image-registry   1          5         5         config

2.4.2. HPA는 어떻게 작동합니까?

HPA(수평 Pod 자동 스케일러)는 Pod 자동 확장 개념을 확장합니다. HPA를 사용하면 로드 밸런싱된 노드 그룹을 생성하고 관리할 수 있습니다. HPA는 지정된 CPU 또는 메모리 임계값을 초과하면 Pod 수를 자동으로 늘리거나 줄입니다.

그림 2.1. HPA의 상위 수준 워크플로

워크플로우

HPA는 Kubernetes 자동 스케일링 API 그룹의 API 리소스입니다. 자동 스케일러는 동기화 기간 동안 기본값인 15초의 제어 루프로 작동합니다. 이 기간 동안 컨트롤러 관리자는 HPA에 대해 YAML 파일에 정의된 CPU, 메모리 사용률 또는 둘 다를 쿼리합니다. 컨트롤러 관리자는 HPA에서 대상으로 하는 각 Pod에 대해 CPU 또는 메모리와 같은 Pod별 리소스 지표의 리소스 지표 API에서 사용률 지표를 가져옵니다.

사용률 값 target이 설정된 경우 컨트롤러는 각 Pod의 컨테이너에서 관련 리소스 요청의 백분율로 사용률 값을 계산합니다. 그런 다음 컨트롤러는 대상 모든 Pod에서 평균 사용률을 사용하고 원하는 복제본 수를 조정하는 데 사용되는 비율을 생성합니다. HPA는 지표 서버에서 제공하는 metrics.k8s.io 에서 지표를 가져오도록 구성됩니다. 지표 평가의 동적 특성으로 인해 복제본 그룹을 확장하는 동안 복제본 수가 변동될 수 있습니다.

참고

HPA를 구현하려면 모든 대상 Pod에 해당 컨테이너에 리소스 요청이 설정되어 있어야 합니다.

2.4.3. 요청 및 제한 정보

스케줄러는 Pod의 컨테이너에 지정하는 리소스 요청을 사용하여 Pod를 배치할 노드를 결정합니다. kubelet은 컨테이너에 지정된 리소스 제한을 적용하여 컨테이너가 지정된 제한보다 많은 사용을 허용하지 않도록 합니다. kubelet은 특히 해당 컨테이너에서 사용할 해당 시스템 리소스의 요청 양을 예약합니다.

리소스 메트릭을 사용하는 방법은 무엇입니까?

Pod 사양에서는 리소스 요청(예: CPU 및 메모리)을 지정해야 합니다. HPA는 이 사양을 사용하여 리소스 사용률을 확인한 다음 대상 사용률을 확장 또는 축소합니다.

예를 들어 HPA 오브젝트는 다음 지표 소스를 사용합니다.

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60

이 예에서 HPA는 Pod의 평균 사용률을 스케일링 대상에서 60%로 유지합니다. 사용률은 현재 리소스 사용량에서 요청된 Pod 리소스에 대한 비율입니다.

2.4.4. 모범 사례

모든 Pod에는 리소스 요청이 구성되어 있어야 합니다.

HPA는 OpenShift Container Platform 클러스터에서 관찰된 CPU 또는 메모리 사용률 값을 기반으로 스케일링 결정을 내립니다. 사용률 값은 각 pod의 리소스 요청의 백분율로 계산됩니다. 누락된 리소스 요청 값은 HPA의 최적 성능에 영향을 미칠 수 있습니다.

쿨 다운 기간을 설정합니다.

수평 Pod 자동 스케일링 중에 시간 간격 없이 이벤트를 빠르게 확장할 수 있습니다. 빈번한 복제본 변동을 방지하기 위해 쿨 다운 기간을 구성합니다. stabilizationWindowSeconds 필드를 구성하여 쿨 다운 기간을 지정할 수 있습니다. 안정화 창은 계속 스케일링하는 데 사용되는 메트릭이 변경될 때 복제본 수의 변동을 제한하는 데 사용됩니다. 자동 스케일링 알고리즘은 이 창을 사용하여 이전에 원하는 상태를 유추하고 워크로드 스케일링을 원하지 않는 변경을 방지합니다.

예를 들어 scaleDown 필드에 대해 안정화 창이 지정됩니다.

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300

위의 예에서 지난 5 분 동안 원하는 모든 상태가 고려됩니다. 이렇게 하면 롤링 최대값이 대략적인데, 스케일링 알고리즘에서 포드를 자주 제거하여 나중에 동일한 Pod를 다시 생성하는 작업을 트리거할 수 있습니다.

2.4.4.1. 스케일링 정책

autoscaling/v2 API를 사용하면 수평 Pod 자동 스케일러에 스케일링 정책을 추가할 수 있습니다. 스케일링 정책은 OpenShift Container Platform HPA(수평 Pod 자동 스케일러)에서 Pod를 스케일링하는 방법을 제어합니다. 스케일링 정책을 사용하면 지정된 기간에 스케일링할 특정 수 또는 특정 백분율을 설정하여 HPA에서 Pod를 확장 또는 축소하는 비율을 제한할 수 있습니다. 또한 메트릭이 계속 변동하는 경우 이전에 계산한 원하는 상태를 사용하여 스케일링을 제어하는 안정화 기간을 정의할 수 있습니다. 동일한 스케일링 방향(확장 또는 축소)에 대해 여러 정책을 생성하여 변경 정도에 따라 사용할 정책을 결정할 수 있습니다. 반복 시간을 지정하여 스케일링을 제한할 수도 있습니다. HPA는 반복 중 Pod를 스케일링한 다음 필요에 따라 추가 반복에서 스케일링을 수행합니다.

스케일링 정책이 포함된 HPA 오브젝트 샘플

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
  behavior:
    scaleDown: 1
      policies: 2
      - type: Pods 3
        value: 4 4
        periodSeconds: 60 5
      - type: Percent
        value: 10 6
        periodSeconds: 60
      selectPolicy: Min 7
      stabilizationWindowSeconds: 300 8
    scaleUp: 9
      policies:
      - type: Pods
        value: 5 10
        periodSeconds: 70
      - type: Percent
        value: 12 11
        periodSeconds: 80
      selectPolicy: Max
      stabilizationWindowSeconds: 0
...

1
스케일링 정책의 방향, 즉 scaleDown 또는 scaleUp을 지정합니다. 이 예제에서는 축소 정책을 생성합니다.
2
스케일링 정책을 정의합니다.
3
정책이 각 반복에서 특정 Pod 수 또는 Pod 백분율로 스케일링하는지의 여부를 결정합니다. 기본값은 pods입니다.
4
각 반복 중에 Pod 수 또는 Pod 백분율 중 하나의 스케일링 양을 제한합니다. Pod 수에 따라 축소할 기본값은 없습니다.
5
스케일링 반복의 길이를 결정합니다. 기본값은 15초입니다.
6
백분율로 된 축소 기본값은 100%입니다.
7
여러 정책이 정의된 경우 먼저 사용할 정책을 결정합니다. 가장 많은 변경을 허용하는 정책을 사용하려면 Max를 지정하고, 최소 변경을 허용하는 정책을 사용하려면 Min을 지정합니다. HPA에서 해당 정책 방향으로 스케일링하지 않도록 하려면 Disabled를 지정합니다. 기본값은 Max입니다.
8
HPA에서 원하는 상태를 검토해야 하는 기간을 결정합니다. 기본값은 0입니다.
9
이 예제에서는 확장 정책을 생성합니다.
10
Pod 수에 따라 확장되는 양을 제한합니다. Pod 수 확장 기본값은 4%입니다.
11
Pod 백분율에 따라 확장되는 양을 제한합니다. 백분율로 된 확장 기본값은 100%입니다.

축소 정책의 예

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
...
  minReplicas: 20
...
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 4
        periodSeconds: 30
      - type: Percent
        value: 10
        periodSeconds: 60
      selectPolicy: Max
    scaleUp:
      selectPolicy: Disabled

이 예제에서 Pod 수가 40개를 초과하면 selectPolicy에서 요구하는 대로 해당 정책으로 인해 상당한 변경이 발생하므로 축소에 백분율 기반 정책이 사용됩니다.

Pod 복제본이 80개 있는 경우 HPA는 첫 번째 반복에서 1분(periodSeconds: 60)에 걸쳐 (type: Percentvalue: 10 매개변수에 따라) Pod 80개 중 10%에 해당하는 8개의 Pod를 줄입니다. 다음 반복에서는 Pod가 72개입니다. HPA는 나머지 Pod의 10%를 계산한 7.2개를 8개로 올림하여 Pod 8개를 축소합니다. 이후 반복할 때마다 나머지 Pod 수에 따라 스케일링할 Pod 수가 다시 계산됩니다. Pod 수가 40개 미만으로 줄어들면 Pod 기반 숫자가 백분율 기반 숫자보다 크기 때문에 Pod 기반 정책이 적용됩니다. HPA는 20개의 복제본(minReplicas)이 남아 있을 때까지 30초(periodSeconds: 30)에 걸쳐 한 번에 Pod를 4개씩 줄입니다(type: Podsvalue: 4).

selectPolicy: Disabled 매개변수를 사용하면 HPA에서 Pod를 확장하지 못합니다. 필요한 경우 복제본 세트 또는 배포 세트의 복제본 수를 조정하여 수동으로 확장할 수 있습니다.

설정되어 있는 경우 oc edit 명령을 사용하여 스케일링 정책을 확인할 수 있습니다.

$ oc edit hpa hpa-resource-metrics-memory

출력 예

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/behavior:\
'{"ScaleUp":{"StabilizationWindowSeconds":0,"SelectPolicy":"Max","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":15},{"Type":"Percent","Value":100,"PeriodSeconds":15}]},\
"ScaleDown":{"StabilizationWindowSeconds":300,"SelectPolicy":"Min","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":60},{"Type":"Percent","Value":10,"PeriodSeconds":60}]}}'
...

2.4.5. 웹 콘솔을 사용하여 수평 Pod 자동 스케일러 생성

웹 콘솔에서 Deployment 또는 DeploymentConfig 오브젝트에서 실행할 최소 및 최대 Pod 수를 지정하는 HPA(수평 Pod 자동 스케일러)를 생성할 수 있습니다. Pod에서 대상으로 하는 CPU 또는 메모리 사용량을 정의할 수도 있습니다.

참고

HPA는 Operator 지원 서비스, Knative 서비스 또는 Helm 차트의 일부인 배포에 추가할 수 없습니다.

절차

웹 콘솔에서 HPA를 생성하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 추가 를 선택하여 HorizontalPodAutoscaler 추가 양식을 엽니다.

    그림 2.2. Add HorizontalPodAutoscaler

    HorizontalPodAutoscaler 추가 양식
  3. HorizontalPodAutoscaler 추가 양식에서 이름, 최소 및 최대 Pod 제한, CPU 및 메모리 사용량을 정의하고 저장을 클릭합니다.

    참고

    CPU 및 메모리 사용량에 대한 값이 없는 경우 경고가 표시됩니다.

웹 콘솔에서 HPA를 편집하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 편집을 선택하여 Horizontal Pod Autoscaler 편집 양식을 엽니다.
  3. Horizontal Pod Autoscaler 편집 양식에서 최소 및 최대 Pod 제한과 CPU 및 메모리 사용량을 편집한 다음 저장을 클릭합니다.
참고

웹 콘솔에서 수평 Pod 자동 스케일러를 생성하거나 편집하는 동안 양식 보기에서 YAML 보기로 전환할 수 있습니다.

웹 콘솔에서 HPA를 제거하려면 다음을 수행합니다.

  1. 토폴로지 보기에서 노드를 클릭하여 측면 창을 표시합니다.
  2. 작업 드롭다운 목록에서 HorizontalPodAutoscaler 제거를 선택합니다.
  3. 확인 팝업 창에서 제거를 클릭하여 HPA를 제거합니다.

2.4.6. CLI를 사용하여 CPU 사용률에 대한 수평 Pod 자동 스케일러 생성

OpenShift Container Platform CLI를 사용하여 HPA(수평 Pod 자동 스케일러)를 생성하여 기존 배포,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 오브젝트를 자동으로 스케일링할 수 있습니다. HPA는 지정한 CPU 사용량을 유지하도록 해당 오브젝트와 연결된 Pod를 스케일링합니다.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다.

HPA는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 전체 Pod에서 지정된 CPU 사용률을 유지합니다.

CPU 사용률을 자동 스케일링할 때는 oc autoscale 명령을 사용하여 언제든지 실행하려는 최소 및 최대 Pod 수와 Pod에서 목표로 하는 평균 CPU 사용률을 지정할 수 있습니다. 최솟값을 지정하지 않으면 Pod에 OpenShift Container Platform 서버의 기본값이 지정됩니다.

특정 CPU 값을 자동 스케일링하려면 대상 CPU 및 Pod 제한을 사용하여 HorizontalPodAutoscaler 오브젝트를 생성합니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

출력 예

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

프로세스

CPU 사용률에 대한 수평 Pod 자동 스케일러를 생성하려면 다음을 수행합니다.

  1. 다음 중 하나를 수행합니다.

    • CPU 사용 백분율에 따라 스케일링하려면 기존 오브젝트에 대한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      $ oc autoscale <object_type>/<name> \1
        --min <number> \2
        --max <number> \3
        --cpu-percent=<percent> 4
      1
      자동 스케일링할 오브젝트의 유형 및 이름을 지정합니다. 오브젝트가 존재하고 배포 DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc 또는 StatefulSet 여야 합니다.
      2
      필요한 경우 축소 시 최소 복제본 수를 지정합니다.
      3
      확장 시 최대 복제본 수를 지정합니다.
      4
      요청된 CPU의 백분율로 표시되는 모든 Pod의 목표 평균 CPU 사용량을 지정합니다. 지정하지 않거나 음수가 아닌 경우 기본 자동 스케일링 정책이 사용됩니다.

      예를 들어 다음 명령은 image-registry Deployment 오브젝트의 자동 스케일링을 보여줍니다. 초기 배포에는 Pod 3개가 필요합니다. HPA 오브젝트에서 최소값을 5개로 늘립니다. Pod의 CPU 사용량이 75%에 도달하면 Pod가 7로 증가합니다.

      $ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75
    • 특정 CPU 값을 스케일링하려면 기존 오브젝트에 대해 다음과 유사한 YAML 파일을 생성합니다.

      1. 다음과 유사한 YAML 파일을 생성합니다.

        apiVersion: autoscaling/v2 1
        kind: HorizontalPodAutoscaler
        metadata:
          name: cpu-autoscale 2
          namespace: default
        spec:
          scaleTargetRef:
            apiVersion: apps/v1 3
            kind: Deployment 4
            name: example 5
          minReplicas: 1 6
          maxReplicas: 10 7
          metrics: 8
          - type: Resource
            resource:
              name: cpu 9
              target:
                type: AverageValue 10
                averageValue: 500m 11
        1
        autoscaling/v2 API를 사용합니다.
        2
        이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
        3
        스케일링할 오브젝트의 API 버전을 지정합니다.
        • Deployment,ReplicaSet,Statefulset 오브젝트는 apps/v1 을 사용합니다.
        • ReplicationController 의 경우 v1 을 사용합니다.
        • DeploymentConfig 의 경우 apps.openshift.io/v1 을 사용합니다.
        4
        오브젝트 유형을 지정합니다. 오브젝트는 Deployment DeploymentConfig/dc,ReplicaSet/rs,ReplicationController/rc 또는 StatefulSet 여야 합니다.
        5
        스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
        6
        축소 시 최소 복제본 수를 지정합니다.
        7
        확장 시 최대 복제본 수를 지정합니다.
        8
        메모리 사용률에 metrics 매개변수를 사용합니다.
        9
        CPU 사용률에 cpu를 지정합니다.
        10
        AverageValue로 설정합니다.
        11
        대상 CPU 값을 사용하여 averageValue로 설정합니다.
      2. 수평 Pod 자동 스케일러를 생성합니다.

        $ oc create -f <file-name>.yaml
  2. 수평 Pod 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get hpa cpu-autoscale

    출력 예

    NAME            REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    cpu-autoscale   Deployment/example   173m/500m       1         10        1          20m

2.4.7. CLI를 사용하여 메모리 사용률에 대한 수평 Pod 자동 스케일러 오브젝트 생성

OpenShift Container Platform CLI를 사용하여 HPA(수평 Pod 자동 스케일러)를 생성하여 기존 배포,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 오브젝트를 자동으로 스케일링할 수 있습니다. HPA는 해당 오브젝트와 연결된 Pod를 스케일링하여 사용자가 지정한 평균 메모리 사용률(직접 값 또는 요청된 메모리의 백분율)을 유지합니다.

참고

다른 오브젝트에서 제공하는 특정 기능 또는 동작이 필요하지 않는 한 Deployment 오브젝트 또는 ReplicaSet 오브젝트를 사용하는 것이 좋습니다.

HPA는 최소 및 최대 개수 사이에서 복제본 수를 늘리거나 줄여 전체 Pod에서 지정된 메모리 사용률을 유지합니다.

메모리 사용률의 경우 최소 및 최대 Pod 수와 Pod에서 목표로 해야 하는 평균 메모리 사용률을 지정할 수 있습니다. 최솟값을 지정하지 않으면 Pod에 OpenShift Container Platform 서버의 기본값이 지정됩니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-129-223.compute.internal -n openshift-kube-scheduler

출력 예

Name:         openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Cpu:     0
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2020-02-14T22:21:14Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Timestamp:             2020-02-14T22:21:14Z
Window:                5m0s
Events:                <none>

프로세스

메모리 사용률에 대한 수평 Pod 자동 스케일러를 생성하려면 다음을 수행합니다.

  1. 다음 중 하나에 대한 YAML 파일을 생성합니다.

    • 특정 메모리 값을 스케일링하려면 기존 오브젝트에 대해 다음과 유사한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: hpa-resource-metrics-memory 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: AverageValue 10
              averageValue: 500Mi 11
        behavior: 12
          scaleDown:
            stabilizationWindowSeconds: 300
            policies:
            - type: Pods
              value: 4
              periodSeconds: 60
            - type: Percent
              value: 10
              periodSeconds: 60
            selectPolicy: Max
      1
      autoscaling/v2 API를 사용합니다.
      2
      이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
      3
      스케일링할 오브젝트의 API 버전을 지정합니다.
      • Deployment,ReplicaSet, 또는 Statefulset 오브젝트는 apps/v1 을 사용합니다.
      • ReplicationController 의 경우 v1 을 사용합니다.
      • DeploymentConfig 의 경우 apps.openshift.io/v1 을 사용합니다.
      4
      오브젝트 유형을 지정합니다. 오브젝트는 Deployment,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 여야 합니다.
      5
      스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
      6
      축소 시 최소 복제본 수를 지정합니다.
      7
      확장 시 최대 복제본 수를 지정합니다.
      8
      메모리 사용률에 metrics 매개변수를 사용합니다.
      9
      메모리 사용률에 대한 메모리를 지정합니다.
      10
      유형을 AverageValue로 설정합니다.
      11
      averageValue 및 특정 메모리 값을 지정합니다.
      12
      선택 사항: 스케일링 정책을 지정하여 확장 또는 축소비율을 제어합니다.
    • 백분율로 스케일링하려면 기존 오브젝트에 다음과 유사한 HorizontalPodAutoscaler 오브젝트를 생성합니다.

      apiVersion: autoscaling/v2 1
      kind: HorizontalPodAutoscaler
      metadata:
        name: memory-autoscale 2
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 3
          kind: Deployment 4
          name: example 5
        minReplicas: 1 6
        maxReplicas: 10 7
        metrics: 8
        - type: Resource
          resource:
            name: memory 9
            target:
              type: Utilization 10
              averageUtilization: 50 11
        behavior: 12
          scaleUp:
            stabilizationWindowSeconds: 180
            policies:
            - type: Pods
              value: 6
              periodSeconds: 120
            - type: Percent
              value: 10
              periodSeconds: 120
            selectPolicy: Max
      1
      autoscaling/v2 API를 사용합니다.
      2
      이 수평 Pod 자동 스케일러 오브젝트의 이름을 지정합니다.
      3
      스케일링할 오브젝트의 API 버전을 지정합니다.
      • ReplicationController의 경우 v1 을 사용합니다.
      • DeploymentConfig의 경우 apps.openshift.io/v1 을 사용합니다.
      • Deployment, ReplicaSet, Statefulset 오브젝트는 apps/v1 을 사용합니다.
      4
      오브젝트 유형을 지정합니다. 오브젝트는 Deployment,DeploymentConfig,ReplicaSet,ReplicationController 또는 StatefulSet 여야 합니다.
      5
      스케일링할 오브젝트의 이름을 지정합니다. 오브젝트가 있어야 합니다.
      6
      축소 시 최소 복제본 수를 지정합니다.
      7
      확장 시 최대 복제본 수를 지정합니다.
      8
      메모리 사용률에 metrics 매개변수를 사용합니다.
      9
      메모리 사용률에 대한 메모리를 지정합니다.
      10
      Utilization으로 설정합니다.
      11
      averageUtilization 및 전체 Pod에 대한 대상 평균 메모리 사용률(요청 메모리의 백분율로 표시)을 지정합니다. 대상 Pod에 메모리 요청이 구성되어 있어야 합니다.
      12
      선택 사항: 스케일링 정책을 지정하여 확장 또는 축소비율을 제어합니다.
  2. 수평 Pod 자동 스케일러를 생성합니다.

    $ oc create -f <file-name>.yaml

    예를 들면 다음과 같습니다.

    $ oc create -f hpa.yaml

    출력 예

    horizontalpodautoscaler.autoscaling/hpa-resource-metrics-memory created

  3. 수평 Pod 자동 스케일러가 생성되었는지 확인합니다.

    $ oc get hpa hpa-resource-metrics-memory

    출력 예

    NAME                          REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    hpa-resource-metrics-memory   Deployment/example   2441216/500Mi   1         10        1          20m

    $ oc describe hpa hpa-resource-metrics-memory

    출력 예

    Name:                        hpa-resource-metrics-memory
    Namespace:                   default
    Labels:                      <none>
    Annotations:                 <none>
    CreationTimestamp:           Wed, 04 Mar 2020 16:31:37 +0530
    Reference:                   Deployment/example
    Metrics:                     ( current / target )
      resource memory on pods:   2441216 / 500Mi
    Min replicas:                1
    Max replicas:                10
    ReplicationController 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:
      Type     Reason                   Age                 From                       Message
      ----     ------                   ----                ----                       -------
      Normal   SuccessfulRescale        6m34s               horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

2.4.8. CLI를 사용하여 수평 Pod 자동 스케일러 상태 조건 이해

일련의 상태 조건을 사용하여 HPA(수평 Pod 자동 스케일러)에서 스케일링할 수 있는지 그리고 HPA가 현재 제한되어 있는지의 여부를 결정할 수 있습니다.

HPA 상태 조건은 Autoscaling API의 v2 버전에서 사용할 수 있습니다.

HPA는 다음과 같은 상태 조건을 통해 응답합니다.

  • AbleToScale 상태는 HPA에서 메트릭을 가져오고 업데이트할 수 있는지의 여부 및 백오프 관련 상태로 스케일링을 방지할 수 있는지의 여부를 나타냅니다.

    • True 조건은 스케일링이 허용되었음을 나타냅니다.
    • False 조건은 지정된 이유로 스케일링이 허용되지 않음을 나타냅니다.
  • ScalingActive 조건은 HPA가 활성화되어 있고(예: 대상의 복제본 수가 0이 아님) 원하는 메트릭을 계산할 수 있는지의 여부를 나타냅니다.

    • True 조건은 메트릭이 제대로 작동함을 나타냅니다.
    • False 조건은 일반적으로 메트릭을 가져오는 데 문제가 있음을 나타냅니다.
  • ScalingLimited 조건은 원하는 스케일링이 수평 Pod 자동 스케일러의 최댓값 또는 최솟값으로 제한되었음을 나타냅니다.

    • True 조건은 스케일링을 위해 최소 또는 최대 복제본 수를 늘리거나 줄여야 함을 나타냅니다.
    • False 조건은 요청된 스케일링이 허용됨을 나타냅니다.

      $ oc describe hpa cm-test

      출력 예

      Name:                           cm-test
      Namespace:                      prom
      Labels:                         <none>
      Annotations:                    <none>
      CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
      Reference:                      ReplicationController/cm-test
      Metrics:                        ( current / target )
        "http_requests" on pods:      66m / 500m
      Min replicas:                   1
      Max replicas:                   4
      ReplicationController pods:     1 current / 1 desired
      Conditions: 1
        Type              Status    Reason              Message
        ----              ------    ------              -------
        AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
        ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
        ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
      Events:

      1
      수평 Pod 자동 스케일러의 상태 메시지입니다.

다음은 스케일링할 수 없는 Pod의 예입니다.

출력 예

Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: no matches for kind "ReplicationController" in group "apps"
Events:
  Type     Reason          Age               From                       Message
  ----     ------          ----              ----                       -------
  Warning  FailedGetScale  6s (x3 over 36s)  horizontal-pod-autoscaler  no matches for kind "ReplicationController" in group "apps"

다음은 스케일링에 필요한 메트릭을 가져올 수 없는 Pod의 예입니다.

출력 예

Conditions:
  Type                  Status    Reason                    Message
  ----                  ------    ------                    -------
  AbleToScale           True     SucceededGetScale          the HPA controller was able to get the target's current scale
  ScalingActive         False    FailedGetResourceMetric    the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

다음은 요청된 자동 스케일링이 필요한 최솟값보다 적은 Pod의 예입니다.

출력 예

Conditions:
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.8.1. CLI를 사용하여 수평 Pod 자동 스케일러 상태 조건 보기

HPA(수평 Pod 자동 스케일러)를 통해 Pod에 설정된 상태 조건을 볼 수 있습니다.

참고

수평 Pod 자동 스케일러 상태 조건은 v2 버전의 autoscaling API에서 사용할 수 있습니다.

사전 요구 사항

수평 Pod 자동 스케일러를 사용하려면 클러스터 관리자가 클러스터 메트릭을 올바르게 구성해야 합니다. oc describe PodMetrics <pod-name> 명령을 사용하여 메트릭이 구성되어 있는지 확인할 수 있습니다. 메트릭이 구성된 경우 출력이 다음과 유사하게 표시되고 UsageCpuMemory가 표시됩니다.

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal

출력 예

Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>

프로세스

Pod의 상태 조건을 보려면 Pod 이름과 함께 다음 명령을 사용합니다.

$ oc describe hpa <pod-name>

예를 들면 다음과 같습니다.

$ oc describe hpa cm-test

상태가 출력의 Conditions 필드에 나타납니다.

출력 예

Name:                           cm-test
Namespace:                      prom
Labels:                         <none>
Annotations:                    <none>
CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
Reference:                      ReplicationController/cm-test
Metrics:                        ( current / target )
  "http_requests" on pods:      66m / 500m
Min replicas:                   1
Max replicas:                   4
ReplicationController pods:     1 current / 1 desired
Conditions: 1
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

2.4.9. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.