Openshift / Kubernetes 파드 (Pod) 스케쥴링 - Affinity 옵션

리눅스/OpenShift|2023. 6. 23. 11:41
반응형

Replicas 또는 ReplicaSet 구성후 운영중인 Pod 가 삭제될때, 가용성을 따져보아 다른 worker node 로 재생성되기도 하는데, 여기에서는 Affinity 기능을 이용해 같은 worker node 로 재생성 되도록 하는 방법을 알아봅니다. Affinity 는 worker node 에 Pod 를 배치할때 사용하는 옵션입니다.

 

우선 노드 선택이 가능하도록 노드에 라벨을 추가하여, 키와 값을 입력합니다.

현재 아래와 같이 worker node 가 두개 있는데, 이 노드에 키와 값을 입력해주겠습니다.

# oc get nodes
NAME                      STATUS   ROLES                  AGE   VERSION
master01.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
master02.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
master03.az1.sysdocu.kr   Ready    control-plane,master   43d   v1.25.4+77bec7a
worker01.az1.sysdocu.kr   Ready    worker                 42d   v1.25.4+77bec7a
worker02.az1.sysdocu.kr   Ready    worker                 42d   v1.25.4+77bec7a

 

# oc label nodes worker01.az1.sysdocu.kr choice=ALL choicesub=wnode1
node/worker01.az1.sysdocu.kr labeled

- Group 용도로 'choice:ALL' 생성

- 노드 전용으로 'choicesub:wnode1' 생성

 

# oc label nodes worker02.az1.sysdocu.kr choice=ALL choicesub=wnode2

node/worker02.az1.sysdocu.kr labeled

- Group 용도로 'choice:ALL' 생성

- 노드 전용으로 'choicesub:wnode2' 생성

 

* 참고

라벨 삭제 방법입니다. 라벨명 (예: choicesub) 뒤에 - 를 꼭 붙여야 삭제됩니다.

# oc label node <노드명> <라벨명>-

 

설정된 상태를 확인합니다.

# oc get node -L choice,choicesub
NAME                      STATUS   ROLES                  AGE   VERSION           CHOICE   CHOICESUB
master01.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
master02.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
master03.az1.sysdocu.kr   Ready    control-plane,master   49d   v1.25.4+77bec7a            
worker01.az1.sysdocu.kr   Ready    worker                 49d   v1.25.4+77bec7a   ALL      wnode1
worker02.az1.sysdocu.kr   Ready    worker                 49d   v1.25.4+77bec7a   ALL      wnode2

 

아래와 같이 Deployment yaml 파일을 작성 합니다.

# vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: app
        image: default-route-openshift-image-registry.apps.az1.sysdocu.kr:5000/project412/python
        ports:
        - containerPort: 80
          protocol: TCP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
          runAsNonRoot: true
      imagePullSecrets:
      - name: sysdocu

      # affinity 사용 옵션
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms: 
            - matchExpressions:   # 특정 Label 의 node 에 Pod 를 생성
              - key: choicesub
                operator: In
                values:
                -
wnode1

 

Affinity 는 Node Affinity 와 Pod Affinity 가 있는데, 어느것을 기준으로 하는지에 따라 다릅니다.

- Node Affinity : 생성된 Pod 를 특정 worker node 에서 가동

- Pod Affinity : Replicas 로 생성된 동일한 Pod 를 같은 worker node 에서 가동
- Pod AntiAffinity : Replicas 로 생성된 동일한 Pod 를 다른 worker node 에서 가동

 

operator 는 Node Affinity 규칙에 사용되는 연산자를 지정하는 필드입니다.

- In : 특정 키 (key) 의 값을 포함하는 경우에 매치. 즉, 값 (values) 이 키에 포함되어 있는 경우 해당 노드에 Pod 를 생성
- Exists : 특정 키 (key) 가 존재하는 경우에 매치. 값 (values) 에 관계없이 키가 존재하면 해당 노드에 Pod 를 생성
- Gt (Greater than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 큰 경우에 매치. 주로 숫자 값을 비교할 때 사용
- Lt (Less than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 작은 경우에 매치. 역시 숫자 값을 비교할 때 사용
- NotIn : 특정 키 (key) 의 값을 포함하지 않는 경우에 매치. 값 (values) 이 키에 포함되지 않은 경우 해당 노드에 Pod 를 생성
- DoesNotExist : 특정 키 (key) 가 존재하지 않는 경우에 매치. 값 (values) 에 관계없이 키가 존재하지 않으면 해당 노드에 Pod 를 생성

 

작성한 yaml 파일을 적용하여 Pod 를 생성합니다.

참고로, Kubernetes 사용자는 아래 oc 명령대신 kuberctl 을 사용하면 됩니다.

# oc apply -f deployment.yaml

 

Pod 가 어느 worker node 에 생성되었는지 확인합니다.

# oc get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE                      NOMINATED NODE   READINESS GATES
app-5f86cc794b-656dg   1/1     Running   0          27s   10.131.0.13   worker01.az1.sysdocu.kr   <none>           <none>

 

Affinity 옵션값의 노드 라벨을 다른 노드로 변경하고, apply 명령으로 적용하면 곧바로 기존 Pod 는 삭제되고, 지정한 노드에 Pod 가 생성됩니다.

원래 Pod 는 스케쥴링 되는 노드 (worker node) 의 가용성 체크 뒤, Round-Robin 방식으로 분배 생성되지만 Affinity 적용 후에는 지정한 노드로만 생성되는것을 확인 할 수 있습니다.

 

노드를 변경하고 (wnode1 -> wnode2)

# sed -i 's/wnode1/wnode2/' deployment.yaml

 

적용합니다.

# oc apply -f deployment.yaml

 

Pod 상태를 확인해보면 지정한 노드에 Pod 가 생성되어진 것을 볼 수 있습니다.
# oc get pod -o wide
NAME                   READY   STATUS        RESTARTS   AGE    IP             NODE                      NOMINATED NODE   READINESS GATES
app-54f888586f-xbmlj   1/1     Running       0          11s    10.128.3.242   worker02.az1.sysdocu.kr   <none>           <none>
app-5f86cc794b-656dg   1/1    Terminating   0          12m   10.131.0.13   worker01.az1.sysdocu.kr   <none>           <none>

 

반응형

댓글()