Pod Scheduling

그림 출처 : https://kubesphere.io/blogs/monitoring-k8s-control-plane/

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
nodeName 설정(redis와 nginx 둘 다 node1으로 배정)

-  kubectl get pod -o wide

node1에서만 생성

 

실습 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
node 마다 라벨 지정

-  k get node -L gpu,ssd

-L 옵션 사용하여 조회하기

-  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

gpu=true인 node에 배정하도록 nodeSelector 설정
gpu=true가 없는 node3에는 배정되지 않았음을 알 수 있다.

 

실습 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

yaml

required : disktype=exist
preffered: gpu="true", disktype="ssd"
node2는 둘 다 해당되니까 weight = 20
node1은 weight = 10

weight가 더 높은 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

label이 app=backend인 Pod가 실행중인 Node에 5개의 Pod를 배정한다

backend Pod가 실행중인 node2에 5개의 frontend Pod가 배정되었다.

 

실습 5) nodeTaint

-  kubectl describe nodes master | grep -i taint
NoSchedule : 스케줄 하지 마라

기본적으로 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
SchedulingDisabled 된다
-  kubectl apply -f deploy-nginx.yaml
실제로 node1을 제외한 Node에 Pod들이 배정된다.

-  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 생성)
pod-db 는 node1에 배정되었다.

node1의 H/W를 교체하는 일이 생겨서 실행중인 Pod를 모두 제거한 후 다시 다른 곳으로 실행하도록 하기 위해 node1을 drain한다.
-  kubectl drain node1 --ignore-daemonsets --force

drain을 하면 해당 node(node1)는 cordon이 된다.

단독으로 실행된 pod-db는 다시 살아나지 않는다

 

'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

+ Recent posts