Pod Scheduling
: kubectl 및 yaml 파일로 Pod를 배포하라고 명령 → master의 API Server가 Master의 Scheduler로 보냄 → Scheduler가 어느 node에 Pod를 배포할 것인지를 결정 (==> 요청하는 명령 및 Node 상태에 따라)
- Pod 배정 시 특정한 Node에만 배치할 수 있다
(nodeName, nodeSelector, nodeAffinity, podAffinity) - 특정한 Node에는 배정하지 않도록 설정할 수도 있다
(podAntiAffinity, Taint, cordon)
ex) 기본적으로 master에는 Taint 설정되어 있어서 Pod이 실행되지 않음
nodeName : node 이름 사용하여 배정
nodeSelector : node 라벨 사용하여 배정
nodeAffinity : nodeSelector와 유사, 가중치 부과
podAffinity : 특정 label을 가진 Pod가 실행중인 node에 배정
podAntiAffinity : 특정 label을 가진 Pod가 실행중이지 않는 node에 배정
Cordon : 노드에 cordon 설정 시 그 노드는 Pod를 배정받지 않음
Drain : 기존에 실행중인 Pod를 뽑아내어 다른 node로 이동하고, cordon 설정이 된다.
실습 1) nodeName
- wget http://down.cloudshell.kr/k8s/lab/pod/hostPath-2pods.yaml
- kubectl apply -f hostPath-2pods.yaml
- kubectl get pod -o wide
실습 2) nodeSelector
node label 지정하기 : kubectl label nodes [노드이름] [label key]=[label value]
label 조회하기 : kubectl get node --show-labels
- kubectl label node node1 gpu=true
- kubectl label node node2 gpu=true
- kubectl label node node{1,3} ssd=true
- k get node -L gpu,ssd
- wget http://down.cloudshell.kr/k8s/lab/pod/tensorflow-gpu.yaml
- wget http://down.cloudshell.kr/k8s/lab/pod/tensorflow-gpu-replicas3.yaml
- wget http://down.cloudshell.kr/k8s/lab/pod/tensorflow-gpu-ssd.yaml
- kubectl apply -f tensorflow-gpu.yaml -f tensorflow-gpu-replicas3.yaml -f tensorflow-gpu-ssd.yaml
실습 3) nodeAffinity
• nodeSelector: selector field에 명시된 모든 label이 포함되어야 배정됨
• nodeAffinity: 특정 node에만 Pod이 실행되도록 유도
- kubectl label nodes node2 disktype=ssd
- wget http://down.cloudshell.kr/k8s/lab/pod/tensorflow-gpu-ssd-affinity.yaml
- kubectl apply -f tensorflow-gpu-ssd-affinity.yaml
required : disktype=exist
preffered: gpu="true", disktype="ssd"
node2는 둘 다 해당되니까 weight = 20
node1은 weight = 10weight가 더 높은 node2에 배정됨을 알 수 있다.
label 삭제하기
- kubectl label nodes node{1..3} disktype-
- kubectl label nodes node{1..3} gpu-
- kubectl label nodes node{1..3} ssd-
실습 4) podAffinity
• podAffinity : pod끼리 가깝게 배치하기
• podAntiAffinity : pod끼리 멀리 배치하기
- kubectl run backend -l app=backend --image=busybox -- sleep 9999
- kubectl get pods -o wide --show-labels
- kubectl get pod -o wide
- wget http://down.cloudshell.kr/k8s/lab/pod/pod-affinity.yaml (## podAffinity)
- kubectl apply -f pod-affinity.yaml
실습 5) nodeTaint
- kubectl describe nodes master | grep -i taint
기본적으로 master에는 Taint 설정이 되어 있어 Pod를 배치하지 않는다.
- kubectl taint nodes master node-role.kubernetes.io/master- (## Taint 설정 해제) >> pod 배정하여 실행함
- kubectl taint nodes master node-role.kubernetes.io=master:NoSchedule (## Taint 설정)
- kubectl taint nodes node1 role=web:NoSchedule (## pod 배정되지 않음)
- kubectl describe nodes node{1..3} | grep -i taint (## Taint 설정 여부 확인)
- kubectl taint nodes node1 role- (## 특정 node의 taint 삭제)
실습 6) cordon
- kubectl cordon node1
- kubectl apply -f deploy-nginx.yaml
- kubectl uncordon node1 (## cordon 기능 해제)
실습 7) drain
drain 옵션
--ignore-daemonsets : 데몬셋이 관리하는 Pod들은 무시하고 그냥 삭제
--force : rc, rs, job, daemonset, statefulset에서 관리하지 않는 Pod까지 제거
특정 node에서 동작중인 모든 Pod을 제거
- kubectl apply -f deploy-nginx.yaml (## 4개의 pod)
- kubectl run pod-db --image=redis (## 따로 하나의 pod 생성)
node1의 H/W를 교체하는 일이 생겨서 실행중인 Pod를 모두 제거한 후 다시 다른 곳으로 실행하도록 하기 위해 node1을 drain한다.
- kubectl drain node1 --ignore-daemonsets --force
drain을 하면 해당 node(node1)는 cordon이 된다.
'Study > Cloud' 카테고리의 다른 글
Kubernetes - Metrics Server (0) | 2022.07.25 |
---|---|
Kubernetes - 인증과 권한 (0) | 2022.07.25 |
Kubernetes - Controller-2 (0) | 2022.07.23 |
Kubernetes - Controller (0) | 2022.07.22 |
Kubernetes - Service (0) | 2022.07.22 |