kube-scheduler
kube-scheduler
쿠버네티스에서 _스케줄링(scheduling)_은 파드가 노드에 매칭되어 kubelet이 실행할 수 있게 하는 것을 말해요.
출처: 문서
본문
스케줄링 개요
스케줄러는 노드가 할당되지 않은 새로 생성된 파드를 지켜봐요. 스케줄러가 발견한 모든 파드에 대해, 스케줄러는 그 파드가 실행될 최적의 노드를 찾는 책임을 집니다. 스케줄러는 아래 설명된 스케줄링 원칙을 고려해 이 배치 결정에 도달해요.
파드가 특정 노드에 배치되는 이유를 이해하고 싶거나, 직접 커스텀 스케줄러를 구현할 계획이라면 이 페이지가 스케줄링을 배우는 데 도움이 될 거예요.
kube-scheduler
kube-scheduler는 쿠버네티스의 기본 스케줄러이며 컨트롤 플레인의 일부로 실행됩니다. kube-scheduler는 원하고 필요하다면 직접 스케줄링 구성 요소를 작성해 그 대신 사용할 수 있도록 설계되었어요.
kube-scheduler는 새로 생성되었거나 아직 스케줄되지 않은(unscheduled) 파드를 실행할 최적의 노드를 선택합니다. 파드 안의 컨테이너, 그리고 파드 자체가 서로 다른 요구 사항을 가질 수 있으므로, 스케줄러는 파드의 특정 스케줄링 요구를 충족하지 못하는 노드는 걸러냅니다. 또는 API가 파드를 만들 때 노드를 지정하게 해주지만, 이는 드물고 특수한 경우에만 합니다.
클러스터에서 파드의 스케줄링 요구 사항을 충족하는 노드를 실현 가능한(feasible) 노드라고 해요. 어떤 노드도 적합하지 않다면 스케줄러가 배치할 수 있을 때까지 파드는 스케줄되지 않은 상태로 남습니다.
스케줄러는 파드에 대한 실현 가능한 노드를 찾은 뒤, 그 실현 가능한 노드들을 점수화하는 일련의 함수를 실행하고 그중 가장 높은 점수의 노드를 골라 파드를 실행합니다. 그런 다음 스케줄러는 _바인딩(binding)_이라는 과정에서 이 결정을 API 서버에 알려줍니다.
스케줄링 결정에서 고려해야 할 요소에는 개별·집단 리소스 요구, 하드웨어/소프트웨어/정책 제약, 친화도와 반-친화도(affinity와 anti-affinity) 명세, 데이터 로컬리티, 워크로드 간 간섭 등이 있습니다.
kube-scheduler의 노드 선택
kube-scheduler는 2단계 연산으로 파드의 노드를 선택해요:
- 필터링(Filtering)
- 점수화(Scoring)
필터링 단계는 파드를 스케줄하는 것이 실현 가능한 노드 집합을 찾아요. 예를 들어 PodFitsResources 필터는 후보 노드에 파드의 특정 리소스 request를 충족할 충분한 사용 가능한 리소스가 있는지 확인합니다. 이 단계 후 노드 목록에는 적합한 노드가 들어 있으며, 보통 하나 이상입니다. 목록이 비어 있으면 그 파드는 (아직) 스케줄 가능하지 않습니다.
점수화 단계에서 스케줄러는 남은 노드의 순위를 매겨 가장 적합한 파드 배치를 선택합니다. 스케줄러는 필터링을 통과한 각 노드에 활성 점수화 규칙에 기반한 점수를 부여합니다.
마지막으로 kube-scheduler는 파드를 가장 높은 순위의 노드에 할당해요. 같은 점수의 노드가 둘 이상이면 kube-scheduler는 그중 하나를 무작위로 선택합니다.
스케줄러의 필터링·점수화 동작을 구성하는 두 가지 지원 방식이 있어요:
- 스케줄링 정책(Policies)은 필터링용 _Predicates_와 점수화용 _Priorities_를 구성하게 해준다.
- 스케줄링 프로파일(Profiles)은
QueueSort,Filter,Score,Bind,Reserve,Permit등을 포함한 다양한 스케줄링 단계를 구현하는 플러그인을 구성하게 해준다. kube-scheduler가 서로 다른 프로파일을 실행하도록 구성할 수도 있다.
더 알아보기 (Learn more)
- 스케줄러 성능 튜닝 읽어보기.
- 파드 토폴로지 분산 제약 읽어보기.
- kube-scheduler의 참조 문서 읽기.
- kube-scheduler config (v1) 참조 읽기.
- 여러 스케줄러 구성하기 알아보기.
- 토폴로지 관리 정책 알아보기.
- Pod Overhead 알아보기.
- 볼륨을 사용하는 파드의 스케줄링 알아보기: