본문 바로가기
DevOps/Kubernetes

Kubernetes::스케쥴링 (Scheduling) - Node Affinity

by yscho03 2023. 12. 19.
728x90
반응형

Node Affinity

Node Affinity란?

쿠버네티스 클러스터의 특정 노드에 노드 어피니티를 사용해 쿠버네티스 파드를 할당하는 방법을 말한다.

노드에 레이블 추가

  1. 클러스터의 노드를 레이블과 함께 나열하자.
$ kubectl get nodes --show-labels

NAME                 STATUS   ROLES                  AGE    VERSION   LABELS
master.example.com   Ready    control-plane,master   347d   v1.22.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.example.com,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node1.example.com    Ready    :raw-html-m2r:`<none>`                 347d   v1.22.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1.example.com,kubernetes.io/os=linux
node2.example.com    Ready    :raw-html-m2r:`<none>`                 347d   v1.22.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2.example.com,kubernetes.io/os=linux
  1. 노드 한 개를 선택하고, 레이블을 추가하자.
$ kubectl label nodes node1.example.com disktype=ssd
  1. 선택한 노드가 disktype=ssd 레이블을 갖고 있는지 확인하자.
$ kubectl get nodes -L disktype

NAME                 STATUS   ROLES                  AGE    VERSION   DISKTYPE
master.example.com   Ready    control-plane,master   347d   v1.22.3
node1.example.com    Ready    :raw-html-m2r:`<none>`                 347d   v1.22.3   ssd
node2.example.com    Ready    :raw-html-m2r:`<none>`                 347d   v1.22.3

필수적인 노드 어피니티 (requiredDuringSchedulingIgnoredDuringExecution)를 사용해 파드 스케줄하기

requiredDuringSchedulingIgnoredDuringExecution을 사용하여 파드가 disktype=ssd 레이블이 있는 노드에만 스케줄될 것이라는 것을 의미한다.

  1. 매니페스트를 적용하여 선택한 노드에 스케줄된 파드를 생성한다.
$ cat > pod-nginx-required-affinity.yaml

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
  1. 파드가 선택한 노드에서 실행 중인지 확인하자.
$ kubectl get pods -o wide
NAME                  READY   STATUS    RESTARTS      AGE   IP          NODE                NOMINATED NODE   READINESS GATES
nginx                 1/1     Running   0             4s    10.40.0.4   node1.example.com   <none>           <none>

선호하는 노드 어피니티 (preferredDuringSchedulingIgnoredDuringExecution)를 사용해 파드 스케줄하기

preferredDuringSchedulingIgnoredDuringExecution을 사용하여 파드가 disktype=ssd 레이블이 있는 노드를 선호한다는 것을 의미한다.

  1. 매니페스트를 적용하여 선택한 노드에 스케줄된 파드를 생성한다.
$ cat > pod-nginx-preferred-affinity.yaml

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
$ kubectl create -f pod-nginx-preferred-affinity.yaml
  1. 파드가 선택한 노드에서 실행 중인지 확인하자.
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES  
nginx 1/1 Running 0 4s 10.40.0.4 node1.example.com
728x90
반응형