검색

2.5. 수직 Pod 자동 스케일러를 사용하여 Pod 리소스 수준 자동 조정

download PDF

OpenShift Container Platform VPA(Vertical Pod Autoscaler Operator)는 Pod의 컨테이너에 대한 과거 및 현재의 CPU 및 메모리 리소스를 자동으로 검토한 후 확인한 사용량 값에 따라 리소스 제한 및 요청을 업데이트할 수 있습니다. VPA는 개별 CR(사용자 정의 리소스)을 사용하여 Deployment, Deployment Config, StatefulSet, Job, DaemonSet, ReplicaSet 또는 ReplicationController와 같은 워크로드 오브젝트와 연결된 모든 Pod를 프로젝트에서 업데이트합니다.

VPA를 사용하면 Pod의 최적 CPU 및 메모리 사용량을 이해하고 Pod의 라이프사이클 내내 Pod 리소스를 자동으로 유지 관리할 수 있습니다.

2.5.1. Vertical Pod Autoscaler Operator 정보

VPA(Vertical Pod Autoscaler Operator)는 API 리소스 및 CR(사용자 정의 리소스)로 구현됩니다. CR은 VPA Operator가 데몬 세트, 복제 컨트롤러 등과 같은 특정 워크로드 오브젝트와 연결된 Pod와 함께 수행해야 하는 작업을 프로젝트에서 결정합니다.

VPA Operator는 세 가지 구성 요소로 구성되며 각각 VPA 네임스페이스에 자체 Pod가 있습니다.

권장 사항
VPA 권장 사항은 현재 및 과거 리소스 사용을 모니터링하고 이 데이터를 기반으로 관련 워크로드 오브젝트의 Pod에 대한 최적 CPU 및 메모리 리소스를 결정합니다.
Updater
VPA 업데이트자는 관련 워크로드 오브젝트의 Pod에 올바른 리소스가 있는지 확인합니다. 리소스가 올바르면 업데이트 프로그램이 작업을 수행하지 않습니다. 리소스가 올바르지 않으면 업데이트 프로그램이 Pod를 종료하여 업데이트된 요청을 통해 컨트롤러에서 다시 생성할 수 있습니다.
허용 컨트롤러
VPA 승인 컨트롤러는 VPA updater 작업으로 인해 Pod가 새로 생성되었는지 또는 컨트롤러에서 재생성했는지와 관계없이 관련 워크로드 오브젝트의 각 새 Pod에 올바른 리소스 요청을 설정합니다.

기본 권장자를 사용하거나 자체 대체 권장 프로그램을 사용하여 자체 알고리즘에 따라 자동 스케일링할 수 있습니다.

기본 권장 사항은 해당 Pod의 컨테이너 및 현재 CPU 및 메모리 사용량을 자동으로 계산하고 이 데이터를 사용하여 최적화된 리소스 제한 및 요청을 확인하여 이러한 Pod가 항상 효율적으로 작동하는지 확인합니다. 예를 들어 기본 권장 사항에서는 사용 중인 리소스보다 더 많은 리소스를 요청하는 Pod의 리소스가 줄어들고 충분히 요청하지 않는 Pod의 리소스를 늘릴 것을 제안합니다.

그런 다음 VPA는 애플리케이션이 다운타임 없이 요청을 계속 제공할 수 있도록 이러한 권장 사항과 일치하지 않는 모든 Pod를 한 번에 하나씩 자동으로 삭제합니다. 그런 다음 워크로드 오브젝트는 원래 리소스 제한 및 요청을 사용하여 Pod를 재배포합니다. VPA는 변경 승인 Webhook를 사용하여 Pod가 노드에 승인되기 전에 최적화된 리소스 제한 및 요청을 사용하여 Pod를 업데이트합니다. VPA에서 Pod를 삭제하지 않으려면 필요에 따라 VPA 리소스 제한 및 요청 및 수동으로 Pod를 업데이트할 수 있습니다.

참고

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하려면 최소 두 개의 복제본을 지정해야 합니다. 이 최소값보다 더 적은 복제본을 지정하는 워크로드 오브젝트는 삭제되지 않습니다. 이러한 Pod를 수동으로 삭제하면 워크로드 오브젝트가 Pod를 재배포하면 VPA에서 새 Pod를 권장 사항으로 업데이트합니다. VPA 최소 값 변경에 표시된 대로 VerticalPodAutoscalerController 오브젝트를 수정하여 이 최소값을 변경할 수 있습니다.

예를 들어 CPU의 50%를 사용하면서 10%만 요청하는 Pod가 있는 경우, VPA는 요청하는 것보다 더 많은 CPU를 사용하고 있는 것으로 판단하고 Pod를 삭제합니다. 복제본 세트와 같은 워크로드 오브젝트는 Pod를 재시작하고 VPA는 권장 리소스로 새 Pod를 업데이트합니다.

개발자의 경우 VPA를 사용하면 각 Pod에 적절한 리소스를 제공하도록 노드에 Pod를 예약하여 수요가 많은 기간에도 Pod가 유지되도록 할 수 있습니다.

관리자는 VPA를 사용하여 Pod에서 필요 이상의 CPU 리소스를 예약하지 않도록 클러스터 리소스를 더 효율적으로 활용할 수 있습니다. VPA는 워크로드에서 실제로 사용 중인 리소스를 모니터링하고 다른 워크로드에서 용량을 사용할 수 있도록 리소스 요구 사항을 조정합니다. 또한 VPA는 초기 컨테이너 구성에 지정된 제한 및 요청 간 비율도 유지합니다.

참고

VPA 실행을 중지하거나 클러스터에서 특정 VPA CR을 삭제하는 경우 VPA에서 이미 수정한 Pod에 대한 리소스 요청은 변경되지 않습니다. 새 Pod에서는 모두 VPA에서 설정한 이전의 권장 사항 대신 워크로드 오브젝트에 정의된 리소스를 가져옵니다.

2.5.2. Vertical Pod Autoscaler Operator 설치

OpenShift Container Platform 웹 콘솔을 사용하여 VPA(Vertical Pod Autoscaler Operator)를 설치할 수 있습니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 Operator OperatorHub를 클릭합니다.
  2. 사용 가능한 Operator 목록에서 VerticalPodAutoscaler를 선택한 다음 설치를 클릭합니다.
  3. Operator 설치 페이지에서 Operator 권장 네임스페이스 옵션이 선택되어 있는지 확인합니다. 그러면 필수 openshift-vertical-pod-autoscaler 네임스페이스에 Operator가 설치됩니다. 해당 네임스페이스가 존재하지 않는 경우 자동으로 생성됩니다.
  4. 설치를 클릭합니다.

Verifiction

  1. VPA Operator 구성 요소를 나열하여 설치를 확인합니다.

    1. 워크로드 Pod로 이동합니다.
    2. 드롭다운 메뉴에서 openshift-vertical-pod-autoscaler 프로젝트를 선택하고 Pod 4개가 실행되고 있는지 확인합니다.
    3. 워크로드 배포로 이동하여 배포 4개가 실행되고 있는지 확인합니다.
  2. 선택 사항: 다음 명령을 사용하여 OpenShift Container Platform CLI에서 설치를 확인합니다.

    $ oc get all -n openshift-vertical-pod-autoscaler

    출력에는 Pod 4개와 배포 4개가 표시됩니다.

    출력 예

    NAME                                                    READY   STATUS    RESTARTS   AGE
    pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc   1/1     Running   0          3m13s
    pod/vpa-admission-plugin-default-67644fc87f-xq7k9       1/1     Running   0          2m56s
    pod/vpa-recommender-default-7c54764b59-8gckt            1/1     Running   0          2m56s
    pod/vpa-updater-default-7f6cc87858-47vw9                1/1     Running   0          2m56s
    
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    service/vpa-webhook   ClusterIP   172.30.53.206   <none>        443/TCP   2m56s
    
    NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/vertical-pod-autoscaler-operator   1/1     1            1           3m13s
    deployment.apps/vpa-admission-plugin-default       1/1     1            1           2m56s
    deployment.apps/vpa-recommender-default            1/1     1            1           2m56s
    deployment.apps/vpa-updater-default                1/1     1            1           2m56s
    
    NAME                                                          DESIRED   CURRENT   READY   AGE
    replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47   1         1         1       3m13s
    replicaset.apps/vpa-admission-plugin-default-67644fc87f       1         1         1       2m56s
    replicaset.apps/vpa-recommender-default-7c54764b59            1         1         1       2m56s
    replicaset.apps/vpa-updater-default-7f6cc87858                1         1         1       2m56s

2.5.3. Vertical Pod Autoscaler Operator 사용 정보

VPA(Vertical Pod Autoscaler Operator)를 사용하려면 클러스터에서 워크로드 오브젝트에 대한 VPA CR(사용자 정의 리소스)을 생성합니다. VPA는 해당 워크로드 오브젝트와 연결된 Pod에 가장 적합한 CPU 및 메모리 리소스를 확인하고 적용합니다. 배포, 상태 저장 세트, 작업, 데몬 세트, 복제본 세트 또는 복제 컨트롤러 워크로드 오브젝트에 VPA를 사용할 수 있습니다. VPA CR은 모니터링할 Pod와 동일한 프로젝트에 있어야 합니다.

VPA CR을 사용하여 워크로드 오브젝트를 연결하고 VPA가 작동하는 모드를 지정합니다.

  • AutoRecreate 모드는 Pod 수명 동안 VPA CPU 및 메모리 권장 사항을 자동으로 적용합니다. VPA는 권장 사항과 일치하지 않는 프로젝트의 모든 Pod를 삭제합니다. 워크로드 오브젝트에서 재배포하면 VPA는 새 Pod를 권장 사항으로 업데이트합니다.
  • Initial 모드는 Pod 생성 시에만 VPA 권장 사항을 자동으로 적용합니다.
  • Off 모드는 권장되는 리소스 제한 및 요청만 제공하며 권장 사항을 수동으로 적용할 수 있습니다. off 모드에서는 Pod를 업데이트하지 않습니다.

CR을 사용하여 VPA 평가 및 업데이트에서 특정 컨테이너를 옵트아웃할 수도 있습니다.

예를 들어 Pod에 다음과 같은 제한 및 요청이 있습니다.

resources:
  limits:
    cpu: 1
    memory: 500Mi
  requests:
    cpu: 500m
    memory: 100Mi

auto로 설정된 VPA를 생성하면 VPA에서 리소스 사용량을 확인하고 Pod를 삭제합니다. 재배포되면 Pod는 새 리소스 제한 및 요청을 사용합니다.

resources:
  limits:
    cpu: 50m
    memory: 1250Mi
  requests:
    cpu: 25m
    memory: 262144k

다음 명령을 사용하여 VPA 권장 사항을 볼 수 있습니다.

$ oc get vpa <vpa-name> --output yaml

몇 분 후 출력에는 CPU 및 메모리 요청에 대한 권장 사항이 표시되며 다음과 유사합니다.

출력 예

...
status:
...
  recommendation:
    containerRecommendations:
    - containerName: frontend
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      uncappedTarget:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 262m
        memory: "274357142"
    - containerName: backend
      lowerBound:
        cpu: 12m
        memory: 131072k
      target:
        cpu: 12m
        memory: 131072k
      uncappedTarget:
        cpu: 12m
        memory: 131072k
      upperBound:
        cpu: 476m
        memory: "498558823"
...

출력에는 권장 리소스(target), 최소 권장 리소스(lowerBound), 최고 권장 리소스(upperBound), 최신 리소스 권장 사항(uncappedTarget)이 표시됩니다.

VPA는 lowerBoundupperBound 값을 사용하여 Pod를 업데이트해야 하는지 확인합니다. Pod에 lowerBound 값보다 작거나 upperBound 값을 초과하는 리소스 요청이 있는 경우 VPA는 Pod를 종료하고 target 값을 사용하여 Pod를 다시 생성합니다.

2.5.3.1. VPA 최소 값 변경

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하고 업데이트하려면 최소 두 개의 복제본을 지정해야 합니다. 결과적으로 두 개 미만의 복제본을 지정하는 워크로드 오브젝트는 VPA에서 자동으로 작동하지 않습니다. VPA는 Pod가 VPA 외부 일부 프로세스에서 재시작되는 경우 이러한 워크로드 오브젝트에서 새 Pod를 업데이트합니다. VerticalPodAutoscalerController CR(사용자 정의 리소스)에서 minReplicas 매개변수를 수정하여 클러스터 전체 최소 값을 변경할 수 있습니다.

예를 들어 minReplicas3 으로 설정하면 VPA에서 복제본 3개 미만을 지정하는 워크로드 오브젝트의 Pod를 삭제하고 업데이트하지 않습니다.

참고

minReplicas1 로 설정하면 VPA에서 하나의 복제본만 지정하는 워크로드 오브젝트에 대한 유일한 Pod를 삭제할 수 있습니다. VPA에서 Pod를 삭제하여 리소스를 조정할 때마다 워크로드에서 다운타임을 허용할 수 있는 경우에만 이 설정을 one-replica 오브젝트에 사용해야 합니다. one-replica 오브젝트를 사용하여 원하지 않는 다운 타임을 방지하려면 podUpdatePolicyInitial 로 설정하여 VPA CR을 구성합니다. 이 CR은 VPA 외부의 일부 프로세스에 의해 재시작되는 경우에만 Pod를 업데이트하거나 애플리케이션에 적절한 시점에 Pod를 수동으로 업데이트할 수 있습니다.

VerticalPodAutoscalerController 오브젝트의 예

apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  creationTimestamp: "2021-04-21T19:29:49Z"
  generation: 2
  name: default
  namespace: openshift-vertical-pod-autoscaler
  resourceVersion: "142172"
  uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
  minReplicas: 3 1
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15

1 1
VPA가 작동할 수 있도록 워크로드 오브젝트에서 최소 복제본 수를 지정합니다. 최소 복제본보다 적은 모든 오브젝트는 VPA에서 자동으로 삭제되지 않습니다.

2.5.3.2. VPA 권장 사항 자동 적용

VPA를 사용하여 Pod를 자동으로 업데이트하려면 updateModeAuto 또는 Recreate로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

워크로드 오브젝트에 대한 Pod가 생성되면 VPA에서 컨테이너를 지속적으로 모니터링하여 CPU 및 메모리 요구 사항을 분석합니다. VPA는 CPU 및 메모리에 대한 VPA 권장 사항을 충족하지 않는 모든 Pod를 삭제합니다. 재배포되면 Pod는 VPA 권장 사항에 따라 새 리소스 제한 및 요청을 사용하여 애플리케이션에 대해 설정된 모든 Pod 중단 예산을 준수합니다. 권장 사항은 참조를 위해 VPA CR의 status 필드에 추가되어 있습니다.

참고

기본적으로 워크로드 오브젝트는 VPA에서 Pod를 자동으로 삭제하려면 최소 두 개의 복제본을 지정해야 합니다. 이 최소값보다 더 적은 복제본을 지정하는 워크로드 오브젝트는 삭제되지 않습니다. 이러한 Pod를 수동으로 삭제하면 워크로드 오브젝트가 Pod를 재배포하면 VPA에서 새 Pod를 권장 사항으로 업데이트합니다. VPA 최소 값 변경에 표시된 대로 VerticalPodAutoscalerController 오브젝트를 수정하여 이 최소값을 변경할 수 있습니다.

Auto 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Auto 또는 Recreate로 설정합니다.
  • Auto. VPA는 Pod 생성 시 리소스 요청을 할당하고 요청된 리소스가 새 권장 사항과 크게 다른 경우 기존 Pod를 종료하여 업데이트합니다.
  • Recreate. VPA는 Pod 생성 시 리소스 요청을 할당하고 요청된 리소스가 새 권장 사항과 크게 다른 경우 기존 Pod를 종료하여 업데이트합니다. 이 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
참고

VPA에서 리소스에 대한 권장 사항을 결정하고 권장 리소스를 새 Pod에 적용하려면 작동 중인 Pod가 있어야 하며 프로젝트에서 실행 중이어야 합니다.

CPU 및 메모리와 같은 워크로드의 리소스 사용량이 일관되게 유지되면 VPA에서 몇 분 내에 리소스에 대한 권장 사항을 확인할 수 있습니다. 워크로드의 리소스 사용량이 일치하지 않는 경우 VPA는 정확한 권장 사항을 수행하기 위해 VPA의 다양한 리소스 사용량 간격으로 지표를 수집해야 합니다.

2.5.3.3. Pod 생성에 VPA 권장 사항 자동 적용

VPA를 사용하여 Pod를 처음 배포할 때만 권장 리소스를 적용하려면 updateModeInitial로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

그런 다음 VPA 권장 사항을 사용하려는 워크로드 오브젝트와 연결된 모든 Pod를 수동으로 삭제합니다. Initial 모드에서 VPA는 새 리소스 권장 사항을 확인할 때 Pod를 삭제하지 않고 Pod을 업데이트하지도 않습니다.

Initial 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Initial" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Initial로 설정합니다. Pod가 생성되면 VPA에서 리소스를 할당하고 Pod 수명 동안 리소스를 변경하지 않습니다.
참고

VPA에서 권장 리소스를 결정하고 새 Pod에 권장 사항을 적용하려면 운영 Pod가 있어야 하며 프로젝트에서 실행 중이어야 합니다.

VPA에서 가장 정확한 권장 사항을 얻으려면 Pod가 실행되고 VPA가 안정될 때까지 최소 8일 동안 기다립니다.

2.5.3.4. VPA 권장 사항 수동 적용

VPA를 권장 CPU 및 메모리 값을 확인하는 데에만 사용하려면 updateModeoff로 설정하여 특정 워크로드 오브젝트에 대한 VPA CR을 생성합니다.

해당 워크로드 오브젝트에 대한 Pod가 생성되면 VPA는 컨테이너의 CPU 및 메모리 요구 사항을 분석하고 VPA CR의 status 필드에 해당 권장 사항을 기록합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않습니다.

Off 모드 VPA CR의 예

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Off" 3

1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Off로 설정합니다.

다음 명령을 사용하여 권장 사항을 볼 수 있습니다.

$ oc get vpa <vpa-name> --output yaml

권장 사항에 따라 워크로드 오브젝트를 편집하여 CPU 및 메모리 요청을 추가한 다음 권장 리소스를 사용하여 Pod를 삭제하고 재배포할 수 있습니다.

참고

VPA에서 권장 리소스를 결정하고 새 Pod에 권장 사항을 적용하려면 운영 Pod가 있어야 하며 프로젝트에서 실행 중이어야 합니다.

VPA에서 가장 정확한 권장 사항을 얻으려면 Pod가 실행되고 VPA가 안정될 때까지 최소 8일 동안 기다립니다.

2.5.3.5. VPA 권장 사항 적용에서 컨테이너 제외

워크로드 오브젝트에 컨테이너가 여러 개 있고 VPA에서 모든 컨테이너를 평가하고 해당 컨테이너에 대해 작동하지 않도록 하려면 특정 워크로드 오브젝트에 대한 VPA CR을 생성하고 resourcePolicy를 추가하여 특정 컨테이너를 옵트아웃합니다.

VPA에서 권장 리소스를 사용하여 Pod를 업데이트하면 resourcePolicy가 포함된 모든 컨테이너가 업데이트되지 않으며 VPA는 Pod의 해당 컨테이너에 대한 권장 사항을 제공하지 않습니다.

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-recommender
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment 1
    name:       frontend 2
  updatePolicy:
    updateMode: "Auto" 3
  resourcePolicy: 4
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"
1
이 VPA CR에서 관리할 워크로드 오브젝트의 유형입니다.
2
이 VPA CR에서 관리할 워크로드 오브젝트의 이름입니다.
3
모드를 Auto, Recreate 또는 Off로 설정합니다. Recreate 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
4
옵트아웃할 컨테이너를 지정하고 modeOff로 설정합니다.

예를 들면 Pod에 다음과 같이 리소스 요청 및 제한이 동일한 두 개의 컨테이너가 있습니다.

# ...
spec:
  containers:
  - name: frontend
    resources:
      limits:
        cpu: 1
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
  - name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
# ...

backend 컨테이너를 옵트아웃으로 설정하여 VPA CR을 시작하면 VPA에서 Pod를 종료한 후 frontend 컨테이너에만 적용되는 권장 리소스를 사용하여 Pod를 다시 생성합니다.

...
spec:
  containers:
    name: frontend
    resources:
      limits:
        cpu: 50m
        memory: 1250Mi
      requests:
        cpu: 25m
        memory: 262144k
...
    name: backend
    resources:
      limits:
        cpu: "1"
        memory: 500Mi
      requests:
        cpu: 500m
        memory: 100Mi
...

2.5.3.6. VPA Operator 성능 튜닝

클러스터 관리자는 VPA가 Kubernetes API 서버의 요청을 요청하는 속도를 제한하고 VPA 권장, 업데이트자, 승인 컨트롤러 구성 요소 Pod에 대한 CPU 및 메모리 리소스를 지정하도록 VPA(Vertical Pod Autoscaler Operator)의 성능을 조정할 수 있습니다.

또한 VPA CR(사용자 정의 리소스)에서 관리하는 워크로드만 모니터링하도록 VPA Operator를 구성할 수 있습니다. 기본적으로 VPA Operator는 클러스터의 모든 워크로드를 모니터링합니다. 이를 통해 VPA Operator는 모든 워크로드에 대해 8일의 기록 데이터를 작성하고 저장할 수 있습니다. 이 데이터는 Operator가 워크로드에 대해 새 VPA CR을 생성하는 경우 사용할 수 있습니다. 그러나 이로 인해 VPA Operator에서 상당한 CPU 및 메모리를 사용하므로 특히 대규모 클러스터에서 Operator가 실패할 수 있습니다. VPA CR을 사용하여 워크로드만 모니터링하도록 VPA Operator를 구성하면 CPU 및 메모리 리소스에 저장할 수 있습니다. 한 가지 단점은 실행 중인 워크로드가 있고 VPA CR을 생성하여 해당 워크로드를 관리하는 경우 VPA Operator에 해당 워크로드에 대한 기록 데이터가 없다는 것입니다. 결과적으로 초기 권장 사항은 워크로드가 잠시 실행된 후만큼 유용하지 않습니다.

이러한 튜닝을 사용하면 VPA에 최대 효율성으로 작동할 수 있는 충분한 리소스가 있고 Pod 승인이 제한되고 지연되는 것을 방지할 수 있습니다.

VerticalPodAutoscalerController CR(사용자 정의 리소스)을 편집하여 VPA 구성 요소에서 다음 튜닝을 수행할 수 있습니다.

  • 제한 및 Pod 승인 지연을 방지하려면 kube-api-qpskube-api-burst 매개변수를 사용하여 Kubernetes API 서버의 VPA 요청에 대한 queries-per-second(QPS) 및 버스트 속도를 설정합니다.
  • 충분한 CPU 및 메모리를 확인하려면 표준 cpu 및 memory 리소스 요청을 사용하여 VPA 구성 요소 Pod에 대한 CPU 및 메모리 요청을 설정합니다.
  • VPA CR에서 관리하는 워크로드만 모니터링하도록 VPA Operator를 구성하려면 권장 구성 요소에 대해 memory-saver 매개변수를 true 로 설정합니다.

다음 예제 VPA 컨트롤러 CR은 VPA API QPS 및 버스트 속도를 설정하고, 구성 요소 Pod 리소스 요청을 구성하고, 권장자에 대해 memory-savertrue 로 설정합니다.

VerticalPodAutoscalerController CR의 예

apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
  name: default
  namespace: openshift-vertical-pod-autoscaler
spec:
  deploymentOverrides:
    admission: 1
      container:
        args: 2
          - '--kube-api-qps=30.0'
          - '--kube-api-burst=40.0'
        resources:
          requests: 3
            cpu: 40m
            memory: 40Mi
    recommender: 4
      container:
        args:
          - '--kube-api-qps=20.0'
          - '--kube-api-burst=60.0'
          - '--memory-saver=true' 5
        resources:
          requests:
            cpu: 60m
            memory: 60Mi
    updater: 6
      container:
        args:
          - '--kube-api-qps=20.0'
          - '--kube-api-burst=80.0'
        resources:
          requests:
            cpu: 80m
            memory: 80Mi
  minReplicas: 2
  podMinCPUMillicores: 25
  podMinMemoryMb: 250
  recommendationOnly: false
  safetyMarginFraction: 0.15

1
VPA 승인 컨트롤러의 튜닝 매개변수를 지정합니다.
2
VPA 승인 컨트롤러의 API QPS 및 버스트 속도를 지정합니다.
  • kube-api-qps: Kubernetes API 서버에 요청할 때 초당 쿼리(QPS) 제한을 지정합니다. 기본값은 5.0 입니다.
  • kube-api-burst: Kubernetes API 서버에 요청할 때 burst 제한을 지정합니다. 기본값은 10.0 입니다.
3
VPA 승인 컨트롤러 Pod에 대한 CPU 및 메모리 요청을 지정합니다.
4
VPA 권장 사항에 대한 튜닝 매개변수를 지정합니다.
5
VPA Operator가 VPA CR을 사용하여 워크로드만 모니터링하도록 지정합니다. 기본값은 false입니다.
6
VPA 업데이트 프로그램의 튜닝 매개변수를 지정합니다.

설정이 각 VPA 구성 요소 Pod에 적용되었는지 확인할 수 있습니다.

updater Pod의 예

apiVersion: v1
kind: Pod
metadata:
  name: vpa-updater-default-d65ffb9dc-hgw44
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --min-replicas=2
    - --kube-api-qps=20.0
    - --kube-api-burst=80.0
# ...
    resources:
      requests:
        cpu: 80m
        memory: 80Mi
# ...

승인 컨트롤러 Pod의 예

apiVersion: v1
kind: Pod
metadata:
  name: vpa-admission-plugin-default-756999448c-l7tsd
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --tls-cert-file=/data/tls-certs/tls.crt
    - --tls-private-key=/data/tls-certs/tls.key
    - --client-ca-file=/data/tls-ca-certs/service-ca.crt
    - --webhook-timeout-seconds=10
    - --kube-api-qps=30.0
    - --kube-api-burst=40.0
# ...
    resources:
      requests:
        cpu: 40m
        memory: 40Mi
# ...

recommender Pod의 예

apiVersion: v1
kind: Pod
metadata:
  name: vpa-recommender-default-74c979dbbc-znrd2
  namespace: openshift-vertical-pod-autoscaler
# ...
spec:
  containers:
  - args:
    - --logtostderr
    - --v=1
    - --recommendation-margin-fraction=0.15
    - --pod-recommendation-min-cpu-millicores=25
    - --pod-recommendation-min-memory-mb=250
    - --kube-api-qps=20.0
    - --kube-api-burst=60.0
    - --memory-saver=true
# ...
    resources:
      requests:
        cpu: 60m
        memory: 60Mi
# ...

2.5.3.7. 대체 권장 사항 사용

자체 권장 사항을 사용하여 자체 알고리즘에 따라 자동 스케일링할 수 있습니다. 대체 권장 사항을 지정하지 않는 경우 OpenShift Container Platform은 기본 권장 사항을 사용합니다. 이 권장 사항은 이전 사용량을 기반으로 CPU 및 메모리 요청을 제안합니다. 모든 유형의 워크로드에 적용되는 범용 권장 정책은 없으므로 특정 워크로드에 대해 다른 권장 사항을 생성하고 배포해야 할 수 있습니다.

예를 들어, 기본 권장 사항은 컨테이너가 애플리케이션 모니터링에 사용되는 사용량 급증과 유휴 상태 지정 또는 딥 러닝 애플리케이션에 사용되는 패턴을 반복하고 반복하는 것과 같이 특정 리소스 동작을 표시하는 경우 향후 리소스 사용량을 정확하게 예측하지 못할 수 있습니다. 이러한 사용 동작과 함께 기본 권장 사항을 사용하면 애플리케이션에 대해 상당한 초과 프로비저닝 및 OOM(메모리 부족)이 종료될 수 있습니다.

참고

추천자를 만드는 방법에 대한 지침은 이 문서의 범위를 벗어납니다.

프로세스

Pod에 대체 권장자를 사용하려면 다음을 수행합니다.

  1. 대체 권장 사항에 대한 서비스 계정을 생성하고 해당 서비스 계정을 필수 클러스터 역할에 바인딩합니다.

    apiVersion: v1 1
    kind: ServiceAccount
    metadata:
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 2
    kind: ClusterRoleBinding
    metadata:
      name: system:example-metrics-reader
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:metrics-reader
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 3
    kind: ClusterRoleBinding
    metadata:
      name: system:example-vpa-actor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-actor
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    ---
    apiVersion: rbac.authorization.k8s.io/v1 4
    kind: ClusterRoleBinding
    metadata:
      name: system:example-vpa-target-reader-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-target-reader
    subjects:
    - kind: ServiceAccount
      name: alt-vpa-recommender-sa
      namespace: <namespace_name>
    1
    권장자가 배포된 네임스페이스에서 recommender에 대한 서비스 계정을 생성합니다.
    2
    recommender 서비스 계정을 metrics-reader 역할에 바인딩합니다. 권장 항목을 배포할 네임스페이스를 지정합니다.
    3
    recommender 서비스 계정을 vpa-actor 역할에 바인딩합니다. 권장 항목을 배포할 네임스페이스를 지정합니다.
    4
    recommender 서비스 계정을 vpa-target-reader 역할에 바인딩합니다. 권장 항목을 배포할 네임스페이스를 지정합니다.
  2. 클러스터에 대체 권장자를 추가하려면 다음과 유사한 Deployment 오브젝트를 생성합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alt-vpa-recommender
      namespace: <namespace_name>
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: alt-vpa-recommender
      template:
        metadata:
          labels:
            app: alt-vpa-recommender
        spec:
          containers: 1
          - name: recommender
            image: quay.io/example/alt-recommender:latest 2
            imagePullPolicy: Always
            resources:
              limits:
                cpu: 200m
                memory: 1000Mi
              requests:
                cpu: 50m
                memory: 500Mi
            ports:
            - name: prometheus
              containerPort: 8942
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop:
                  - ALL
              seccompProfile:
                type: RuntimeDefault
          serviceAccountName: alt-vpa-recommender-sa 3
          securityContext:
            runAsNonRoot: true
    1
    대체 권장 사항에 대한 컨테이너를 생성합니다.
    2
    권장 이미지를 지정합니다.
    3
    권장 사항에 대해 생성한 서비스 계정을 연결합니다.

    동일한 네임스페이스의 대체 권장 사항에 대한 새 Pod가 생성됩니다.

    $ oc get pods

    출력 예

    NAME                                        READY   STATUS    RESTARTS   AGE
    frontend-845d5478d-558zf                    1/1     Running   0          4m25s
    frontend-845d5478d-7z9gx                    1/1     Running   0          4m25s
    frontend-845d5478d-b7l4j                    1/1     Running   0          4m25s
    vpa-alt-recommender-55878867f9-6tp5v        1/1     Running   0          9s

  3. alternative recommender Deployment 오브젝트의 이름이 포함된 VPA CR을 구성합니다.

    alternative recommender를 포함하는 VPA CR의 예

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-recommender
      namespace: <namespace_name>
    spec:
      recommenders:
        - name: alt-vpa-recommender 1
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment 2
        name:       frontend

    1
    대체 권장 배포의 이름을 지정합니다.
    2
    이 VPA에서 관리할 기존 워크로드 오브젝트의 이름을 지정합니다.

2.5.4. Vertical Pod Autoscaler Operator 사용

VPA(Vertical Pod Autoscaler Operator) CR(사용자 정의 리소스)을 생성하여 VPA를 사용할 수 있습니다. CR은 VPA에서 해당 Pod에 수행할 작업을 분석하고 결정해야 하는 Pod를 나타냅니다.

사전 요구 사항

  • 자동 스케일링할 워크로드 오브젝트가 있어야 합니다.
  • 대체 권장자를 사용하려면 해당 권장자를 포함한 배포가 있어야 합니다.

프로세스

특정 워크로드 오브젝트에 대한 VPA CR을 생성하려면 다음을 수행합니다.

  1. 스케일링할 워크로드 오브젝트가 있는 프로젝트로 변경합니다.

    1. VPA CR YAML 파일을 생성합니다.

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: vpa-recommender
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind:       Deployment 1
          name:       frontend 2
        updatePolicy:
          updateMode: "Auto" 3
        resourcePolicy: 4
          containerPolicies:
          - containerName: my-opt-sidecar
            mode: "Off"
        recommenders: 5
          - name: my-recommender
      1
      이 VPA에서 관리할 워크로드 오브젝트 유형(Deployment, StatefulSet, Job, DaemonSet, ReplicaSet 또는 ReplicationController)을 지정합니다.
      2
      이 VPA에서 관리할 기존 워크로드 오브젝트의 이름을 지정합니다.
      3
      다음과 같이 VPA 모드를 지정합니다.
      • auto: 컨트롤러와 연결된 Pod에 권장 리소스를 자동으로 적용합니다. VPA는 기존 Pod를 종료하고 권장 리소스 제한 및 요청을 사용하여 새 Pod를 생성합니다.
      • recreate: 워크로드 오브젝트와 연결된 Pod에 권장 리소스를 자동으로 적용합니다. VPA는 기존 Pod를 종료하고 권장 리소스 제한 및 요청을 사용하여 새 Pod를 생성합니다. recreate 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 사용해야 합니다.
      • initial: 워크로드 오브젝트와 연결된 Pod가 생성될 때 권장 리소스를 자동으로 적용합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않습니다.
      • off: 워크로드 오브젝트와 연결된 Pod의 리소스 권장 사항만 생성합니다. VPA는 새 리소스 권장 사항을 확인할 때 Pod를 업데이트하지 않고 해당 권장 사항을 새 Pod에 적용하지도 않습니다.
      4
      선택 사항: 옵트아웃할 컨테이너를 지정하고 모드를 Off로 설정합니다.
      5
      선택 사항: alternative recommender를 지정합니다.
    2. VPA CR을 생성합니다.

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

      잠시 후 VPA는 워크로드 오브젝트와 연결된 Pod에서 컨테이너의 리소스 사용량을 확인합니다.

      다음 명령을 사용하여 VPA 권장 사항을 볼 수 있습니다.

      $ oc get vpa <vpa-name> --output yaml

      출력에는 CPU 및 메모리 요청에 대한 권장 사항이 표시되며 다음과 유사합니다.

      출력 예

      ...
      status:
      
      ...
      
        recommendation:
          containerRecommendations:
          - containerName: frontend
            lowerBound: 1
              cpu: 25m
              memory: 262144k
            target: 2
              cpu: 25m
              memory: 262144k
            uncappedTarget: 3
              cpu: 25m
              memory: 262144k
            upperBound: 4
              cpu: 262m
              memory: "274357142"
          - containerName: backend
            lowerBound:
              cpu: 12m
              memory: 131072k
            target:
              cpu: 12m
              memory: 131072k
            uncappedTarget:
              cpu: 12m
              memory: 131072k
            upperBound:
              cpu: 476m
              memory: "498558823"
      
      ...

      1
      lowerBound는 최소 권장 리소스 수준은 입니다.
      2
      target은 권장 리소스 수준입니다.
      3
      upperBound는 권장되는 최고 리소스 수준입니다.
      4
      uncappedTarget은 최신 리소스 권장 사항입니다.

2.5.5. Vertical Pod Autoscaler Operator 설치 제거

OpenShift Container Platform 클러스터에서 VPA(Vertical Pod Autoscaler Operator)를 제거할 수 있습니다. 설치 제거해도 기존 VPA CR에 의해 이미 수정된 Pod의 리소스 요청은 변경되지 않습니다. 새 Pod에서는 모두 Vertical Pod Autoscaler Operator에서 설정한 권장 사항 대신 워크로드 오브젝트에 정의된 리소스를 가져옵니다.

참고

oc delete vpa <vpa-name > 명령을 사용하여 특정 VPA CR을 제거할 수 있습니다. 리소스 요청에는 수직 Pod 자동 스케일러를 설치 제거할 때와 동일한 작업이 적용됩니다.

VPA Operator를 제거한 후 잠재적인 문제를 방지하려면 Operator와 관련된 다른 구성 요소를 제거하는 것이 좋습니다.

사전 요구 사항

  • Vertical Pod Autoscaler Operator를 설치해야 합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에서 Operator 설치된 Operator를 클릭합니다.
  2. openshift-vertical-pod-autoscaler 프로젝트로 전환합니다.
  3. VerticalPodAutoscaler Operator의 경우 옵션 메뉴 kebab 를 클릭하고 Operator 설치 제거를 선택합니다.
  4. 선택 사항: Operator와 연결된 모든 피연산자를 제거하려면 대화 상자에서 이 Operator의 모든 피연산자 인스턴스 삭제를 선택합니다.
  5. 제거를 클릭합니다.
  6. 선택 사항: OpenShift CLI를 사용하여 VPA 구성 요소를 제거합니다.

    1. VPA 네임스페이스를 삭제합니다.

      $ oc delete namespace openshift-vertical-pod-autoscaler
    2. VPA CRD(사용자 정의 리소스 정의) 오브젝트를 삭제합니다.

      $ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
      $ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
      $ oc delete crd verticalpodautoscalers.autoscaling.k8s.io

      CRD를 삭제하면 연결된 역할, 클러스터 역할 및 역할 바인딩이 제거됩니다.

      참고

      이 작업은 모든 사용자가 생성한 VPA CR 클러스터에서 제거합니다. VPA를 다시 설치하는 경우 이러한 오브젝트를 다시 생성해야 합니다.

    3. 다음 명령을 실행하여 MutatingWebhookConfiguration 오브젝트를 삭제합니다.

      $ oc delete MutatingWebhookConfiguration vpa-webhook-config
    4. VPA Operator를 삭제합니다.

      $ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.