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
반응형