이번에 Kubernetes 스케줄링 관련 공부를 하면서 알게된 내용을 정리하는 글로서, 간략하게만 정리한 내용을 담고 있습니다.
용어 정리
- ActiveQ
스케줄링을 할 수 있는 Pod들이 대기하는 큐
새로 생성된 Pod 또는 BackoffQ 또는 unschedulablePods로 분류되었다가 다시 스케줄링을 할 수 있는 상태가 된 Pod가 이에 해당합니다.- BackoffQ
이전에 스케줄링을 시도했으나 일시적인 이유로 실패하고, 일정 시간동안 스케줄링을 기다리는 Pod들이 대기하는 큐- unschedulablePods
스케줄링을 시도했으나, taint 등의 이유로 그 어떤 Node에도 배치할 수 없는 Pod들
kube-scheduler는 Pod를 노드에 할당하는 제어 플레인 프로세스입니다.
새로 생성되었지만 Worker Node에 할당되지 않은 Pod들을 감시하고, 이러한 Pod들을 적합한 Worker Node에 배정하는 역할을 수행합니다.
kube-scheduler는 API 서버를 통해 nodeName 필드가 비어있는 Pod가 존재하는지 주기적으로 확인합니다.
이 때 새로 생성된 Pod를 감지하는 경우, 해당 Pod를 ActiveQ에 등록합니다.
ActiveQ에 등록된 Pod들의 조건(예: CPU/Memory 요청량, Label, Taint 등)을 충족하는 Worker Node를 선별하는 작업입니다.
Pod가 요구하는 Resource를 충족하는 Worker Node가 존재하지 않는 등의 일시적인 이유로 필터링에 실패한 경우, 해당 Pod는 backoffQ에 등록되고 일정 시간(backoff period) 이후 ActiveQ에 재등록되어 스케줄링을 다시 시도합니다.
만약 taint가 불일치하거나, Affinity 조건 불충족 등의 이유로 실패한 경우, 해당 Pod는 unschedulablePods로 분류되고, 이후 Node가 추가되거나 taint가 변경되는 등의 클러스터 이벤트가 발생했을 때 ActiveQ에 등록되며, 스케줄링을 다시 시도합니다.
Filtering을 통과한 Node들을 대상으로 점수를 부여합니다.
Node의 Resuorce 여유량, 해당 노드에 할당된 Pod 갯수 등 다양한 기준으로 점수를 부여합니다.
kube-scheduler는 가장 높은 점수를 가진 Node에 Pod를 배치하며, 만약 동일한 점수를 가진 Node가 2개 이상인 경우 랜덤으로 Node를 선택하여 Pod를 배치하게 됩니다.
Pod의 nodeName 필드에 선택된 Worker Node의 이름을 기록합니다.