본 포스팅은 Udemy Certificated Kubernetes Administrator 강좌를 공부한 내용입니다.
CKA 준비 (6) - Scheduling 1 (Manual, taint and toleration)를 통해 Node의 입장에서 POD의 실행 여부를 판단하는 taint & toleration에 대해 배웠다.
Node Selector와 Node Affinity 역시 앞선 내용과 비슷하게 POD를 특정 Node에서 실행시켜 물리적 isolation을 하기 위한 개념이다.
이 둘의 의미와 사용 방법에 대해 살펴보고 taint & toleration과 어떻게 같이 사용될 수 있는지 확인해보자.
Node Selector
앞서 POD의 spec에서 nodeName 을 통해 POD가 실행될 Node를 manual 적으로 실행시킬 수 있다는 것을 배웠다.
Node Selector는 그와 비슷하지만 하나의 node에서가 아닌 Node Selector에 설정된 Label을 가지고 있는 Node 중에서 하나를 선택한다.
Node Label 지정
$ kubectl labels node <NODE_NAME> <label-key>=<label-value>
label을 지정할 <NODE_NAME>에 대해 key-value를 설정한다.
POD NodeSelector 지정
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
nodeSelector:
<label-key>: <label-value>
spec에서 nodeSelector를 통해 실행될 node의 label key-value를 설정한다.
Node Affinity
Node Selector의 한계점
node의 CPU/Memory 크기에 따라 label을 지정했다고 가정해보자.
$ kubectl labels node node01 size=small
$ kubectl labels node node02 size=medium
$ kubectl labels node node03 size=large
새로운 POD를 실행시킬 때 해당 POD는 size=medium 또는 size=large 둘 중 어느 node에서 실행되도 상관없다면 이것을 nodeSelector로 어떻게 표현할 수 있을까?
같은 의미로 size=small만 아닌 node에서 POD를 실행시키고 싶다면 어떻게 표현할 수 있을까?
이러한 표현을 위해서는 operator가 필요하고 이를 제공해주는 것이 Node Affinity이다.
Node Affinity 설정
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- medium
- large
In operator를 통해 nginx POD를 size=medium 또는 size=large label이 있는 Node에서 실행시킬 수 있다.
Node Affinity가 바라보는 node의 label은 동적으로 생성/삭제가 가능하기 때문에 이에 대한 설정을 할 수 있다.
위의 예제에서 requiredDuringSchedulingIgnoredDuringExecution 가 설정 부분이 된다.
Scheduling | Execution | |
Required | POD를 생성할 때, node affinity가 일치하지 않으면 해당 node에 scheduling 하지 않는다. | Node Label 변경 등의 이벤트 발생 시, 실행 중인 POD의 node affinity가 일치하지 않으면 퇴출(eviction)한다. |
Ignored | POD를 생성할 때, node affinity가 일치하지 않아도 무시한다. | 이미 실행 중인 POD는 관여하지 않는다. |
Preferred | POD를 생성할 때, node affinity가 일치하지 않으면 해당 node에 scheduling 하지 않지만 cluster resource 부족 등으로 POD가 scheduling 되지 않는다면 node에 배정한다. | X |
Taint & Toleration And Node Affinity
앞서 살펴본 Taint & Toleration과 Node Affinity는 비슷한 기능인 것 같다.
둘의 차이가 어떤 것이 있고 같이 사용할 방법에 대해 알아보자.
Node1, Node2에 red taint가 존재하고 POD1이 red toleration을 가지고 있다면
POD1은 무조건 Node1과 Node2에 배정될까?
아무런 taint도 존재하지 않는 Node3에도 배정될 수 있다.
이 문제를 해결하기 위해 Node Affinity를 쓸 수 있다.
POD1에 대해 large label이 있는 Node에만 배정될 수 있도록 설정했다.
그렇게 되면 POD1은 Node1 또는 Node2에 배정받을 것이다.
하지만 Node Affinity가 없는 새로운 POD2 역시 Node1 또는 Node2에 배정될 수 있다.
이것은 POD1 과 POD2가 서로 물리적으로 isolation이 되지 않는 문제점이 발생한다.
Tinat & Toleration과 Node Affinity를 같이 사용한다면 위처럼 POD간의 isolation을 완벽하게 할 수 있다.
POD1은 Node Affinity에 의해 Node1 또는 Node2에만 배정받게 되며
POD2는 Taint & Toleration에 의해 Node1 또는 Node2에 배정받지 못한다.
정리
Taint & Toleration과 Node Affinity는 kubernetes app 개발할 때 무심코 지나칠 수 있는 부분인데 시험 준비를 하면서 자세하게 알 수 있었던 것 같다.
'Kubernetes > CKA' 카테고리의 다른 글
CKA 준비 (9) - Monitoring & Logging (0) | 2020.06.16 |
---|---|
CKA 준비 (8) - Scheduling 3 (DaemonSet, Static Pod) (0) | 2020.06.16 |
CKA 준비 (6) - Scheduling 1 (Manual, taint and toleration) (0) | 2020.06.07 |
CKA 준비 (5) - namespace, service (0) | 2020.06.07 |
CKA 준비 (4) - Pod, ReplicaSet, Deployment (0) | 2020.06.05 |