여기서 말하는 스케줄링이란 컨테이너 등을 생성할 때 어느 서버(노드)에 생성할지 결정하는 일을 뜻한다.
스케줄링이 필요한 사례는 다음과 같다.
이 글에서는 파드 생성과 스케줄링 과정, 스케줄링을 하기 위한 다양한 방법들에 대해 다룬다.
사용자가 kubectl, api로 파드 생성 요청을 보내면 클러스터에서는 다음과 같은 일이 일어난다.
스케줄링은 위 과정 중 3번 단계에서 일어나는데, 조금 더 자세히 살펴보면 다음과 같다.
etcd는 분산 코디네이터로, 클라우드 플랫폼 환경에서 여러 컴포넌트가 정상적으로 상호작용 할 수 있도록 데이터를 조정하는 역할을 담당한다. etcd에는 api 서버만 접근 가능하기 때문에, 사용자가
kubectl get pods명령어를 실행하면 api서버에 전달되고, api서버가 etcd 의 값을 읽어와 사용자에게 반환하게 된다.
클러스터의 kube-system 네임스페이스에는 kube-scheduler, etcd 등의 핵심 컴포넌트들이 기본적으로 실행되고 있다. 이들 또한 파드로 실행되기 때문에 kubectl get pods 명령어로 확인할 수 있다.
3번 단계의 '파드를 할당할 적절한 노드를 선택' 하는 일은 어떻게 일어나게 될까?
사용자는 보통 노드 필터링 단계에 적용할 수 있는 설정을 yaml 파일에 설정하여 스케줄링에 관여하게 된다.
requiredDuringSchedulingIgnoredDuringExecutionprefferedDuringSchedulingIgnoredDuringExecution (가중치도 설정 가능함)apiVersion: v1
kind: Pod
metadata:
name: nginx-nodeaffinity-preferred
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80 # 조건을 만족하는 노드에 1~100까지의 가중치를 부여
preference:
matchExpressions:
- key: mylabel/disk
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx:latest
Kubectl cordon <nodeName> 명령어를 사용하면 노드에 NoSchedule Taints 가 붙음kubectl drain <nodeName> cordon + 실행중인 파드도 다른 노드로 옮겨짐. 커널 버전 업그레이드, 유지보수 등 이유 때문에 노드를 잠시 중지할 때 사용.