Node Selectors and Node Affinity

Yu Sang Min·2025년 5월 26일

CKA

목록 보기
20/110
post-thumbnail

📌 Node Selector

  • pod가 특정 노드에서만 작동하도록 한계를 설정해야 한다.
  • 예를 들어 1, 2, 3 번 노드 중 리소스 요구사항이 큰 pod는 가장 큰 노드로 배치되어야 한다.
  • 두 가지 방법
    1. node Selector

✅ Node Selector definition

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: data-processor
    image: data-processor

  nodeSelector:
    size: Large
  // labels
  • 여기서 size 필드는 사실 key-value로 이루어진 labels 이다.
  • schedulerlabels을 식별해서 pod를 올릴 올바른 node를 찾아낸다.

⌨️ Label Nodes Command

# 노드에 레이블 붙이기
$ kubectl label nodes <node-name> <label-key>=<label-value>

❌ Node Selector - Limitations

  • 더 복잡한 요구사항으로 노드를 식별해야할때

  • 예를 들어, 중간 또는 큰 크기의 노드나 작지 않은 등등..

  • Node Selector로는 이런 요구사항을 만족할 수 없다.

    1. Node Affinity
  • pod가 특정 노드에 호스트될 수 있도록 함

  • Node Affinity 는 특정 노드에 pod 배치를 제한하는 고급 기능을 제공

📋 Node Affinity Definition

apiVersion:
kind:

metadata:
  name: myapp-pod
spec:
  containers:
    - name: data-processor
      image: data-processor

  affinity:
    nodeAffinit:
      requiredDuringSchedulingIgnoreDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In || NotIn || Exists
            values:
            - Large
            // 만약 중간 크기를 지칭하는 레이블을 가진 노드에도 배치를 원하면 단지 추가 하면 됨
            - Medium
  • Operation 필드에서 NotIn을 명시하면 해당 레이블을 제외한다
  • 결국 다양한 연산자를 제공한다
  • Exists 연산자는 value를 필요로 하지않고 key의 존재만 식별하여 노드를 선택한다.

🔁 Life Cycle - Node Affinity Types

Available:
requiredDuringSchedulingIgnoredDuringExecution
preferredDuringSchedulingIgnoreDuringExecution

Planned:
requiredDuringSchedulingRequiredDuringExecution
  • 만약 Node Affinitylabels를 식별해 pod를 해당하는 node에 생성 했다.
  • 이후 해당 labels 이 할당되어 있는 nodelabels를 삭제하면 pod는 남아있을까?
  • 이를 위 예시에 있는 필드로 생명주기를 결정할 수 있다.

📆 DuringScheduling

  • pod가 존재하지 않다가 처음으로 만들어지는 상태를 뜻함
  • 처음 만들어지면 Node Affinity의 규칙을 따라 올바른 노드에 pod를 배치
  • 만약 일치하는 labels있는 노드를 사용할 수없다면?
  1. require 타입은 지정된 Affinity 규칙과 함께 podnode에 놓도록 지시함
  • pod를 못찾으면 스케쥴링도 안됨
  1. preferred 타입은 Node Affinity 규칙을 찾아 배치하려고 하지만 만약 없다면 무시하고 해당 pod를 모든 가능한 노드에 배치

🚀 IgnoreDuringExecution

  • 노드의 레이블이 변화해도 Ignored 되기 때문에 pod는 계속 해당 노드에 실행된다

❌ RequiredDuringExecution

  • 선호도 규칙에 부합하지 않는 노드에서는 실행 되지 않음
  • Terminate 된다!
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글