nodeSelector는 단순히 Label 기준으로만 Pod를 배치한다.
nodeAffinity는 Label을 사용하면서 조금 더 효율성있게 Pod를 배치할 수 있다.

결론은 운영 측면에서 Affinity를 사용 하는것이 좋다.
그 이유는 hostname, cpu arch, label 등과 같은 기준으로 세부적으로 제어할 수 있기 때문이며,
nodeSelector는 단순히 Label을 기준으로 제어하기 때문에 기능적 측면에서는 비효율적이다.

1. Node Selector 사용법

 

Node Selector는 Label을 기준으로 Pod를 배포 하는 전략이다.
사용하기 위해서는 노드에 label을 추가 후 DeploymentConfig에 nodeSelector를 추가한다.

1.1. Label 추가

 

사용법: oc label node [노드명] key=value

ex) worker01 노드에 httpd=true Label 추가

[root@bastion ~]# oc label node worker01.ybkim.ocp4.local httpd=true

1.2. Label 확인

 

[root@bastion ~]# oc get node --show-labels | grep 'httpd=true'
worker01.ybkim.ocp4.local   Ready    worker   4d5h   v1.19.0+a5a0987   httpd=true

1.3. DeploymentConfig 수정

 

위에서 추가한 httpd=true Label을 가진 노드에서 Pod를 배포할 수 있도록 nodeSelector를 지정한다.

ex1) httpd=true 라는 Label을 기준으로 Pod를 배포

[root@bastion ~]# oc edit deploymentconfig httpd-24 -n httpd
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: httpd-24
  namespace: httpd
spec:
  template:
    spec:
      nodeSelector:
        httpd: true

1.4. Pod 확인

 

[root@bastion ~]# oc get pod -o wide -n httpd
NAME                READY   STATUS      RESTARTS   AGE   IP            NODE                        NOMINATED NODE   READINESS GATES
httpd-24-6-ld7dq    1/1     Running     0          13m   172.40.5.16   worker01.ybkim.ocp4.local   <none>           <none>

2. nodeAffinity

 

nodeAffinity는 Soft/Hard 2가지 방식을 사용할 수 있다.

  • Soft 방식 가능하면 특정 label을 가지는 노드에 할당 되도록 함.
    preferredDuringSchedulingIgnoredDuringExecution 선언자를 사용

  • Hard 방식 반드시 특정 label을 가지는 노드에만 할당 되도록 함.
    requiredDuringSchedulingIgnoredDuringExecution 선언자를 사용

2.1. Hard 방식

 

worker01 노드에만 Pod가 구동 되게 하려는 경우 nodeSelectorTerms의 matchExpressions를 사용하여 지정한다.
이 방식은 nodeSelector에서 label을 여러개 추가 후 사용하는 방식과 같다.

그리고, matchExpressions이 2개 이상인 경우 1개라도 만족 하는 경우 Pod를 배포할 수 있다.
또한, matchExpressions이 2개 이상이면서 key 값의 조건이 2개 이상인 경우 해당 key 값의 모든 조건을 만족해야만 Pod를 배포할 수 있다.

operator 선언자는 In과 NotIn을 사용하여 조건을 제어할 수 있다.

  • In
    label 조건이 맞는 노드에 Pod 배포

  • NotIn
    label 조건이 맞지 않는 노드에 Pod 배포

ex1) matchExpressions 2개 이상인 경우, 조건 1개만 만족해도 Pod 배포 가능

apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: httpd-24
  namespace: httpd
spec:
  replicas: 4
  template:
    spec:
      affinity:
        nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - worker01.ybkim.ocp4.local
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - worker02.ybkim.ocp4.local

ex2) matchExpressions이 2개 이상이면서 key 값이 2개 이상인 경우 key값에 대한 모든 조건을 만족해야만 Pod가 배포 됨.

apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: httpd-24
  namespace: httpd
spec:
  replicas: 4
  template:
    spec:
      affinity:
        nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - worker01.ybkim.ocp4.local
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - worker02.ybkim.ocp4.local
              - key: node.openshift.io/os_id
                operator: In
                values:
                - rhcos

2.2. Soft 방식

 

Hard 방식과 같으나 preferredDuringSchedulingIgnoredDuringExecution 선언자를 사용한다.
가능하면 노드에 할당 되도록 해주는 기준은 weight 값을 통해 노드 순위가 정해진다.
(weight는 1~100까지의 설정값을 가질 수 있다.)

즉, 스케줄러에서 모든 노드의 점수를 매긴 후 가장 높은 값을 갖는 노드에 Pod를 할당하는 방식으로 이루어진다.

ex) 전체 노드에서 우선 순위가 높은 노드인 worker01에 우선 적으로 Pod가 배포 됨.

apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: httpd-24
  namespace: httpd
spec:
  replicas: 4
  template:
    spec:
      affinity:
        nodeAffinity:
           preferredDuringSchedulingIgnoredDuringExecution:
           - preference:
             weight: 100
               matchExpressions:
               - key: kubernetes.io/hostname
                 operator: In
                 values:
                 - worker01.ybkim.ocp4.local
           - preference:
             weight: 10
               matchExpressions:
               - key: kubernetes.io/hostname
                 operator: In
                 values:
                 - worker02.ybkim.ocp4.local

– RefURL

 

[1]: OpenShift Docs – Controlling pod placement on nodes using node affinity rules
[2]: OpenShift Docs – Placing pods on specific nodes using node selectors
[3]: Kubernetes Docs – Assigning Pods to Nodes