Pod - QoS Classes, Node Scheduling
이 글은 인프런의 대세는 쿠버네티스 강의를 보며 정리한 글입니다.
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-