콤퓨우터/필기: KodeKloud CKA 강의

59-63. Taints, Tolerations, Node Selectors, Affinity

파란화면 2024. 5. 14. 22:29
반응형

Taints, Tolerations

  • 특정 "Taint"가 씌워진 노드에는 Toleration이 없는 Pod가 배치될 수 없다

    • 강의에서는 "모기기피제를 뿌린 사람과 내성 없는 벌레"라는 비유를 쓴
  • 하지만, 만약 특정 Taint에 대한 Toleration이 있는 Pod라면 해당 Taint가 씌워진 노드에 배치될 수 있다.

    • 다만, 어떤 Pod이 특정 Taint에 대한 Toleration을 가지고 있다고 해서, Taint가 일치하는 노드에만 배치된다는 것은 아님
      • 스케줄러의 마음에 따라서는, 그냥 Taint 없는 다른 노드에 갈 수도 있음
        • 이것은 "특정 노드가 어떤 Pod을 받아들일것인가"에 대한 문제이기 때문에, "특정 Pod을 어떤 노드에 지정하고 싶다"라는 경우 Node Selector를 이용하여야 함

즉 Taint는 노드에, Toleration은 Pod에 부여되는 것

실제

Taint

kubectl taint nodes 노드명 key=value:taint-effect 형태

  • key=value 쌍이라는 Taint를 노드에 부여
  • taint-effect: 적절한 Toleration이 없는 Pod에게 무엇을 할 것인가?
    • NoSchedule: Toleartion 없는 Pod를 배치하지 않음
    • PreferNoSchedule: 되도록 배치하지 않음
    • NoExecute: Toleartion 없는 Pod을 배치하지 않고, 이미 들어가 있는 Pod도 쫓아냄

예를 들어, kubectl taint nodes node01 app=blue:NoSchedule 같은 형식이 된다

fun fact) 컨트롤 노드에 사용자의 Pod이 배치되지 않는 이유는, 쿠버 설치 시에 기본값으로 Taint가 설정되기 때문이다.

삭제

kubectl taint nodes 노드명 key=value:taint-effect- (맨 뒤에 -가 붙음) 으로 삭제 가능

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  15s   default-scheduler  0/2 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 1 node(s) had untolerated taint {spray: mortein}. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.

Tolerations

Pod Definiton file에 설정 적용

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: nginx-container  // -는 YAML에서 리스트의 첫 항목임을 가리킴
    image: nginx
  tolerations: //app=blue:NoSchedule이라면
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule"

Node Selector

"특정 Pod을 어떤 노드에 지정하고 싶다"라는 경우 Node Selector를 이용하여야 함

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: nginx-container
    image: nginx
  nodeSelector:
    size: Large // 선택할 노드의 label!

그럼 노드를 어떻게 라벨링하는가

kubectl label nodes 노드명 lavel-key=lavel-value

이 경우에는, kubectl label nodes node-1 size=Large 같은 식이 될 것

Node Selector의 문제점

만약에 특정 Pod을 size=Large이거나 size=Medium인 노드에 배치하고 싶다면? (OR)
혹은, size=Large가 아닌 Pod에 배치하고 싶다면? (NOT)

  • Node Selector로는 달성 불가
  • Node Affinity와 Anti-Affinity를 사용하여야 함

Node Affinity

"Great Power comes with Great Complexity"

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue
  labels:
    name: blue
spec:
  selector:
    matchLabels:
      name: blue
  template:
    metadata:
      name: blue-pod
      labels:
        name: blue
    spec:
      containers:
      - name: blue-nginx
        image: nginx
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: color
                operator: In
                values:
                - blue
                - green
  replicas: 3

if (values.in(key)) 같은 느낌

  • operator 종류: In, NotIn, Exists, ...

Affinity의 종류

  • requiredDuringSchedulingIgnoredDuringExecution

    • During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
      • 만약 규칙에 match되는 노드가 없으면 그냥 그 Pod은 스케줄링이 안된다
    • During Execution (Pod이 실행 중인 상태. Affinity 룰이 새롭게 들어갔을 경우, 노드의 label이 바뀌었을 경우 ...)
      • Ignored (지금 실행중인 경우에는 Affinity가 무시됨)
  • preferredDuringSchedulingIgonredDuringExecution

    • During Scheduling (Pod이 존재하지 않다가 처음 생성되는 때)
      • 만약 규칙에 match되는 노드가 없으면 대충 아무 노드에 넣는다

정리

  • Taint & Toleration은, "특정 노드"에 Toleration을 가진 Pod만 들어갈 수 있게 하는 역할을 한다
  • Node Selector & Node Affinity는, "특정 Pod"이 어느 노드에 삽입될 수 있는지를 결정한다
  • 이 둘을 동시에 사용하면, 특정 노드에 특정 Pod만, 또 특정 Pod에 특정 노드만 들어가게 할 수가 있다
반응형

'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글

71. DaemonSet  (0) 2024.05.17
67. Resource Requests and Limits  (0) 2024.05.14
44. Imperative v. Declarative  (0) 2024.05.14
41. Namespaces  (0) 2024.05.14
36. Services  (0) 2024.05.14