4.9. 클러스터 자동 스케일러 정보
클러스터 자동 스케일러는 현재 배포 요구 사항에 따라 OpenShift Container Platform 클러스터의 크기를 조정합니다. 이는 Kubernetes 형식의 선언적 인수를 사용하여 특정 클라우드 공급자의 개체에 의존하지 않는 인프라 관리를 제공합니다. 클러스터 자동 스케일러에는 클러스터 범위가 있으며 특정 네임 스페이스와 연결되어 있지 않습니다.
리소스가 부족하여 현재 작업자 노드에서 Pod를 예약할 수 없거나 배포 요구를 충족하기 위해 다른 노드가 필요한 경우 클러스터 자동 스케일러는 클러스터 크기를 늘립니다. 클러스터 자동 스케일러는 사용자가 지정한 제한을 초과하여 클러스터 리소스를 늘리지 않습니다.
클러스터 자동 스케일러는 컨트롤 플레인 노드를 관리하지 않더라도 클러스터의 모든 노드에서 총 메모리, CPU 및 GPU를 계산합니다. 이러한 값은 단일 시스템 지향이 아닙니다. 이는 전체 클러스터에 있는 모든 리소스를 집계한 것입니다. 예를 들어 최대 메모리 리소스 제한을 설정하면 현재 메모리 사용량을 계산할 때 클러스터 자동 스케일러에 클러스터의 모든 노드가 포함됩니다. 그런 다음 이 계산은 클러스터 자동 스케일러에 더 많은 작업자 리소스를 추가할 수 있는 용량이 있는지 확인하는 데 사용됩니다.
작성한 ClusterAutoscaler
리솟스 정의의 maxNodesTotal
값이 클러스터에서 예상되는 총 머신 수를 대응하기에 충분한 크기의 값인지 확인합니다. 이 값에는 컨트롤 플레인 머신 수 및 확장 가능한 컴퓨팅 머신 수가 포함되어야 합니다.
10초마다 클러스터 자동 스케일러는 클러스터에서 불필요한 노드를 확인하고 제거합니다. 다음 조건이 적용되는 경우 클러스터 자동 스케일러는 노드가 제거되도록 간주합니다.
-
노드 사용률은 클러스터의 노드 사용률 수준 임계값보다 적습니다. 노드 사용률 수준은 요청된 리소스의 합계를 노드에 할당된 리소스로 나눈 값입니다.
ClusterAutoscaler
사용자 지정 리소스에서 값을 지정하지 않으면 클러스터 자동 스케일러는 기본값0.5
를 사용하며 이는 사용률 50%에 해당합니다. - 클러스터 자동 스케일러는 노드에서 실행 중인 모든 Pod를 다른 노드로 이동할 수 있습니다. Kubernetes 스케줄러는 노드에 Pod를 예약해야 합니다.
- 클러스터 자동 스케일러에는 축소 비활성화 주석이 없습니다.
노드에 다음 유형의 pod가 있는 경우 클러스터 자동 스케일러는 해당 노드를 제거하지 않습니다.
- 제한적인 PDB (Pod Disruption Budgets)가 있는 pod
- 기본적으로 노드에서 실행되지 않는 Kube 시스템 pod
- PDB가 없거나 제한적인 PDB가있는 Kube 시스템 pod
- deployment, replica set 또는 stateful set와 같은 컨트롤러 객체가 지원하지 않는 pod
- 로컬 스토리지가 있는 pod
- 리소스 부족, 호환되지 않는 노드 선택기 또는 어피니티(affinity), 안티-어피니티(anti-affinity) 일치 등으로 인해 다른 위치로 이동할 수 없는 pod
-
"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"
주석이없는 경우"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
주석이 있는 pod
예를 들어 최대 CPU 제한을 64코어로 설정하고 각각 코어가 8개인 머신만 생성하도록 클러스터 자동 스케일러를 구성합니다. 클러스터가 30개의 코어로 시작하는 경우 클러스터 자동 스케일러는 총 62개에 대해 32개의 코어가 있는 노드를 최대 4개까지 추가할 수 있습니다.
클러스터 자동 스케일러를 구성하면 추가 사용 제한이 적용됩니다.
- 자동 스케일링된 노드 그룹에 있는 노드를 직접 변경하지 마십시오. 동일한 노드 그룹 내의 모든 노드는 동일한 용량 및 레이블을 가지며 동일한 시스템 pod를 실행합니다.
- pod 요청을 지정합니다.
- pod가 너무 빨리 삭제되지 않도록 해야 하는 경우 적절한 PDB를 구성합니다.
- 클라우드 제공자 할당량이 구성하는 최대 노드 풀을 지원할 수 있는 충분한 크기인지를 확인합니다.
- 추가 노드 그룹 Autoscaler, 특히 클라우드 제공자가 제공하는 Autoscaler를 실행하지 마십시오.
HPA (Horizond Pod Autoscaler) 및 클러스터 자동 스케일러는 다른 방식으로 클러스터 리소스를 변경합니다. HPA는 현재 CPU 로드를 기준으로 배포 또는 복제 세트의 복제 수를 변경합니다. 로드가 증가하면 HPA는 클러스터에 사용 가능한 리소스 양에 관계없이 새 복제본을 만듭니다. 리소스가 충분하지 않은 경우 클러스터 자동 스케일러는 리소스를 추가하고 HPA가 생성한 pod를 실행할 수 있도록 합니다. 로드가 감소하면 HPA는 일부 복제를 중지합니다. 이 동작으로 일부 노드가 충분히 활용되지 않거나 완전히 비어 있을 경우 클러스터 자동 스케일러가 불필요한 노드를 삭제합니다.
클러스터 자동 스케일러는 pod 우선 순위를 고려합니다. Pod 우선 순위 및 선점 기능을 사용하면 클러스터에 충분한 리소스가 없는 경우 우선 순위에 따라 pod를 예약할 수 있지만 클러스터 자동 스케일러는 클러스터에 모든 pod를 실행하는 데 필요한 리소스가 있는지 확인합니다. 두 기능을 충족하기 위해 클러스터 자동 스케일러에는 우선 순위 컷오프 기능이 포함되어 있습니다. 이 컷오프 기능을 사용하여 "best-effort" pod를 예약하면 클러스터 자동 스케일러가 리소스를 늘리지 않고 사용 가능한 예비 리소스가 있을 때만 실행됩니다.
컷오프 값보다 우선 순위가 낮은 pod는 클러스터가 확장되지 않거나 클러스터가 축소되지 않도록합니다. pod를 실행하기 위해 추가된 새 노드가 없으며 이러한 pod를 실행하는 노드는 리소스를 확보하기 위해 삭제될 수 있습니다.
머신 API를 사용할 수 있는 플랫폼에서 클러스터 자동 스케일링이 지원됩니다.
4.9.1. 클러스터 자동 스케일러 리소스 정의
이 ClusterAutoscaler
리소스 정의는 클러스터 자동 스케일러의 매개 변수 및 샘플 값을 표시합니다.
apiVersion: "autoscaling.openshift.io/v1" kind: "ClusterAutoscaler" metadata: name: "default" spec: podPriorityThreshold: -10 1 resourceLimits: maxNodesTotal: 24 2 cores: min: 8 3 max: 128 4 memory: min: 4 5 max: 256 6 gpus: - type: nvidia.com/gpu 7 min: 0 8 max: 16 9 - type: amd.com/gpu min: 0 max: 4 logVerbosity: 4 10 scaleDown: 11 enabled: true 12 delayAfterAdd: 10m 13 delayAfterDelete: 5m 14 delayAfterFailure: 30s 15 unneededTime: 5m 16 utilizationThreshold: "0.4" 17 expanders: ["Random"] 18
- 1
- 클러스터 자동 스케일러가 추가 노드를 배포하도록 하려면 pod가 초과해야하는 우선 순위를 지정합니다. 32 비트 정수 값을 입력합니다.
podPriorityThreshold
값은 각 pod에 할당한PriorityClass
의 값과 비교됩니다. - 2
- 배포할 최대 노드 수를 지정합니다. 이 값은 Autoscaler가 제어하는 머신뿐 만 아니라 클러스터에 배치 된 총 머신 수입니다. 이 값이 모든 컨트롤 플레인 및 컴퓨팅 머신과
MachineAutoscaler
리소스에 지정한 총 복제본 수에 대응할 수 있을 만큼 충분한 크기의 값인지 확인합니다. - 3
- 클러스터에 배포할 최소 코어 수를 지정합니다.
- 4
- 클러스터에 배포할 최대 코어 수를 지정합니다.
- 5
- 클러스터에서 최소 메모리 크기를 GiB 단위로 지정합니다.
- 6
- 클러스터에서 최대 메모리 크기를 GiB단위로 지정합니다.
- 7
- 선택 사항: 배포할 GPU 노드 유형을 지정합니다.
nvidia.com/gpu
및amd.com/gpu
만 유효한 유형입니다. - 8
- 클러스터에 배포할 최소 GPU 수를 지정합니다.
- 9
- 클러스터에 배포할 최대 GPU 수를 지정합니다.
- 10
0
에서10
사이의 로깅 상세 정보 표시 수준을 지정합니다. 지침에는 다음 로그 수준 임계값이 제공됩니다.-
1
: (기본값) 변경 사항에 대한 기본 정보입니다. -
4
: 일반적인 문제 해결을 위한 디버그 수준 상세 정보 표시 -
9:
광범위한 프로토콜 수준 디버깅 정보입니다.
값을 지정하지 않으면 기본값
1
이 사용됩니다.-
- 11
- 12
- 클러스터 자동 스케일러가 불필요한 노드를 제거할 수 있는지 여부를 지정합니다.
- 13
- 선택 사항: 최근에 노드를 추가한 후 노드를 삭제하기 전에 대기할 기간을 지정합니다. 값을 지정하지 않으면 기본값으로
10m
이 사용됩니다. - 14
- 선택 사항: 최근에 노드가 삭제된 후 노드를 삭제하기 전에 대기할 기간을 지정합니다. 값을 지정하지 않으면 기본값
0s
가 사용됩니다. - 15
- 선택 사항: 축소 실패 후 노드를 삭제하기 전에 대기할 기간을 지정합니다. 값을 지정하지 않으면 기본값으로
3m
가 사용됩니다. - 16
- 선택 사항: 불필요한 노드를 삭제할 수 있을 때까지 기간을 지정합니다. 값을 지정하지 않으면 기본값으로
10m
이 사용됩니다. - 17
- 선택 사항: 노드 사용률 수준을 지정합니다. 이 사용률 수준의 노드는 삭제할 수 있습니다.
노드 사용률 수준은 요청된 리소스를 노드에 대해 할당된 리소스로 나눈 합계이며
"0"
보다 크지만"1"
미만이어야 합니다. 값을 지정하지 않으면 클러스터 자동 스케일러는 기본값"0.5"
를 사용하며 이는 사용률 50%에 해당합니다. 이 값을 문자열로 표현해야 합니다. - 18
- 선택 사항: 클러스터 자동 스케일러를 사용할 확장기를 지정합니다. 다음 값이 유효합니다.
-
LeastWaste
: 확장 후 유휴 CPU를 최소화하는 머신 세트를 선택합니다. 여러 머신 세트가 동일한 양의 유휴 CPU를 생성하는 경우 선택 사항으로 사용되지 않는 메모리가 최소화됩니다. -
Priority
: 사용자가 할당한 우선 순위가 가장 높은 머신 세트를 선택합니다. 이 확장기를 사용하려면 머신 세트의 우선 순위를 정의하는 구성 맵을 생성해야 합니다. 자세한 내용은 "클러스터 자동 스케일러의 우선 순위 확장기 구성"을 참조하십시오. -
random
: (기본값) 머신 세트를 임의로 선택합니다.
값을 지정하지 않으면 기본값
Random
이 사용됩니다.[LeastWaste, Priority]
형식을 사용하여 여러 확장자를 지정할 수 있습니다. 클러스터 자동 스케일러는 지정된 순서에 따라 각 확장기를 적용합니다.[LeastWaste, Priority]
예에서 클러스터 자동 스케일러는 먼저LeastWaste
기준에 따라 평가됩니다. 둘 이상의 머신 세트가LeastWaste
기준을 동일하게 충족하면 클러스터 자동 스케일러가우선 순위
기준에 따라 평가됩니다. 두 개 이상의 머신 세트가 지정된 모든 확장기를 동일하게 충족하는 경우 클러스터 자동 스케일러는 무작위로 사용할 머신을 선택합니다. -
스케일링 작업을 수행할 때 클러스터 자동 스케일러는 클러스터에서 배포할 최소 및 최대 코어 수 또는 메모리 양과 같은 ClusterAutoscaler
리소스 정의에 설정된 범위 내에 유지됩니다. 그러나 클러스터 자동 스케일러는 해당 범위 내에 있는 클러스터의 현재 값을 수정하지 않습니다.
클러스터 자동 스케일러가 노드를 관리하지 않더라도 최소 및 최대 CPU, 메모리 및 GPU 값은 클러스터의 모든 노드에서 해당 리소스를 계산하여 결정됩니다. 예를 들어 클러스터 자동 스케일러가 컨트롤 플레인 노드를 관리하지 않더라도 컨트롤 플레인 노드는 클러스터의 총 메모리에서 고려됩니다.
4.9.2. 클러스터 자동 스케일러 배포
클러스터 자동 스케일러를 배포하려면 ClusterAutoscaler
리소스의 인스턴스를 만듭니다.
프로세스
-
사용자 지정 리소스 정의가 포함된
ClusterAutoscaler
리소스에 대한 YAML 파일을 만듭니다. 다음 명령을 실행하여 클러스터에 사용자 지정 리소스를 생성합니다.
$ oc create -f <filename>.yaml 1
- 1
<filename
>은 사용자 정의 리소스 파일의 이름입니다.