노드 어피니티로 파드를 노드에 할당하기

노드 어피니티로 파드를 노드에 할당하기 (Assign Pods to Nodes using Node Affinity)

이 페이지에서는 쿠버네티스 클러스터에서 노드 어피니티(Node Affinity)를 사용해 쿠버네티스 Pod를 특정 노드에 할당하는 방법을 보여드려요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

쿠버네티스 서버가 최소 v1.10 버전이어야 해요. 버전을 확인하려면 kubectl version을 입력하세요.

노드에 라벨 추가하기 (Add a label to a node)

클러스터의 노드와 그 라벨을 나열해요.

kubectl get nodes --show-labels

출력은 다음과 비슷해요.

NAME      STATUS    ROLES    AGE     VERSION        LABELS
worker0   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker0
worker1   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker1
worker2   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker2

노드 중 하나를 선택하고 그 노드에 라벨을 추가해요.

kubectl label nodes <your-node-name> disktype=ssd

여기서 <your-node-name>은 선택한 노드의 이름이에요.

선택한 노드에 disktype=ssd 라벨이 있는지 확인해요.

kubectl get nodes --show-labels

출력은 다음과 비슷해요.

NAME      STATUS    ROLES    AGE     VERSION        LABELS
worker0   Ready     <none>   1d      v1.13.0        ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker1
worker2   Ready     <none>   1d      v1.13.0        ...,kubernetes.io/hostname=worker2

앞선 출력에서 worker0 노드에 disktype=ssd 라벨이 있는 것을 볼 수 있어요.

required 노드 어피니티로 파드 스케줄링하기 (Schedule a Pod using required node affinity)

이 매니페스트는 requiredDuringSchedulingIgnoredDuringExecution 노드 어피니티, disktype: ssd를 가진 Pod를 설명해요. 즉 이 파드는 disktype=ssd 라벨이 있는 노드에만 스케줄링돼요.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd            
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

pods/pod-nginx-required-affinity.yaml — 매니페스트를 적용해 선택한 노드에 스케줄링되는 Pod를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/pod-nginx-required-affinity.yaml

파드가 선택한 노드에서 실행 중인지 확인해요.

kubectl get pods --output=wide

출력은 다음과 비슷해요.

NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0

preferred 노드 어피니티로 파드 스케줄링하기 (Schedule a Pod using preferred node affinity)

이 매니페스트는 preferredDuringSchedulingIgnoredDuringExecution 노드 어피니티, disktype: ssd를 가진 Pod를 설명해요. 즉 이 파드는 disktype=ssd 라벨이 있는 노드를 선호해요.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd          
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

pods/pod-nginx-preferred-affinity.yaml — 매니페스트를 적용해 선택한 노드에 스케줄링되는 Pod를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/pod-nginx-preferred-affinity.yaml

파드가 선택한 노드에서 실행 중인지 확인해요.

kubectl get pods --output=wide

출력은 다음과 비슷해요.

NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0

다음 단계 (What's next)

노드 어피니티(Node Affinity)에 대해 더 배우기.

더 알아보기 (Learn more)