Search
Duplicate
📒

[Kubernetes Infra] 06. 노드 스케쥴링

상태
완료
수업
Kubernetes Infra
주제
4 more properties
참고

노드 스케줄러

NOTE
스케줄링 ⇒ Kubelet이 Pod를 실행할 수 있도록 Pod가 Node에 적합한지 확인하는 작업!
어떤 노드(1~3)에 배치할지는 구성에 따라 다르다.
스케줄링 기능을 사용하지 않는다면 pod는 계속해서 pending 상태로 남는다.
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: myapp spec: containers: - name: nginx image: nginx nodeName: node01
YAML
복사
yaml에 node를 명시해서 직접 할당할 수 있다.
만약 명명된 노드가 없다면, Pod가 실행되지 않고, 자동으로 삭제될 수 있다.
만약 명명된 노드에 Pod를 수용할 수 있는 리소스가 없는경우, OOM(OutOfMemory)에러가 발생한다.

노드 스케쥴러 명령어(drain, cordon)

NOTE
node를 잠시 내려야하는 상황에 쳐했을때, 어떻게 안정적으로 클러스터를 유지할까?
drain 명령어를 통해 모든 workload를 다른 node로 옮길 수 있다!
# node에 떠있는 pod를 모두 안전하게 종료후 다른 node로 이주시킨다. k drain node01 --ignore-daemonsets # ignore-daemonsets를 추가한건 데몬셋은 drain으로 삭제가 불가능하기 때문 # node-2의 스케쥴링을 멈춘다. k cordon node-2 # node-1의 스케쥴링을 다시 시작한다. k uncordon node-1
Bash
복사
drain - 물을 빼내다, 건조하게 하다
노드에서 모든 작업을 빼내어 다른곳으로 이동시키는 과정
cordon - 띠, 장벽
특정 노드에 대한 스케줄링을 방지하는 가상의 장벽을 설정한다.
노드가 5분(--pod-eviction-timeout)안에 정상화되지 않으면 pod는 종료된다.
replicaset의 경우에는 다른 node에 자동생성, pod의 경우는 사라진다.

Taints And Tolerations

NOTE
TaintsTolerations는 특정 노드에 파드가 스케줄링되는것을 제어하는 방법이다!
Taint 설정은 대부분 해당 Node에 스케줄링되지 말라는 의도로 사용된다.
# taint-effect => Nochedule, PreferNoSchedule, NoExecute # kubectl taint nodes node-name key=value:taint-effect # 실제코드 kubectl taint nodes node1 app=red:Nochedule # key=value:effect
Bash
복사
node01 ⇒ taint 적용
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: nginx-container image: nginx # Tolerations을 설정하여 이 파드가 특정 Taints를 가진 노드에서 실행될 수 있도록 합니다. # key:value:effect와 동일한 노드의 taint를 허용한다. tolerations: - key: "app" # Taints 키 operator: "Equal" # 연산자 value: "red" # Taints 값(없을수도 있음) effect: "NoSchedule" # 해당 Taints가 파드 스케줄링에 미치는 영향
YAML
복사
Pod ⇒ tolerations 적용
Tolerations의 effect는 해당 파드가 어떤 타입의 taint를 용인할지 결정한다.
NoScheduler
toleration가 없는 Pod는 taint가 있는 노드에 스케쥴링되지 않는다.
PreferNoScheduler
시스템이 되도록이면 taint가 있는 노드에 파드를 배치하지 않으려하지만 가능은 하다.
NoExcute
toleration이 없는 새로운 Pod는 노드에 배치되지 않는다.
이미 노드에 존재하는 Pod는 toleration이 없다면 축출된다.

Node selector

NOTE
파드가 실행될 노드를 간단한 레이블 기반의 선택 기준으로 지정하는 기술!
size=Large의 라벨이 있는 노드에 할당한다.
k get node [노드 이름] --show labels kubectl label node [노드 이름] size=Large # 노드에 라벨등록
Bash
복사
node01 ⇒ size=Large 라벨 등록
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: nginx-container image: nginx nodeSelector: size: Large
YAML
복사
Pod ⇒ size=Large 셀렉터 등록
Node Selector 방식으로는 복잡한 경우에 힘들기 때문에 Node Affinity가 추가되었다.

Node Affinity

NOTE
파드가 실행될 노드를 고급 레이블 기반의 선택 규칙으로 지정하는 기술!
Node Selector보다 고급기능(in, notIn ..)으로 할당
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: nginx-container image: nginx # 파드의 스케줄링과 관련된 선호도를 설정합니다. affinity: nodeAffinity: # 노드 친화성 설정을 정의합니다. requiredDuringSchedulingIgnoredDuringExecution: # 스케줄링 시 요구되지만 실행 중에는 무시됩니다. nodeSelectorTerms: # 노드 선택 조건을 정의합니다. - matchExpressions: - key: color # 노드 레이블의 키를 정의합니다. operator: In # 연산자 'In'은 주어진 값 중 하나와 일치해야 함을 의미합니다. values: - red
YAML
복사
color : red의 노드에 스케줄링되어야 한다.
nodeAffinity에서는 여러가지 제어조건이 있다.
requiredDuringSchedulingIgnoredDuringExecution: 스케쥴링 하는 동안 ‘꼭 필요한’ 조건
prefereedDuringSchedulingIgnoredDuringExecution: 스케쥴링 하는 동안 ‘만족하면 좋은’ 조건이다.
requireDuringSchedulingRequiredDuringExecution: 스케쥴링/실행 하는 동안 ‘꼭 필요한’ 조건
key는 노드의 레이블 키 중 하나를 설정하고 operator는 key가 만족할 조건이다.
key 필드 값
설명
In
values[] 필드에 설정한 값 중 레이블에 있는 값과 일치하는 것이 하나라도 있는지 확인합니다.
NotIn
In과 반대로 values[]에 있는 값 모두와 맞지 않는 지 확인합니다.
Exists
key 필드에 설정한 값이 레이블에 있는지만 확인합니다. (values[] 필드가 필요 없습니다.)
DoseNotExist
Exists와 반대로 노드의 레이블에 key 필드 값이 없는지만 확인합니다.
Gt
Greater than의 약자로 values[] 필드에 설정된 값이 설정된 값 보다 더 큰 숫자형 데이터 인지 확인합니다. 이 때 values[] 필드에는 값이 하나만 있어야 합니다.
Lt
Lower than의 약자로 values[] 필드에 설정된 값이 설정된 값 보다 더 작은 숫자형 데이터 인지 확인합니다. 이 때 values[] 필드에는 값이 하나만 있어야 합니다.

Node Affinity vs Taint

NOTE
Taint로 스케쥴링 방지, Node Affinity로 스케쥴링 조건설정
Taint(스케줄링 금지)
특정 노드에 ‘방해물’을 설정하여 선택된 파드가 해당 노드에 스케쥴링 되지 않게한다.
Node Affinity(스케줄링 점수)
파드가 어떤 노드에 스케쥴링될지에 대한 선호도나 요구사항을 지정한다.

다중 스케쥴러

NOTE
기본 스케쥴러(kube-Scheduler)를 활용하지 않고 개별 스케쥴러를 생성하여 배포시 사용이 가능하다!
apiVersion: v1 kind: Pod metadata: name: nginx spec: schedulerName: my-scheduler containers: - image: nginx name: nginx
YAML
복사
Pod에 생성한 스케쥴러를 할당할 수 있다.
기본 스케쥴러 이외에 커스텀 스케쥴러를 만들 수 있으며 개수의 제한은 없다.
스케쥴러의 동작을 확인하고 싶다면 event로 확인이 가능하다.

포드선점(PriorityClass, Priority)

NOTE
PriorityClass는 Pod의 스케줄링 우선순위를 정의하는데 사용한다.
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 globalDefault: false description: "이 PriorityClass는 중요한 파드에 사용됩니다."
YAML
복사
apiVersion: v1 kind: Pod metadata: name: mixed-priority-pod spec: priorityClassName: high-priority # priority: 1000000 containers: - name: example-container image: nginx
YAML
복사
일반적으로 2개 모두 사용하지는 않지만 예시를 위해서 작성한다.