KJH
K8S scheduler 본문
1. Scheduler 란
- 각 노드에서 리소스 사용률을 추적하여 Pod가 실행되어야 하는 노드를 선택합니다.
2. 동작 순서
- 스케쥴러의 동작 순서는 [filter -> Score -> binding] 순으로 진행 됩니다.
2.1 filter
- 노드의 물리적인 사용량을 모두 체크하며, Affinity 설정이 된 파드인지 점검합니다.
2.1.1 기본 설정
옵션 | 내용 |
NoVolumeZoneConflictPred | pod가 요청한 볼륨을 노드에서 사용가능한지 검토 |
MaxEBSVolumeCountPred | 연결 해야하는 EBS볼륨의 수와 구성된 제한을 초과하는지 검토 |
MaxGCEPDVolumeCountPred | 연결 해야하는 GCEPD볼륨의 수와 구성된 제한을 초과하는지 검토 |
MaxAzureDiskVolumeCountPred | 연결 해야하는 Azure볼륨의 수와 구성된 제한을 초과하는지 검토 |
MaxCSIVolumeCountPred | 연결 해야하는 CSI볼륨의 수와 구성된 제한을 초과하는지 검토 |
MatchInterPodAffinityPred | POD에 Affinity 설정이 들어있을 경우 |
NoDiskConflictPred | 요청한 볼륨과 이미 마운트된 볼륨으로 인해 포드가 노드에 장착될 수 있는지 여부를 검토 |
CheckNodeMemoryPressurePred | 메모리가 부족한 노드에겐 파드가 예약되지 않는다 |
CheckNodeDiskPressurePred | 디스크가 부족한 노드에겐 파드가 예약되지 않는다 |
CheckNodePIDPressurePred | PID가 부족한 노드에겐 파드가 예약되지 않는다 |
CheckNodeConditionPred | 네트워크, kubelet을 사용할 수 없을 경우 파드가 예약되지 않는다. |
PodToleratesNodeTaintsPred | 파드의 tolertations를 보고 tains노드를 매치해줌 |
CheckVolumeBindingPred | PVC가 결합되어 있는지 확인 |
GeneralPred |
2.2 score
score에 설정된 체크포인트에 의해 파드가 배포되기 적절한지 클러스터의 모든 노드에게 점수를 부여 합니다.
2.2.1 기본 설정
옵션 | 내용 |
SelectorSpreadPriority | 동일한 Service, StatefulSet 또는 ReplicaSet에 속하는 포드를 고려하여 여러 호스트에 포드를 분산합니다 |
LeastRequestedPriority | request 리소스가 적은 노드를 선호합니다. |
BalancedResourceAllocation | 리소스 상태가 균형이 맞는 노드를 선호합니다. abs(cpu-memory)값이 작은 노드가 순위가 높음 |
2.2.2 score 추가 설정
옵션 | 내용 |
InterPodAffinityPriority | POD에 Affinity 설정이 들어있을 경우 |
NodePreferAvoidPodsPriority | [scheduler.alpha.kubernetes.io/preferAvoidPods]를 사용하는 서로 다른 Pod가 동일한 Node에서 실행되지 않아야 함 (가중치 10000) |
NodeAffinityPriority | NodeAffinity와 NodeSelector를 사용하는 파드에 명시된 노드는 우선순위를 가집니다. |
TaintTolerationPriority | toleration된 파드는 taint된 노드에 우선순위를 가집니다. |
ImageLocalityPriority | 해당 파드의 컨테이너 이미지가 이미 노드에서 사용중이라면, 그 이미지는 사용중인 노드를 선호합니다. |
2.2.3 score의 리소스 계산식
LeastRequestedPriority
LeastRequested = (CPU(capacity-sum(pod_requested))*10/capacity+ MEM(capacity-sum(pod_requested))*10/capacity)/2 |
BalancedResourceAllocation
fractionOfCapacity = float64(requested) / float64(capacity) cpuFraction := fractionOfCapacity(totalResources.MilliCPU, allocatableResources.MilliCPU) memoryFraction := fractionOfCapacity(totalResources.Memory, allocatableResources.Memory) score = 10 - abs(cpuFraction-memoryFraction)*10 |
2.3 binding
- score의 결과에 따라 점수가 높은곳으로 파드가 배포되는 단계입니다.
※ 이미지 출처
1. https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/
'Kubernetes' 카테고리의 다른 글
K8S Volume (0) | 2021.10.06 |
---|---|
K8S Ingress (0) | 2021.10.04 |
K8S Service (0) | 2021.10.02 |
K8S Pod (0) | 2021.09.25 |
K8S 소개 (0) | 2021.09.22 |