리소스 빈 패킹

리소스 빈 패킹 (Resource Bin Packing)

참고: 이 문서는 단일 Pod 스케줄링 맥락의 리소스 빈 패킹에 관한 내용이에요. Pod 그룹을 스케줄링할 때의 빈 패킹은 Topology-aware Scheduling 문서를 읽어보세요.

kube-scheduler의 scheduling-plugin NodeResourcesFit에는 리소스 빈 패킹을 지원하는 두 가지 점수화 전략이 있어요: MostAllocatedRequestedToCapacityRatio.

MostAllocated 전략으로 빈 패킹 활성화

MostAllocated 전략은 리소스 활용률을 기준으로 노드에 점수를 매기며, 할당이 더 높은 노드를 선호해요. 각 리소스 유형에 가중치(weight)를 설정해 노드 점수에 미치는 영향력을 수정할 수 있어요.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - pluginConfig:
      - args:
          scoringStrategy:
            resources:
              - name: cpu
                weight: 1
              - name: memory
                weight: 1
              - name: intel.com/foo
                weight: 3
              - name: intel.com/bar
                weight: 3
            type: MostAllocated
        name: NodeResourcesFit

이 구성에서는 네 가지 리소스 모두의 활용률에 대해 가중 평균으로 노드에 점수를 매겨요. intel.com/foointel.com/bar는 CPU/메모리의 1에 비해 3의 가중치를 가지므로, 그 확장 리소스의 활용률이 최종 노드 점수에 3배 더 크게 영향을 줘요. 스케줄러는 가장 점수가 높은 노드를 선택해 활용률이 높은 노드에 Pod를 배치하려고 하고, 이는 가장 활용률이 낮은 노드의 스케일다운을 준비하는 데 도움을 줘요.

RequestedToCapacityRatio 전략으로 빈 패킹 활성화

RequestedToCapacityRatio 전략은 사용자가 각 리소스에 가중치를 지정하고 request-to-capacity 비율을 기준으로 노드에 점수를 매기게 해줘요. scoringStrategy 필드 안에 requestedToCapacityRatioresources 두 파라미터를 구성할 수 있어요.

requestedToCapacityRatioshapeutilizationscore 값에 기반해 최소 요청(least requested) 또는 최대 요청(most requested)으로 함수를 조정하게 해줘요. resources 파라미터는 점수화 중 고려할 리소스의 name과 그 대응 weight를 포함해요.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - pluginConfig:
      - args:
          scoringStrategy:
            resources:
              - name: intel.com/foo
                weight: 3
              - name: intel.com/bar
                weight: 3
            requestedToCapacityRatio:
              shape:
                - utilization: 0
                  score: 0
                - utilization: 100
                  score: 10
            type: RequestedToCapacityRatio
        name: NodeResourcesFit

이 예시에서는 확장 리소스 두 개만 resources에 나열돼 있어서, NodeResourcesFit 플러그인은 그 두 리소스의 활용률만으로 노드에 점수를 매겨요. utilization이 증가할수록 점수가 높아지므로, 스케줄러는 이미 이 확장 리소스가 더 많이 사용 중인 노드를 선호하고, 요청을 가능한 한 적은 노드에 빈 패킹해요.

kube-scheduler 플래그 --config=/path/to/config/fileKubeSchedulerConfiguration 파일을 전달하면 설정이 스케줄러에 적용돼요.

점수 함수 튜닝

shapeRequestedToCapacityRatio 함수의 동작을 지정해요.

shape:
  - utilization: 0
    score: 0
  - utilization: 100
    score: 10

위 설정은 utilization 0%에서 점수 0, 100%에서 점수 10을 주어 빈 패킹 동작을 활성화해요. least requested를 활성화하려면 점수를 반대로 하면 돼요 (utilization: 0score: 10, utilization: 100score: 0).

resources는 선택 파라미터로 기본값은 다음과 같아요.

resources:
  - name: cpu
    weight: 1
  - name: memory
    weight: 1

weight는 선택이며 지정하지 않으면 1로 설정돼요. 음수로는 설정할 수 없어요.

용량 할당을 위한 노드 점수화

내부 동작을 이해하고 싶은 분들을 위한 예시예요. 요청된 리소스가 intel.com/foo: 2, memory: 256MB, cpu: 2이고 가중치가 intel.com/foo: 5, memory: 1, cpu: 3일 때, Node 1(가용 foo:4, memory:1GB, cpu:8, 사용 foo:1, memory:256MB, cpu:1)은:

intel.com/foo = resourceScoringFunction((2+1),4) = (100 - ((4-3)*100/4)) = 75
              = rawScoringFunction(75) = 7
memory        = resourceScoringFunction((256+256),1024) = 50
              = rawScoringFunction(50) = 5
cpu           = resourceScoringFunction((2+1),8) = 37.5
              = rawScoringFunction(37.5) = 3
NodeScore = ((7 * 5) + (5 * 1) + (3 * 3)) / (5 + 1 + 3) = 5

더 알아보기 (Learn more)