토폴로지 인지 스케줄링

토폴로지 인지 스케줄링 (Topology-Aware Scheduling) - 스케줄링 프레임워크

Topology-Aware Scheduling(TAS)은 고려 중인 PodGroup에 대한 최적의 배치를 찾을 수 있게 해주는 배치 스케줄링 알고리즘으로, 모든 파드가 같은 토폴로지 도메인 안에 공동 배치되도록 보장합니다. 사용자는 TAS 플러그인 구성을 변경해 자신의 특정 요구에 맞게 TAS를 조정할 수 있습니다.

출처: 문서

본문

스케줄링 프레임워크: TAS 플러그인 구성

스케줄러는 TAS 확장 지점을 구현하는 새롭고 확장된 인트리 플러그인을 포함합니다:

  • TopologyPlacement: PlacementGeneratePlugin 인터페이스를 구현한다. 요청된 토폴로지 key(PodGroup에 정의됨)의 서로 다른 값을 기반으로 노드를 그룹화해 후보 배치를 생성한다.

  • NodeResourcesFit: PlacementScorePlugin 인터페이스를 구현하도록 확장된다. 표준 파드 빈 패킹(bin-packing)과 유사한 논리에 따라 배치 내 모든 노드에 걸친 할당 비율을 기반으로 배치에 점수를 매긴다. MostAllocated 전략을 사용해 배치 내 리소스 활용을 최대화하고, 표준 파드별 플러그인 설정에서 리소스 가중치를 상속한다.

  • PodGroupPodsCount: PlacementScorePlugin 인터페이스를 구현한다. 성공적으로 스케줄링할 수 있는 PodGroup의 총 파드 수를 기반으로 후보 배치에 점수를 매긴다.

플러그인 가중치와 빈 패킹 리소스 가중치 사용자 정의

기본적으로 NodeResourcesFitPodGroupPodsCount 플러그인은 동일한 가중치(둘 다 기본 1)로 구성되어, 빈 패킹 논리와 가능한 한 많은 파드를 스케줄링하는 것 사이의 좋은 균형을 유지합니다.

KubeSchedulerConfiguration에서 이 가중치 또는 빈 패킹 전략의 리소스 가중치를 조정할 수 있습니다. 다음 예시 스니펫은 두 플러그인의 가중치를 바꾸는 방법과 NodeResourcesFit 리소스 가중치를 덮어쓰는 방법을 보여줍니다. 후자의 변경은 파드별 및 배치 점수 알고리즘 모두에 적용됩니다:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
    plugins:
      placementScore:
        enabled:
          # 1) Change the default weights of the placement score plugins
          - name: NodeResourcesFit
            weight: 2
          - name: PodGroupPodsCount
            weight: 5
    pluginConfig:
      - name: NodeResourcesFit
        args:
          # 2) Changing the scoring resource weights for both pod-by-pod and placement scoring
          # algorithms
          scoringStrategy:
            # The type will only be considered in pod-by-pod scheduling. Placement scoring always
            # uses MostAllocated strategy
            type: LeastAllocated
            # Resource weights will be used in both pod-by-pod and placement scoring algorithms
            resources:
              - name: cpu
                weight: 2
              - name: memory
                weight: 3

멀티레벨 토폴로지 배치

CompositePodGroup 기능 게이트와 scheduling.k8s.io/v1alpha3 API가 활성화되면, Topology-Aware Scheduling 플러그인은 멀티레벨 CompositePodGroup 계층에 대한 지원까지 확장합니다. 이 플러그인들은 계층적 스케줄링CompositePodGroup에 대해 호출됩니다.

후보 배치 생성

CompositePodGroup 계층으로 정의된 워크로드의 경우 TopologyPlacement 플러그인은 연속 세분화로 그룹 계층을 가로질러 하향식으로 후보 배치를 생성합니다:

  • 루트 CompositePodGroup의 경우 TopologyPlacement는 요청된 토폴로지 key의 서로 다른 값을 기반으로 노드를 그룹화해 모든 사용 가능한 클러스터 노드에 걸쳐 후보 배치를 생성합니다.
  • 하위 CompositePodGroup 또는 리프 PodGroup의 경우 TopologyPlacement는 부모 그룹이 가정한 배치 안에 한정된 후보 배치를 생성합니다. 하위 그룹이 요청한 토폴로지 key를 기반으로 해당 노드를 그룹화해 부모 그룹의 배치에서 노드 집합을 세분화합니다.

토폴로지 제약이 지정되지 않으면 TopologyPlacement 플러그인은 부모 배치와 동일한 단일 후보 배치를 생성합니다.

마찬가지로 루트 그룹이 어떤 토폴로지 제약도 지정하지 않으면, 플러그인은 클러스터의 모든 사용 가능한 노드에 해당하는 단일 후보 배치를 생성합니다. 이는 토폴로지 제약이 지정되지 않은 PodGroup API를 사용하는 단일 레벨 워크로드에도 마찬가지입니다.

배치 점수 매기기

CompositePodGroup에 대한 후보 배치에 점수를 매길 때 점수 플러그인은 단일 레벨 PodGroup의 경우와 유사한 논리를 적용합니다:

  • PodGroupPodsCount: 그 CompositePodGroup의 모든 하위 리프 PodGroup에 걸친 총 파드 수(이미 스케줄링된 것과 새로 가정된 것 모두)를 기반으로 후보 배치에 점수를 매깁니다. 하위 계층에 걸쳐 더 높은 총 파드 수를 수용할 수 있는 후보 배치가 더 높은 점수를 받습니다.
  • NodeResourcesFit: 그 CompositePodGroup의 모든 하위 PodGroup에 걸쳐 제안된 모든 파드의 리소스 요청을 집계하고, 후보 배치의 도메인 안의 모든 노드에 걸친 리소스 활용을 평가합니다.

더 알아보기 (Learn more)