[kubernetes] 원하는 노드에 스케쥴링하는 방법(nodeName, label, nodeSelector)

vinca·2023년 12월 11일
0

☸️ kubernetes

목록 보기
20/35
post-thumbnail

nodeName

스케쥴러가 노드의 이름을 보고 파드가 배포되도록 하는 방법이다.

단순하다. 배포하는 곳에 nodeName 파라미터를 써주면 된다.

apiVersion: v1
kind: Pod
metadata:
  name: nodename
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: w3-k8s

nodelabel

라벨이라고도 하고, 레이블이라고도 한다.
이전 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

레이블을 사용하는 방법을 알았으니, 이제 이러한 지정된 레이블을 이용해서 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

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글