Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

전공공부

[K8S - CKA] Scheduling & Taints and Tolerant 본문

Study/K8S

[K8S - CKA] Scheduling & Taints and Tolerant

monitor 2023. 9. 10. 14:47

1. How to Schedule?


정상적인 동작을 하는 스케쥴러라면 알아서 노드 후보자를 쫙 꺼낸 뒤 자동으로 스케쥴 될 노드에 바인딩 객체를 만들어서 포드를 할당하게 됩니다.

노드를 모니터링하고 스케줄 해줄 객체가 존재하지 않는다면 어떻게 될까요?

pod.yaml 파일 내부의 spec.nodeName 부분에 할당 할 노드의 이름을 써줘야 합니다. (nodeName은 pod create 할 때만 사용 할 수 있습니다.)

또는, 바인딩 객체를 실제로 생성하고 바인딩 API가 그것을 읽게해야 합니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-01

2. Labels and Selectors


labeling을 하는 이유는 특정 필드만을 이용하여 Select 하여 객체끼리의 연결 또는 모니터링을 진행하기 위해서이다.

예제로 아래 예시를 살펴보자

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

위 예제에서 Deployment는 (key 이름 : app , value 이름 : nginx) 인 Label Pod를 탐색 할 것이다. 이는 template의 설정된 pod의 labels을 가져와서 모니터링 할 수 있게 만들기 위함이고 만일, 기존 사용하던 pod의 labeles app 이름을 바꾸면 더이상 해당 객체는 deployment로 모니터링 되지 않느 것을 확인 할 수 있다.

3. Taints And Tolerations


Taint 설명을 위한 예시를 들어보겠습니다.

우리에게 벌레가 꼬일 때 우리는 모기 방지 스프레이를 우리 몸에 뿌리죠 이것이 Taint 입니다.

그러면 모기는 이 스프레이 냄새를 맡고 달아나서 intolerant 상태가 됩니다. 그러나, 무당벌레의 경우 이 냄새를 맡아도 지장이 없죠 그럴때는 사람에게 꼬이게 됩니다. 이 경우는 Tolerant 상태입니다.

자, 그럼 이것을 요약 해봅시다.

허용 가능한 경우

  1. Taint 가 있는 객체
  2. Taint를 버틸 수 있는 객체

위 예시를 사람을 -> 노드로 벌레를 -> 포드로 생각하면 됩니다.

즉, 노드에 taint를 뿌려두고 이를 견딜 수 있는 pod는 tolerant 상태가 되면서 Node에 붙을 수 있겠죠.

이것을 쓰는 예시는 노드1에는 어떠한 응용 프로그램을 설치해서 그것을 사용하는 pod만 붙이고 싶습니다. 그렇다면 taint를 노드에 걸고 tolerant한 pod만 받을 수 있겠죠.

(Taint는 노드에 정해지고 , tolerant는 pod에 정의 됌을 기억하자)

Taints - Node

k taint nodes <node-name> key=value:taint-effect

여기서 taint-effect는 Pod가 taint를 견디지 못 할때 설정할 부작용입니다. (NoSchedule, PreferNoSchedule, NoExecute)

실제 예제

k taint nodes node1 app=blue:NoSchedule

app=blue가 아니라면 taint에 걸린 Pod들은 모두 NoSchedule 상태가 됩니다.

아래 pod.yaml에 따르면 (key name : app, value name : blue , effect : NoSchedule) 으로 잡았기 때문에 위 node의 taint에는 허용되는 상태가 되는 것입니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "app"
    operator: "Equals"
    value: "blue"
    effect: "NoSchedule"

Taints Status - NoExecute


Taint 효과가 실행이 되면 Pod 상태가 실행 상태에서 Execute 불가능하게 됩니다.

결론

taint와 tolerant는 선호하는 node를 만드려는 것이 아닙니다. 특정 포드만 특정 노드에 붙게 하려면 노드 선호도를 지정하죠.

*그저, 특정 pod의 접근을 막기 위함이고 이는, 마스터 노드에 application pod들이 못 들어오게 끔 하는 성질을 만들어 준 것입니다. *