on
kubernetes (4) - scheduling
kubernetes (4) - scheduling
우리는 쿠버네티스 클러스터에서 선언형으로 파드를 노드에 배치하여 서비스를 구현할 수 있다는 것을 알게 되었다.
마스터 노드가 워커 노드 중 배치하고자 하는 파드와 잘 어울리는 친구를 찾아야하는데, 우리는 이를 스케줄링(Scheduling)이라고 한다. 그리고 이를 수행하는 요소가 바로 스케줄러(Scheduler)이다.
오늘은 적절한 노드를 찾아서 배치하는 스케줄러에 대해 알아보자.
#1. 스케줄러?
스케줄러는 새로 생성되었지만 노드가 할당되지 않은 파드를 감시한다. Pending 상태에 머무르고 있는 파드를 발견하면, 스케줄러는 해당 파드가 실행될 수 있는 가장 잘 어울리는 노드를 찾아주어야하는 책임을 가지고 있다. 우리는 기본적으로 쿠버네티스에서 제공하는 kube-scheduler를 사용할 수도 있고, 임의의 customized scheduler를 사용할 수도 있다. customized scheduler에 대해서는 나중에 다루기로하고, 오늘은 kube-scheduler가 작동하는 방법에 대해 이야기해보자.
#2. kube-scheduler
우선 편의를 위해 이 포스트에서는 kube-scheduler에 대해서만 이야기하므로 스케줄러라고 표기하겠다.
파드가 새롭게 배치를 명령받았을 때, 파드는 스케줄링 큐(Scheduling queue)에 들어가서 차례차례 스케줄링 과정을 겪게 된다. 이 때, 스케줄러는 2가지 단계를 통해 파드에 대한 노드를 선택한다.
1. 필터링 (Filtering)
2. 스코어링 (Scoring)
복잡해보이지만, 결국 필터링 과정과 스코어링 과정을 통해 스케줄링 주기가 완료가 된다는 것을 확인할 수 있다.
#2-1. 필터링 (Filtering)
필터링 단계에서는 파드를 스케줄링할 수 있는 노드들을 찾는다. 파드가 실행되기 적합한 조건을 가지고 있는지 따지기 전에, 애초에 사용할 수 있는 노드인지를 확인하는 단계이다. 여러 필터들을 통해 후보 노드가 파드의 특정한 리소스 요청을 충족시킬 수 있는 충분한 리소스가 있는지 확인하여 적합한 노드 목록을 간추려낸다.
#2-1-1. 테인트 (Taints) & 톨러레이션 (Toleration)
필터링을 위해서는 테인트(Taints)와 톨러레이션(Toleration)의 개념을 알아야 한다.
테인트는 쿠버네티스 노드에 이를 설정하여 해당 노드에 파드가 할당 또는 실행되는 것을 막을 수 있는 요소이다. 테인트의 대표적인 예시는 마스터 노드의 NoSchedule이다. 이 테인트를 통해 우리는 마스터 노드에 파드가 배치되는 것을 방지할 수 있다.
그리고 톨러레이션은 파드가 테인트가 있는 노드에 배치가 될 수 있도록 설정하는 요소이다. 톨러레이션을 이용하게 되면 마스터 노드에 설정된 NoSchedule 테인트를 감안하고 배치가 될 수 있게 만들 수 있다.
결국 이 두 가지 요소를 통해 필터링 과정으로 우리는 사용 가능한 노드의 목록을 얻을 수 있다.
#2-1-2. 특정 노드 선택과 어피니티 (Affinity)
파드의 스펙(spec) 부분에 nodeName을 추가하면 해당 이름을 가지고 있는 특정 노드에서 파드를 실행시킬 수 있다. 가장 간단하지만 yaml 파일을 직접 수정해야 하기 때문에 상당히 귀찮은 작업이다.
이를 좀 더 간단히 실행하기 위해 nodeSelector를 이용한다. 이는 특정 라벨(label)을 가지고 있는 노드에서 파드를 실행시킬 수 있도록 해준다. 앞서 이야기한 nodeName은 노드를 변경하고자 할 때마다 yaml 파일을 변경해주어야 하지만, nodeSelector를 이용하면 노드의 라벨만 변경해주면 되기 때문에 훨씬 사용하기 편리하다.
nodeSelector의 장점을 좀 더 극대화 시킨 것이 바로 어피니티이다. nodeSelector도 역시 yaml 파일에 작성된 라벨의 값을 단순 비교하여 노드에 할당하기 때문에 활용 방법이 비교적 제한적이다. 하지만 어피니티를 사용하면 soft / hard 와 같이 그 강제성의 정도를 선택할 수 있고, 여러 라벨을 고려할 수 있게 한다.
#2-2. 스코어링 (Scoring)
스코어링 단계에서는 앞서 필터링 단계를 통해 찾아낸 사용 가능한 여러 노드 중 파드와 가장 잘 어울리는 노드를 찾아낸다.
쿠버네티스에서 이야기하는 스코어링 방법. 특정 요소에 가중치를 주고 이를 합산하여 더하는 방식
파드의 이미지가 노드에 존재하면 이미지 크기에 비례해 우선순위가 결정되거나, 새로운 파드가 할당되었을 때 가장 많은 자원이 남는 노드에 우선순위를 두는 등, 다양한 기준을 통해 스코어링이 진행될 수 있다.
from http://khlee98.tistory.com/7 by ccl(A) rewrite - 2021-08-02 00:00:20