AKS(Azure Kubernetes Service)에서 스케줄러 프로필이 있는 Bin Pack 노드(미리 보기)

이 문서에서는 트리 내 예약 플러그 인 NodeResourcesFit을 사용하여 AKS(Azure Kubernetes Service) 클러스터의 노드 사용률을 개선하기 위해 노드 팩을 bin로 만드는 방법을 알아봅니다. 기본 AKS 스케줄러는 사용률이 낮은 노드의 우선 순위를 통해 Pod 스케줄링을 하는 모드에서 작동합니다 NodeResourcesFit:LeastAllocated. AKS에서 구성 가능한 Scheduler 프로필을 사용하면 이 기본 동작을 변경하고 구성을 미세 조정하여 사용률이 높은 노드의 우선 순위를 지정할 수 있습니다. 이 설명서에서는 노드 핫 스폿을 줄이면서 사용률을 개선하기 위한 모범 사례 권장 사항을 강조하면서 세 가지 사용자 지정 스케줄러 프로필을 설명합니다.

노드 빈 압축은 노드 풀에 Pod를 분산하거나 노드를 조기에 자동 크기 조정하는 대신 노드에서 Pod 밀도를 증가시켜 리소스 사용률을 최대화하는 예약 전략입니다. Bin Packing을 사용하면 낭비되는 리소스를 최소화하고 유휴 또는 사용량이 부족한 노드를 유지 관리하는 운영 비용을 줄일 수 있습니다. 데이터가 CPU 및 메모리가 일반적으로 과도하게 요청된 리소스임을 보여 주기 때문에 노드 사용률 향상이 중요합니다. 또한 GPU 채택이 증가함에 따라 상대적인 부족과 비용으로 인해 가속기의 효율적인 사용률이 똑같이 중요해집니다.

제한점

  • AKS는 현재 타사 스케줄러 또는 트리 외부 예약 플러그 인의 배포를 관리하지 않습니다.
  • AKS는 스케줄러를 대상으로 하는 트리 내 예약 플러그 인을 aks-system 지원하지 않습니다. 이 제한은 클러스터에서 사용하도록 설정된 AKS 추가 기능에 대한 예기치 않은 변경을 방지하는 데 도움이 됩니다. 정의할 수 없는 profileaks-system라고 명명할 수 없습니다.

사전 요구 사항

  • Azure CLI 버전 2.76.0 이상. az --version을 실행하여 버전을 찾고 az upgrade를 실행하여 버전을 업그레이드합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
  • AKS 클러스터에서 실행되는 Kubernetes 버전 1.33 이상.
  • aks-preview Azure CLI 확장 버전 18.0.0b27 이상.
  • Azure 구독에 기능 플래그를 등록합니다.UserDefinedSchedulerConfigurationPreview

AKS 클러스터에서 스케줄러 프로필 구성 사용

새 AKS 클러스터 또는 기존 AKS 클러스터에서 일정 프로필 구성을 사용하도록 설정할 수 있습니다.

  1. 명령az aks create과 플래그--enable-upstream-kubescheduler-user-configuration를 사용하여 스케줄러 프로필 구성이 활성화된 AKS 클러스터를 만듭니다.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<aks-cluster-name>
    
    # Create an AKS cluster with schedule profile configuration enabled
    az aks create \
    --resource-group $RESOURCE_GROUP \ 
    --name $CLUSTER_NAME \
    --enable-upstream-kubescheduler-user-configuration \
    --generate-ssh-keys
    
  2. 만들기 프로세스가 완료되면 명령을 사용하여 클러스터에 연결합니다 az aks get-credentials .

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

스케줄러 컨트롤러 설치 확인

  • AKS 클러스터에서 기능을 사용하도록 설정한 후 명령을 사용하여 kubectl get 스케줄러 컨트롤러의 CRD(사용자 지정 리소스 정의)가 성공적으로 설치되었는지 확인합니다.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    메모

    이전 섹션에서 기능이 성공적으로 활성화되지 않은 경우 이 명령은 성공하지 못합니다.

RequestedtoCapacity 플러그인 플러그인을 사용하여 노드의 빈 패킹 구성

세 가지 프로필 중에서 노드를 RequestedToCapacityRatio 명시적 사용률에 매핑하기 위한 가장 세분화된 사용자 제어를 제공합니다. 예를 들어, 이 스케줄링 프로필은 50-85% 사용률 대역 내의 노드를 선호하고, 빈 노드를 피하고, 90% 이상의 사용률을 가진 거의 전체 노드의 우선 순위를 크게 낮추어 약간의 여유 공간을 남기도록 구성되었습니다. 이 정도의 세부 정보를 감안할 때, AKS 프로덕션 클러스터에서 노드 빈 패킹에 권장되는 점수 매기기 전략은 RequestedtoCapacity입니다.

이 구성은 CPU 사용률을 노드 선택에서 주요 요인으로 만들며, CPU가 많은 애플리케이션의 포화를 피하면서 노드를 압축합니다. 마지막으로, PodTopologySpread 플러그인을 사용하지 않도록 설정해야 합니다. 기본적으로 사용 설정된 경우, NodeResourcesFit의 가중 점수를 재정의할 수 있기 때문입니다.

  • NodeResourcesFit 는 노드에 Pod를 실행할 충분한 리소스가 있는지를 스케줄러가 평가하는 방법을 제어합니다.
  • scoringStrategy: RequestedToCapacityRatio Pod가 가설적으로 배치된 후, 요청된 리소스가 전체 노드 용량에 대해 차지하는 비율을 기준으로 노드에 점수를 매깁니다.
  • Resources 는 점수 CPUMemory 매기기를 위해 고려되는 기본 리소스를 지정합니다. 가중치 8를 사용하면 CPU 사용량이 있는 노드는 Pod 예약 주기 동안 메모리보다 8배 높은 점수를 받았습니다. 이렇게 하면 사용률이 높은 노드가 선택될 가능성이 높아집니다.
  • shape: 는 노드 사용률을 스케줄러 점수에 매핑합니다. 각 지점은 점 사이의 선형 점수를 사용하여 사용률 백분율과 해당 점수를 나타냅니다.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-RtC
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: RequestedToCapacityRatio
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
                requestedToCapacityRatio:
                  shape:
                    - utilization: 0
                      score: 0
                    - utilization: 30
                      score: 9
                    - utilization: 50
                      score: 10
                    - utilization: 85
                      score: 10
                    - utilization: 90
                      score: 5
                    - utilization: 100
                      score: 0

MostAllocated 플러그인을 사용하여 노드 빈 패킹을 구성

스케줄러 MostAllocated 를 구성하면 리소스 사용량에 따라 노드의 우선 순위가 지정됩니다. 리소스 사용률이 높을수록 노드의 점수가 높아지며, 사용되지 않는 노드를 피하고 필요할 때까지 확장을 지연합니다. 개별적으로 이 구성은 노드를 바람직한 한도 이상으로 포화시켜 제한 또는 추가 병목 현상을 유발할 위험이 있습니다.

이 구성은 CPU 사용률을 노드 선택에서 주요 요인으로 만듭니다. 일관된 동작을 보장하려면, 기본적으로 사용 설정된 경우 PodTopologySpread의 가중 점수를 재정의할 수 있기 때문에 NodeResourcesFit 플러그인을 사용하지 않도록 설정해야 합니다.

  • NodeResourcesFit 는 노드에 Pod를 실행할 충분한 리소스가 있는지를 스케줄러가 평가하는 방법을 제어합니다.
  • scoringStrategy: MostAllocated Pod 요청에 따른 점수입니다. MostAllocated 는 리소스 사용량이 많은 노드를 선호하도록 스케줄러에 지시합니다. 이 전략은 조밀한 Pod 배치를 촉진하고 더 나은 노드 사용률을 달성하는 데 도움이 됩니다.
  • Resources 는 점수 CPUMemory 매기기를 위해 고려되는 기본 리소스를 지정합니다. 가중치 8를 사용하면 CPU 사용량이 있는 노드는 Pod 예약 주기 동안 메모리보다 8배 높은 점수를 받았습니다. 이렇게 하면 사용률이 높은 노드가 선택될 가능성이 높아집니다.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1

MostAllocated 및 NodeResourcesBalancedAllocation 플러그 인을 사용하여 노드 bin 패킹 구성

이 구성은 대상 리소스의 균형 잡힌 사용량에 따라 노드를 채점하여 간단하고 효율적인 전략에 MostAllocated 일부 가드레일을 추가하는 것으로 보입니다. NodeResourcesBalancedAllocation 는 사용자 정의 비례 사용률이 있는 노드에서 Pod 배치를 장려하여 비대칭 리소스 압력으로 인한 병목 현상을 방지하면서 전반적인 효율성을 높입니다. 예를 들어, 사용되지 않은 메모리가 풍부한 CPU-바운드 노드는 CPU와 메모리 사용률의 균형이 더 잘 맞는 노드에 비해 점수가 더 낮게 매겨집니다.

  • NodeResourcesBalancedAllocation 여러 리소스의 리소스 사용이 얼마나 균형 잡혀 있는지에 따라 노드의 점수를 산정합니다. 이 플러그 인은 단일 리소스의 사용률을 극대화하는 대신 리소스 사용량이 비례하는 노드를 선호합니다.
  • Resources 는 잔액 평가 중에 고려되는 리소스를 지정합니다. CPU와 메모리 가중치가 동일하게 지정되면 두 리소스가 비슷한 수준에서 모두 사용되는 경우 노드의 점수가 더 높습니다.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA-BalancedAllocation
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
              - name: NodeResourcesBalancedAllocation
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
          - name: NodeResourcesBalancedAllocation
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesBalancedAllocationArgs
              resources:
                - name: cpu
                  weight: 1
                - name: memory
                  weight: 1

전체 AKS 클러스터에 스케줄러 프로필 할당

  1. 이름이 cpu-bin-packing-scheduler.yaml인 파일을 생성하고, CRD 이름은 upstream로 지정하세요.

  2. 명령을 사용하여 일정 구성 매니페스트를 적용합니다 kubectl apply .

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. 특정 워크로드에 대해 이 예약 메커니즘을 대상으로 지정하려면 다음 schedulerName을 사용하여 Pod 배포를 업데이트합니다.

    ...
    ...
        spec:
          schedulerName: binpacking-scheduler
    ...
    ...
    

다음 단계

AKS 스케줄러, 기타 구성 및 모범 사례에 대한 자세한 내용은 다음 리소스를 참조하세요.