리소스 빈 패킹
리소스 빈 패킹 (Resource Bin Packing)
참고: 이 문서는 단일 Pod 스케줄링 맥락의 리소스 빈 패킹에 관한 내용이에요. Pod 그룹을 스케줄링할 때의 빈 패킹은 Topology-aware Scheduling 문서를 읽어보세요.
kube-scheduler의 scheduling-plugin NodeResourcesFit에는 리소스 빈 패킹을 지원하는 두 가지 점수화 전략이 있어요: MostAllocated와 RequestedToCapacityRatio.
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/foo와 intel.com/bar는 CPU/메모리의 1에 비해 3의 가중치를 가지므로, 그 확장 리소스의 활용률이 최종 노드 점수에 3배 더 크게 영향을 줘요. 스케줄러는 가장 점수가 높은 노드를 선택해 활용률이 높은 노드에 Pod를 배치하려고 하고, 이는 가장 활용률이 낮은 노드의 스케일다운을 준비하는 데 도움을 줘요.
RequestedToCapacityRatio 전략으로 빈 패킹 활성화
RequestedToCapacityRatio 전략은 사용자가 각 리소스에 가중치를 지정하고 request-to-capacity 비율을 기준으로 노드에 점수를 매기게 해줘요. scoringStrategy 필드 안에 requestedToCapacityRatio와 resources 두 파라미터를 구성할 수 있어요.
requestedToCapacityRatio의 shape는 utilization과 score 값에 기반해 최소 요청(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/file로 KubeSchedulerConfiguration 파일을 전달하면 설정이 스케줄러에 적용돼요.
점수 함수 튜닝
shape는 RequestedToCapacityRatio 함수의 동작을 지정해요.
shape:
- utilization: 0
score: 0
- utilization: 100
score: 10
위 설정은 utilization 0%에서 점수 0, 100%에서 점수 10을 주어 빈 패킹 동작을 활성화해요. least requested를 활성화하려면 점수를 반대로 하면 돼요 (utilization: 0 → score: 10, utilization: 100 → score: 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