Kubernetes Scheduler가 node를 선택하는 기준은 1. 노드 필터링을 거치고, 2. 노드 랭킹 점수에 따라 할당된다.
1. 노드 필터링(노드 제약 체크)
- PodFitsHostPorts: 컨테이너가 사용하는 Port 중복 체크
- PodFitsResources: Request 사용 가능한 Node
- NoDiskConflict: AWS EBS, GCE PD, ISCSI 및 Ceph 가 지원되는지
- NoVolumeZoneConflict: Volume path 등 노드에서 제한이 있는지
- MatchNodeSelector: Node selector 제약조건 만족 (특정노드만 배포)
- HostName: PodSpec의 NodeName 필드에 지정된 노드를 제외한 모든 노드
2. 노드 랭킹(priorities)
SUM(weight(k) * priorityFunc(k)) k = LeastRequestedPriority, BalancedResourceAllocation, ServiceSpreadingPriority, EqualPriority)
- LeastRequestedPriority: 새 노드가 노드에 스케줄 된 경우, (Node 전체 capacity - 이미 노드에 있는 모든 pod requests sum - 현재 pod request) / Node 전체 capacity). CPU와 Memory 동일한 가중치 적용
- BalancedResourceAllocation: 현재 pod이 배치 된 후, CPU와 Memory 사용률이 균형을 검사
- SelectorSpreadPriority: 같은 Node에있는 service, replication controller, or replica set에 속하는 Pod 수를 최소화
- CalculateAntiAffinityPriority: 특정 label에 대해 동일한 값을 갖는 노드에서 동일한 서비스에 속하는 포드의 수를 최소화
Reference: https://github.com/kubernetes/community/blob/master/contributors/devel/scheduler_algorithm.md