쿠버네티스/중급

Pod - QoS Classes, Node Scheduling

라리음 2022. 8. 8. 14:47

이 글은 인프런의 대세는 쿠버네티스 강의를 보며 정리한 글입니다.

 

 

 

 

QoS classes

 

* Node에 할당된 메모리가 파드에 모두 할당 되어있는 상황에서 Pod1이 추가의 Memory를 필요로 하면

다른 Pod (1순위인 BestEffort)에서 Memory를 들고와 사용하고 그것도 부족하면

또다른 Pod (2순위인 Burstable)에서 Memory를 들고와 사용함.

 

 

 

 

 

 

- BestEffort (1순위)

 

어떤 Container 내에도 Request와 Limit 미설정

 

- Burstable (2순위)

 

각 Container 내에 Memory와 CPU의 Request와 Limit의 값이 다름

OOM score에 맞게 (안에서의 순서) 제거 됨.

 

- Guaranteed

 

모든 컨테이너에 request와 limit이 설정

request와 limit에는 Memory와 CPU가 모두 설정

각 Container 내에 Memory와 CPU의 Request와 Limit의 값이 같음

 

가장 중요한 서비스이므로 BestEffort와 Burstable으로 부터 리소스를 빌려옴.

 

 

 

 

 

 

 

 

 

Node Scheduling

 

 

 

 

Node 선택

 

 

 

1. NodeNmae

 

Node의 이름을 지정하여 Pod를 생성

Node 이름이 계속 바뀔 수 있으므로 추천 X

 

 

 

 

2. NodeSelector

Pod의 Key와 Value에 맞는 Node에 생성

매칭이 되는 Label이 없으면 Pod가 생성되지 않고 오류가 남

 

 

 

 

 

3. NodeAffinity

Pod의 Key만 설정해도 많은 메모리가 남은 Node에 할당

Key와 Value가 맞지 않더라도 많은 자원이 남은 Node에 할당

 

matchExpressions에서 key값은 일치하게 operator은 Exists로 하면 이에 맞는 노드에 scheduling을 함

 

required를 설정했을때는 반드시 key값이 일치해야 할당되지만 preferred일 경우 일치하지 않아도 적절하게 할당

-> preffered일 경우 어느 노드를 우선적으로 할당할지 weight를 줄 수 있다.

 

 

 

 

Pod간 집중/분산

 

 

 

1. Pod Affinity

한 노드에 같이 있어야 작동하는 Pod끼리 엮어서 같은 node안에 scheduling 해줌 (ex) PV)

 

 

 

2. Anti-Affinity

Pod Affinity와 반대 개념으로 master과 slave를 생성해 서로 다른 Node에 들어가게 Scheduling 해줌

-> 다양한 Node에 컨테이너가 존재하게 하여 트래픽이 집중 되어도 분산시켜줌.

 

 

 

 

 

 

Node에 할당제한

 

 

 

Toleration/Taint

 

- 특정 하드ㅞ어 혹은 소프트웨어가 요구되는 작업을 하는 Pod만 해당 scheduling을 하고 싶을 때

toleration을 주어서 할당함 (노드를 지정하거나 자동 스케쥴링으로는 할당 안됨.)

ex) GPU

 

 

 

 

 

 

 

 

실습

 

 

 

 

 

 

 

 

 

 

 

 

 

1. Node Affinity


1-1) Node Labeling

kubectl label nodes k8s-node1 kr=az-1
kubectl label nodes k8s-node2 us=az-1

1-2) MatchExpressions

apiVersion: v1
kind: Pod
metadata:
 name: pod-match-expressions1
spec:
 affinity:
  nodeAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:   
    nodeSelectorTerms:
    - matchExpressions:
      -  {key: kr, operator: Exists}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

1-3) Required

apiVersion: v1
kind: Pod
metadata:
 name: pod-required
spec:
 affinity:
  nodeAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - {key: ch, operator: Exists}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

1-4) Preferred

apiVersion: v1
kind: Pod
metadata:
 name: pod-preferred
spec:
 affinity:
  nodeAffinity:
   preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      preference:
       matchExpressions:
       - {key: ch, operator: Exists}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

 

2. Pod Affinity / Anti-Affinity


2-1) Node Labeling

kubectl label nodes k8s-node1 a-team=1
kubectl label nodes k8s-node2 a-team=2

2-2) Web1 Pod

apiVersion: v1
kind: Pod
metadata:
 name: web1
 labels:
  type: web1
spec:
 nodeSelector:
  a-team: '1'
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

2-3) Web1 Affinity Pod

apiVersion: v1
kind: Pod
metadata:
 name: server1
spec:
 affinity:
  podAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:   
   - topologyKey: a-team
     labelSelector:
      matchExpressions:
      -  {key: type, operator: In, values: [web1]}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

2-4) Web2 Affinity Pod

apiVersion: v1
kind: Pod
metadata:
 name: server2
spec:
 affinity:
  podAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:   
   - topologyKey: a-team
     labelSelector:
      matchExpressions:
      -  {key: type, operator: In, values: [web2]}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

2-5) Web2 Pod

apiVersion: v1
kind: Pod
metadata:
  name: web2
  labels:
     type: web2
spec:
  nodeSelector:
    a-team: '2'
  containers:
  - name: container
    image: kubetm/app
  terminationGracePeriodSeconds: 0

 

 

2-6) Master Pod

apiVersion: v1
kind: Pod
metadata:
  name: master
  labels:
     type: master
spec:
  nodeSelector:
    a-team: '1'
  containers:
  - name: container
    image: kubetm/app
  terminationGracePeriodSeconds: 0

2-7) Master Anti-Affinity Pod

apiVersion: v1
kind: Pod
metadata:
 name: slave
spec:
 affinity:
  podAntiAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:   
   - topologyKey: a-team
     labelSelector:
      matchExpressions:
      -  {key: type, operator: In, values: [master]}
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

 

3. Taint / Toleration


3-1) Node Labeling

kubectl label nodes k8s-node1 gpu=no1

3-2) Node1 - Taint

kubectl taint nodes k8s-node1 hw=gpu:NoSchedule

 

3-3) Pod with Toleration

apiVersion: v1
kind: Pod
metadata:
 name: pod-with-toleration
spec:
 nodeSelector:
  gpu: no1
 tolerations:
 - effect: NoSchedule
   key: hw
   operator: Equal
   value: gpu
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

3-4) Pod without Toleration

apiVersion: v1
kind: Pod
metadata:
 name: pod-without-toleration
spec:
 nodeSelector:
  gpu: no1
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

3-5) Pod1 with NoExecute

apiVersion: v1
kind: Pod
metadata:
 name: pod1-with-no-execute
spec:
 tolerations:
 - effect: NoExecute
   key: out-of-disk
   operator: Exists
   tolerationSeconds: 30
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

3-6) Pod2 with NoExecute

apiVersion: v1
kind: Pod
metadata:
 name: pod2-without-no-execute
spec:
 containers:
 - name: container
   image: kubetm/app
 terminationGracePeriodSeconds: 0

3-7) Node2 - Taint

kubectl taint nodes k8s-node1 hw=gpu:NoSchedule-
kubectl taint nodes k8s-node2 out-of-disk=True:NoExecute



Sample Yaml


NodeName

apiVersion: v1
kind: Pod
metadata:
 name: node-name
spec:
 nodeName: k8s-node1
 containers:
 - name: container
   image: kubetm/app

 

NodeSelector

apiVersion: v1
kind: Pod
metadata:
 name: node-selector
spec:
 nodeSelector: 
  key1:value1
 containers:
 - name: container
   image: kubetm/app

 


kubectl


Label

# Node에 라벨 추가
kubectl label nodes k8s-node1 key1=value1
# Node에 라벨 삭제
kubectl label nodes k8s-node1 key1=value1-