[따배쿠/멤버십] 12-2. taint & toleration, cordon& drain
12-1을 이어서 Pod Scheduling 기술 중 taint와 toleration을 알아보자
애플리케이션 파드를 실행하면 마스터 노드에서는 실행되지 않고 워커노드에서 실행되고
마스터 노드에서는 api, 스케줄러, etcd 등이 실행된다.
이는 taint & toleration 때문이다.
kubectl describe nodes master | grep -i taint로 마스터의 taint를 확인해보자
Taints에 control-plane의 키로 Noschedule 값이 들어가서 마스터 노드에서는 애플리케이션 파드가 실행되지 않는다.
만약 워커노드인 node1에 Noschedule을 추가하면 node2에서만 애플리케이션 파드들이 실행된다.
또한 toleration이 있는 파드는 동일한 taint가 있는 노드를 포함하여 모든 모드에 배치된다.
kubectl taint nodes node1 role=web:NoSchedule을 입력하고
kubectl describe nodes node{1,2} | grep -i taint 을 통해 node1과 node2의 taint를 확인하자
deploy-nginx.yaml파일의 내용은 아래와 같다.
replicas는 4개이고 nginx-pod를 실행한다.
현재 tolerations는 주석처리되어있다.
kubectl apply -f deploy-nginx.yaml로 실행해보면 노드1은 role=web:NoSchedule이므로 노드2에서만 파드가 생성된다.
이제 kubectl delete -f deploy-nginx.yaml로 파드를 삭제시키고
deploy-nginx.yaml 파일의 tolerations의 주석을 제거하여 아래와 같이 수정한다.
tolerations의 키는 role로 web:NoSchedule인 노드1에도 해당 파드를 실행할 수 있도록 했다.
kubectl apply -f deploy-nginx.yaml로 실행해보면 노드2 뿐만 아니라 노드1에도 파드가 잘 실행된다.
kubectl describe nodes node{1,2} | grep -i taint을 통해 노드1과 노드2의 taint를 확인하면 none임을 확인할 수 있다.
이와 같은 방법으로 마스터 노드에도 toleration을 이용하면 애플리케이션 파드를 배치시킬 수 있다.
kubectl delete -f deploy-nginx.yaml으로 deploy를 다 삭제시키자
이제 cordon & drain에 대해 알아보자
cordon은 노드의 스케줄링을 중단시키고 uncordon은 허용시킨다.
kubectl cordon node2 을 통해 노드2를 스케줄링 받지 않을 수 있다.
kubectl apply -f deploy-nginx.yaml 로 확인해보면 노드1에서만 파드가 실행된다.
kubectl delete -f deploy-nginx.yaml 로 deploy를 삭제시키고
kubectl uncordon node2 를 통해 다시 노드2에도 스케줄링을 받아보자
그럼 노드1과 노드2 모두에 스케줄링 된다.
이번에는 drain에 대해 알아보자
만약 nginx 웹서버 4개가 실행중이고 db파드가 노드2에서 실행중이다가 노드2의 하드웨어 장비를 교체한다고 하면
노드2에 실행되는 모든 파드를 제거시켜야 한다. 이를 drain으로 할 수 있다.
먼저 kubectl apply -f deploy-nginx.yaml을 통해 웹서버를 노드1, 노드2에 고르게 실행시키고
kubectl run db --image=redis로 db파드를 실행시킨다.
db파드는 노드1에 실행됐다.
kubectl drain node1 --ignore-daemonsets --force로 노드1을 drain해보자
그럼 노드1의 파드들이 모두 비워져서 노드2로 옮겨졌다.
drain 명령으로 인해 노드1은 스케줄링 불가 상태이다.
이는 kubectl uncordon node1 을 통해 스케줄링 가능 상태로 복구할 수 있다.