그림 출처 : 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 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