스케쥴러가 노드의 이름을 보고 파드가 배포되도록 하는 방법이다.
단순하다. 배포하는 곳에 nodeName
파라미터를 써주면 된다.
apiVersion: v1
kind: Pod
metadata:
name: nodename
spec:
containers:
- name: nginx
image: nginx
nodeName: w3-k8s
라벨이라고도 하고, 레이블이라고도 한다.
이전 nodeName
의 방법 보다는 훨씬 ✨세련된(?) 방법이다.
쉽게 말해서 꼬리표🧾이다.
노드의 레이블은 각 노드(Host)에게 주어지는 꼬리표라고 생각해도 되고, 별칭(Alias)이라고 생각해도 된다.
다음 예제를 보자.
먼저 레이블을 확인하는 명령어로 어떤 레이블들이 있는지 전체를 확인할 수 있다.
# 모든 노드의 레이블 확인
k get node --show-labels
# 단일 노드의 레이블 확인
k get node w1-k8s --show-labels
이러한 레이블을 우리가 직접 추가하는 방법은 간단하다.
# 레이블을 추가하는 방법
k label node w1-k8s kim=vinca
k label node w2-k8s hello=world
다음과 같은 명령어로 레이블을 제거할 수 있다.
# 레이블을 제거하는 방법 <key값->
k label node w1-k8s kim-
k label node w2-k8s hello-
레이블을 통해서 필터링을 해서 어떤 노드가 해당 레이블을 가지고 있는지 또한 확인할 수 있다.
# 레이블을 통한 워커노드 필터링
k get -l hello=world
k get -l hello
key
= value
로도 검색이 가능하고 key
로만으로도 검색이 가능하다.
지금은 w2-k8s 워커노드1대 뿐이지만 만약, 서비스가 처져서 노드가 10대..100대..1000대가 될수록 레이블의 중요성은 커지게 된다.
레이블을 사용하는 방법을 알았으니, 이제 이러한 지정된 레이블을 이용해서 nodeSelector
로 노드 선택을 직접해 보자🎮.
먼저 다음 그림과 같이 각 워커노드에 레이블을 추가해 주도록 한다.
kubectl label node w1-k8s gpupool=nvidia accelerator=tesla-a100
kubectl label node w2-k8s gpupool=nvidia accelerator=tesla-v100
kubectl label node w3-k8s diskint=nvme inmemory=redis
이러한 노드 레이블이 달려있으면, 노드 이름이 아니라 노드의 레이블을 통해서 좀 더 편하게 직관적으로 노드의 특성에 따라 배포할 수 있다.
🎈예시
- gpu가 nvidia인 노드들 중에 배포해주세요.
(gpu=nvidia인 노드들 중 한개에 배포)- inmemory로 redis를 쓰는 노드에 배포해주세요.
(inmemory=redis인 노드에 배포)
즉 동일한 레이블을 가진 노드가 2개 이상인 경우, 해당 노드들 내에서 스케쥴링된다.
kind: Pod
metadata:
name: nodeselector-gpupool
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
# gpupool: nvidia를 label로 가진 노드 中 1에 배포
gpupool: nvidia