Intro
쿠버네티스 클러스터 내부에는 다양한 성능의 노드들이 혼재하여 존재할 수 있다.
우리는 데이터 처리를 위한 파드는 특정한 고사양 노드에서만 실행되기를 원할 수 있는데, 기본 스케줄러는 이러한 사항을 고려하지 않고 랜덤한 노드에 파드를 배치하게된다.
이러한 상황에서 선택할 수 있는 해결책이 `Node Selector`이다.
Labeling
다음과 같은 명령어를 사용해서 간단하게 node에 label을 붙일 수 있다.
kubectl label nodes node1 size=large
위 명령어를 사용하면, node1이라는 노드에 size=large라는 라벨을 가지게 할 수 있다.
Node Selector 적용
apiVersion: v1
kind: Pod
metadata:
name: dataproc-pod
spec:
containers:
- name: processor
image: mycompany/dataproc:v1
nodeSelector:
size: large
pod 정의에서 spec.nodeSelector를 사용해서 특정 라벨을 가진 노드를 선택하도록 설정할 수 있다.
다만 이러한 Node Selector에는 한계점이 존재하는데 바로 복잡한 조건을 사용할 수 없다는 점이다.
Or, unEqual(!=) 등의 조건을 사용할 수 없는데 이러한 단점을 극복하기 위해서 `Node Affinity`를 사용한다.
Node Affinity
Node Affinity의 예시 구조는 다음과 같다.
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- large
각 옵션의 의미는 다음과 같다.
affinity.nodeAffinity: node affinity 설정이 시작됨을 의미한다
requiredDuringSchedulingIgnoredDuringExecution: 스케줄링 시에만 적용되며, 반드시 이 조건을 만족하는 노드에만 스케줄링됨을 의미한다.
matchExpressions: key / operator / value의 구조로 복수 조건을 걸 수 있다.
주요 operator는 다음과 같다.
In: 지정된 값 중 하나와 일치
NotIn: 지정된 값들과 다를 경우
Exists: 키만 존재하면 통과
DoesNotExist: 키가 존재하지 않으면 통과
requiredDuringSchedulingIgnoredDuringExecution대신 preferredDuringSchedulingIgnoredDuringExecution를 사용하는 경우, 조건을 최대한 만족하려고 하되 안 되면 남은 노드에 배치한다.
IgnoredDuringExecution 대신에 RequiredDuringExecution을 사용하면 실행 중 라벨이 변경되었을 때 조건에 맞지 않으면 pod를 evict한다.
'CKA' 카테고리의 다른 글
(TIL) Kubernetes에서의 Resource Request & Limits (0) | 2025.03.26 |
---|---|
(TIL) Kubernetes Taints & Toleration 와 Node Affinity (0) | 2025.03.25 |
(TIL) Taints and Tolerations (0) | 2025.03.25 |
(TIL) Kubernetes Labels & Selectors (0) | 2025.03.23 |
(TIL) Kubernetes Manual Scheduling (0) | 2025.03.23 |