본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 61. Node Affinity

by 공부하는 무니 2023. 1. 6.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests
강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 Node Affinity에 대해 알아보겠습니다.

Node Affinity

Node Affinity의 주요 기능은 파드가 특정한 노드에서 호스팅되는 것을 보장하는 것입니다.

예를 들어 위와 같은 상황에서 대용량 데이터 처리 파드를 노드1에 배치되도록 하고 싶습니다. 이 작업은 지난 강의에서 배운 Node Selector를 통해 간단하게 해결할 수 있습니다. 그러나 Node Selector는 "Large노드 나 Medium노드에 파드를 배치하는 것"과 같은 것, "Small이 아닌 노드에 파드를 배치하는 것"과 같은 것과 같은 advance expressions을 제공할 수 없습니다.

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/ns-old.PNG

Node Affinity 기능은 advance expressions을 제공합니다.

Node Affinity로 Large노드 나 Medium노드에 파드를 배치하기

아래 pod definition file은 위에서 구현한 NodeSelector를 사용한 definition file과 동일한 내용입니다. 둘 다 큰 노드에 파드를 배치한다는 똑같은 일을 합니다.

apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: data-processor
   image: data-processor
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In
            values: 
            - Large
            - Medium

spec 아래에 affinity 가 있고, 또 그 아래에 nodeAffinity가 있습니다. 그 아래엔 문장처럼 보이는 긴 필드 requiredDuringSchedulingIgnoredDuringExecution가 있습니다. 이 아래에 nodeSelectorTerms가 있고 여기에서 key-value 쌍을 지정합니다. key-value쌍을 더 자세히 보겠습니다.

  • key: size
  • operator: In
  • values:
    • Large
    • Medium

위 key-value쌍은 size가 Large이거나 Medium인 노드에 파드를 배치(In)하라는 의미입니다.

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/na.PNG

Node Affinity 로 Small이 아닌 노드에 파드를 배치하기

만약 Small이 아닌 노드에 파드를 배치하기 원한다면, 아래와 같이 operator: NotIn 을 사용하면 됩니다.

apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: data-processor
   image: data-processor
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: NotIn
            values: 
            - Small

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/na1.PNG

Node Affinity 로 Small이 아닌 노드에 파드를 배치하기

만약 우리가 노드의 레이블을 Large와 Medium만 설정하고 Small은 레이블을 설정하지 않았다면, 레이블이 존재하는 노드에만 파드를 배치함으로써 파드를 Large노드나 Medium노드에 배치할 수 있을 것입니다. 이럴 때는 operator: Exists를 사용하면 됩니다.

apiVersion: v1
kind: Pod
metadata:
 name: myapp-pod
spec:
 containers:
 - name: data-processor
   image: data-processor
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: Exists

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/na2.PNG

Node Affinity Types

그런데 만약, NodeAffinity와 Node가 일치하지 않는다면 어떻게 될까요? 예를 들어, Large 노드에 파드를 배치하라고 했는데 Large라는 레이블이 붙은 노드가 없는 경우나, 파드가 이미 배치되어 있는데 누군가 노드의 레이블을 변경하는 경우입니다. 이 때 파드가 노드에 계속 남아 있을까요? 이러한 것들에 대한 설명은 긴 문장 같이 생긴 Node Affinity Type이 해줍니다. Node Affinity Type은 Node Affinity와 관련된 스케쥴러의 동작을 정의합니다. 

 

현재 Available Node Affinity Type은 두 가지 입니다.
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringScheduilingIgnoredDuringExecution
그리고 추가적으로 Planned Node Affinity Type이 하나 더 있습니다.
- requiredDuringSchedulingRequiredDuringExecution

 

  • Available
    • requiredDuringSchedulingIgnoredDuringExecution
    • preferredDuringSchedulingIgnoredDuringExecution
  • Planned
    • requiredDuringSchedulingRequiredDuringExecution
    • preferredDuringSchedulingRequiredDuringExecution

Node Affinity Types States

파드의 라이프사이클에는 Node Affinity에 대해 두 가지 상태가 있습니다. DuringScheduling과 DuringExecution입니다.

DuringScheduling

DuringScheduling은 Pod가 존재하지 않고 처음 생성된 상태입니다. 파드가 처음 생성될 때 지정된 Node Affinity 규칙이 파드를 올바른 노드에 배치하는 것은 당연합니다. 이제 일치하는 레이블이 있는 노드를 사용할 수 없으면 어떻게 될까요? 예를 들어 노드에 `Large` 레이블을 지정하는 것을 잊은 경우 입니다. 
여기에서 Node Affinity Type이 작용합니다.
첫 번째 Type인 Required을 선택하면 스케줄러는 지정된 Node Affinity을 사용하여 파드를 노드에 배치하도록 지시합니다. 노드를 찾을 수 없으면 파드가 예약되지 않습니다. 이 타입은 파드의 배치가 중요한 경우에 사용됩니다. 일치하는 노드가 없으면 파드가 예약되지 않습니다.
그러나 파드 배치가 워크로드를 실행하는 것보다 덜 중요하다고 가정해 보겠습니다. 이 경우 일치하는 노드를 찾을 수 없는 경우, 스케줄러는 단순히 Node Affinity 규칙을 무시하고 사용 가능한 노드에 파드를 배치합니다.
이 방법은 스케줄러에게 "스케쥴러야, 파드를 일치하는 노드에 배치하도록 최선을 다해봐. 하지만 정말 찾을 수 없다면 아무데나 둬." 라고 말하는 것과 같습니다. 

DuringExecution

DuringExecution은 파드가 실행 중이고, 노드 레이블 변경과 같이 Node Affinity도에 영향을 미치는 환경 변경이 발생한 상태입니다. 예를 들어 관리자가 우리가 이전에 설정한 `size=Large`라는 레이블을 노드에서 제거했다고 가정해 보겠습니다. 이제 노드에서 실행 중인 파드는 어떻게 될까요? 아래에서 볼 수 있듯이, 두 가지 Available Node Affinity Type는 DuringExecution 값이 `Ignored`로 설정되어 있습니다. 즉, 파드는 계속 실행되며 Node Affinity의 변경 사항은 일단 예약되면 파드에 영향을 미치지 않습니다.

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/nats.PNG

Planned Node Affinity Type은 DuringExecution 부분에서 차이가 있습니다. `RequiredDuringExecution`이라는 새 옵션이 나타났으며, 이 옵션은 Node Affinity을 충족하지 않는 노드에서 실행 중인 파드를 제거합니다.  즉, Large 노드에서 실행 중인 파드는 Large 레이블이 노드에서 제거되면 제거되거나 종료됩니다.

https://github.com/kodekloudhub/certified-kubernetes-administrator-course/raw/master/images/nats1.PNG

반응형

댓글