쿠버네티스의 NodeSelector
NodeSelector는 쿠버네티스에서 Pod를 특정 노드에 스케줄링하기 위한 간단한 메커니즘임.
Pod가 실행될 노드를 지정하는 방법 중 가장 기본적이고 직관적인 방식임.
NodeSelector의 개념
쿠버네티스 클러스터에는 여러 노드가 존재하며, 각 노드는 특정 레이블을 가질 수 있음.
NodeSelector는 Pod의 매니페스트에서 nodeSelector 필드를 사용하여 Pod가 실행될 노드의 조건을 설정함.
설정된 레이블과 일치하는 노드에만 해당 Pod를 스케줄링할 수 있음.
NodeSelector의 동작 원리
1. 노드 레이블
노드는 클러스터 관리자가 레이블을 수동으로 지정하거나 자동화된 방식으로 특정 레이블을 부여받음.
레이블은 키-값 쌍으로 표현됨.
예: disktype=ssd, region=us-west, environment=production.
레이블을 추가하려면 다음과 같이 명령어를 사용함.
kubectl label nodes <node-name> <key>=<value>
kubectl label nodes node1 disktype=ssd
kubectl label nodes node2 region=us-west
2. Pod 스케줄링
Pod 매니페스트에서 nodeSelector를 정의하여 특정 레이블과 일치하는 노드에 Pod를 스케줄링함.
만약 정의된 레이블에 맞는 노드가 없으면, Pod는 스케줄되지 않은 상태(Pending)로 남음.
NodeSelector 예제
노드에 레이블 추가
kubectl label nodes node1 environment=production
kubectl label nodes node2 environment=staging
Pod 매니페스트
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
environment: production
nodeSelector는 environment=production 레이블이 있는 노드에만 Pod를 스케줄링함.
NodeSelector의 동작 특성
1. 일치 조건
nodeSelector에 정의된 모든 키-값 쌍이 노드의 레이블과 정확히 일치해야 함.
2. 선택 조건 불일치
조건에 맞는 노드가 없는 경우, Pod는 스케줄되지 않고 Pending 상태로 남음.
3. 단순한 조건
NodeSelector는 단순히 정확히 일치하는 레이블 기반의 조건만 지원함.
복잡한 논리 조건(예: OR, NOT)은 지원하지 않음.
복잡한 스케줄링이 필요한 경우 Node Affinity를 사용하는 것이 좋음.
NodeSelector의 한계
1. 정확히 일치하는 조건만 지원
NodeSelector는 복잡한 논리 연산을 지원하지 않으며, 단순히 특정 노드에 Pod를 배치하는 데 사용됨.
예를 들어, disktype=ssd와 region=us-west 조건 중 하나만 만족해도 되는 경우를 정의할 수 없음.
2. 유연성 부족
조건에 맞는 노드가 추가되더라도 Pod가 자동으로 다시 스케줄링되지 않음.
스케줄링 조건 변경 시, 기존 Pod를 재배포해야 함.
NodeSelector와 다른 스케줄링 방법 비교
1. NodeSelector
조건 : 단순 레이블 매칭
유연성 : 제한적
사용 사례 : 단순 매칭
구문 복잡성 : 간단함
2. Node Affinity
조건 : 복잡한 조건 (AND, OR)
유연성 : 더 유연한 조건 지원
사용 사례 : 복잡한 노드 조건 필요 시
구문 복잡성 : 상대적으로 복잡
3. Taints and Tolerations
조건 : 노드의 taint를 기반
유연성 : 스케줄링 및 노드 격리
사용 사례 : 특정 Pod만 노드에 배치
구문 복잡성 : 중간 수준
NodeSelector를 사용하는 주요 사례
1. 특정 하드웨어 요구사항
GPU가 장착된 노드에서만 실행해야 하는 워크로드
spec:
nodeSelector:
hardware: gpu
kubectl label nodes node1 hardware=gpu
2. 환경 격리
개발 환경과 프로덕션 환경을 노드별로 분리하여 스케줄링
spec:
nodeSelector:
environment: prod
kubectl label nodes node1 environment=dev
kubectl label nodes node2 environment=prod
3. 지역 기반 워크로드 배치
특정 리전에 데이터 처리를 국한시키기 위해
spec:
nodeSelector:
region: us-east
kubectl label nodes node1 region=us-east
kubectl label nodes node2 region=us-west
NodeSelector를 사용하지 않을 때의 대안
1. Node Affinity
NodeSelector의 기능을 확장한 것으로, 보다 유연한 조건을 지원함.
예를 들어, 다음과 같은 조건을 정의할 수 있음.
특정 레이블을 포함하는 노드.
특정 노드를 선호하지만 강제하지는 않음.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
- nvme
2. Taints and Tolerations
노드에 taint를 추가하여 특정 Pod만 해당 노드에 스케줄링되도록 제어함.
Taints는 노드의 접근성을 제한하며, Tolerations는 특정 Pod가 해당 제한을 허용하도록 설정함.
NodeSelector 정리
NodeSelector는 쿠버네티스에서 Pod를 특정 노드에 배치하는 가장 간단한 메커니즘임.
단순한 조건 기반 스케줄링이 필요한 경우 적합하지만, 복잡한 요구 사항이 있는 경우 Node Affinity나 Taints and Tolerations 같은 대안을 사용하는 것이 더 적합함.
NodeSelector는 효율적이고 간단하게 특정 워크로드를 특정 노드로 제한하는 데 유용함.
'Operating System > Kubernetes' 카테고리의 다른 글
[Kubernetes] Ingress + ClusterIp 및 Ingress + NodePort (0) | 2024.12.27 |
---|---|
[Kubernetes] CoreDNS 개념 (0) | 2024.12.27 |
[Kubernetes] Ingress Controller (0) | 2024.12.27 |
[Kubernetes] Airflow Github Oauth 연동시 Github 설정 (0) | 2024.12.27 |
[Kubernetes] podDisruptionBudget 개념 (0) | 2024.12.27 |