쿠버네티스(Kubernetes) 스케줄러는 오픈소스 컨테이너 오케스트레이션 플랫폼인 쿠버네티스의 핵심 구성 요소로, 정책(policy)과 토폴로지 인식(topology awareness)을 기반으로 애플리케이션의 성능, 용량, 가용성을 제어하는 역할을 담당합니다.
쿠버네티스 스케줄러는 모놀리식(monolithic) 컴포넌트로, 클러스터를 관리하는 API 서버와 분리되어 독립적으로 동작합니다. 다만 스케줄러는 어드미션 컨트롤러(admission controller)와는 다릅니다. 어드미션 컨트롤러는 쿠버네티스 API로 전달되는 요청을 가로채는 플러그인 형태의 코드를 의미합니다. 가상화 관리자 입장에서는 쿠버네티스 스케줄링을 VMware DRS(Distributed Resource Scheduler)와 같은 VM 스케줄링의 컨테이너 버전으로 이해하면 쉽습니다.
쿠버네티스 스케줄러의 작동 방식
쿠버네티스는 컨테이너를 파드(Pod) 단위로 구성해 배포하며, 파드는 노드(Node)라고 불리는 논리적 리소스 그룹 위에 배치됩니다. 워크로드별 세부 요구 사항은 API를 통해 설정할 수 있습니다. 쿠버네티스 스케줄러는 생성된 각 파드를 노드에서 이용 가능한 적절한 IT 리소스와 매칭하려 시도합니다. 또한 고가용성(HA)이 필요한 경우에는 동일한 파드의 복제본을 여러 노드에 분산 배치할 수도 있습니다.
파드의 요구 사항과 명세, 즉 어피니티(affinity) 및 안티 어피니티(anti-affinity) 규칙부터 QoS(Quality of Service) 설정까지 충족하는 하드웨어를 찾지 못하면 해당 파드는 스케줄링되지 않은 상태로 남습니다. 이후 스케줄러는 사용 가능한 머신이 나타날 때까지 스케줄링을 계속 재시도합니다.
스케줄러 구성(Configuration)
쿠버네티스 스케줄러는 FitPredicate와 PriorityFunction이라는 두 가지 정책으로 구성할 수 있습니다. 이 외에도 노드를 무작위로 선택하는 방식을 사용할 수 있는데, 이는 최소한의 연산 오버헤드로 컨테이너를 리소스에 할당하는 방법입니다.
FitPredicate
FitPredicate 정책은 필수 규칙을 따르면서, 쿠버네티스 노드에 부여된 레이블(label)을 확인하거나 특정 머신에서 이미 실행 중인 컨테이너가 요청한 리소스의 양을 감지합니다. 이를 통해 컨테이너가 해당 하드웨어 리소스의 용량을 초과하는지 판단할 수 있습니다. 만약 사용자가 리소스 요청량을 0으로 설정하면, 스케줄러는 항상 해당 노드에 새 파드를 추가할 수 있습니다.
PriorityFunction
PriorityFunction 정책은 스케줄러가 여러 시스템을 검토해 최적의 배치 대상을 탐색한 후에 적용됩니다. 파드를 지원할 수 있는 후보 노드가 여러 개 발견되면, PriorityFunction은 스케줄러에게 가장 적합한 순서대로 머신의 우선순위를 매기도록 지시합니다. 예를 들어 세 개의 노드가 모두 새 파드의 요구 사항을 충족하지만, 그중 하나가 나머지보다 가용 리소스가 더 많다면 해당 노드가 최적의 배치 대상으로 선정됩니다.
쿠버네티스 환경에서 이 두 가지 정책은 여러 머신에 걸쳐 컨테이너 워크로드의 로드 밸런싱을 실현하는 데 기여합니다. 덕분에 특정 머신에만 과도한 부하가 집중되고 다른 머신들은 유휴 상태로 방치되는 비효율을 효과적으로 방지할 수 있습니다.