이번에는 Kubernetes Pod가 노드에 할당되기 위한 Scheduling에 대해 알아보려한다.
1. QoS
QoS는 노드에 균등하게 자원을 배분한 Pod가 사용되고 있을 때,
만약 Pod에 추가적인 자원이 필요할 때 더 이상 노드에 여유 자원이 없는 경우를 대비해 설정할 수 있는 제약 조건이다.
Pod를 생성할 떄 Pod는 다음 QoS 클래스 중 하나를 선택할 수 있다.
- Guaranteed
- Burstable
- BestEffort
1. Guranteed
Guaranteed는 모든 Container에 Request와 Limit가 설정되어 있으며, Request와 Limit에는 memory, cpu상한과 요청량이모두 설정되어 있고, 각 컨테이너에 할당된 memory와 cpu의 Request와 limit 값이 같을 경우 할당되는 QoS 클래스다.
2. Burstable
Burstable은 Pod가 Guaranteed QoS 클래스의 기준을 만족하지 않으면서, Pod 내에 최소한 하나의 Container가 memory, cpu 요청량을 가질 경우 할당되는 QoS 클래스다.
3. BestEffort
BestEffort는 Pod 내 어떤 컨테이너에도 Request와 limit가 설정되어 있지 않은 경우에 할당되는 QoS 클래스다.
2. Node Scheduling
Pod를 특정 노드에 할당하도록 선택하는 세 가지 기준에 대해 알아보도록 한다.
- NodeName
- NodeSelector
- Affinity
1. NodeName
NodeName은 명시적으로 노드 이름을 할당할 수 있지만, 실제 사용에서는 노드 이름이 계속 변경되기 때문에 잘 사용하지 않는다.
또한 명명된 노드가 없다면, Pod가 실행되지 않기 때문에 자동으로 삭제될 우려가 있다.
또한 명명된 노드에 Pod를 수용할 여유 자원이 없다면 Pod 할당이 실패된다.
2. NodeSelector
NodeSelector는 Key:Value의 Label에 따라 Pod를 할당한다. 단, Key와 Value가 딱 매칭되는 노드에만 Pod가 할당되고 매칭되지 않으면 어느 노드에도 할당이 되지 않는다는 단점이 있다.
3. Affinity
Affinity는 다시 NodeAffinity와 Pod간Affinity - Anti-Affinity로 나눌 수 있다.
NodeAffinity는 Key만 설정해도 Pod가 할당이 되며, Key를 가지고 있지 않더라도 스케줄러에서 자동적으로 판단하여 Pod를 할당해준다.
Pod간Affinity는 Pod간 집중 / 분산을 도와주는데, 노드에서 이미 실행중인 Pod Label을 기반으로 Pod가 할당될 수 있는 노드를 제한할 수 있다.
Anti-Affinity
는 Master-Slave 관계가 서로 다른 노드에 스케줄링이 되도록 요구한다. 만약 Slave에 Key로 Master의 Key값을 주게 된다면 해당 Master와 다른 노드에 할당되어진다.
3. Toleration / Taint
Toleration과 Taint는 Affinity와 반대로 노드에 Pod가 할당되지 않도록 제한한다.
관리자가 Taint를 설정해두면 일반 Pod는 노드에 할당시키지 않으며 Toleration이 적용된 Pod만 할당되게 한다.
'Cloud Computing > Kubernetes' 카테고리의 다른 글
Kubernetes - Volume (Dynamic Provisioning) (0) | 2021.01.20 |
---|---|
Kubernetes - Service (Headless, Endpoint, ExternalName) (0) | 2021.01.20 |
Kubernetes - Pod Lifecycle (0) | 2021.01.19 |
Kubernetes - DaemonSet, Job, CronJob (0) | 2021.01.18 |
Kubernetes - Deployment (0) | 2021.01.18 |