개념
- kubernetes는 워커 노드의 장애가 발생하더라도 정상적, 혹은 부분적으로 기능을 수행할 수 있도록 결함 감내(fault tolerant) 시스템으로 디자인되어 있습니다. kubernetes의 마스터 노드는 인프라의 상태를 주기적으로 워커 노드로부터 수신하며, 어떤 이유로 인해 문제가 발생하면 다시 복구하도록 동작합니다.
- 그러나 모든 경우의 문제를 해결하는 데는 한계가 있으며 특정 노드의 유지 보수를 위해 운영 중이던 파드의 우아한 종료(gracefully shutting down)를 위한 개입이 필요할 수 있습니다.
- 노드가 준비되지 않았습니다.
- 노드에 연결할 수 없습니다.
- 디스크 부족
- 네트워크를 사용할 수 없습니다
1. Cordon
- cordon 사전적 뜻: 저지선(경찰군인 등이 설치한 진입이나 진출) [비상경계선]의 의미
=> kubernetes의 클러스터 노드 중 하나가 어떠한 이유(리소스 부족, 물리적 결함 등)로 고장이 나면서, SchedulingDisabled 또는 Not Ready 상태로 표시되어 더 이상 해당 노드에 Pod가 생성되진 않지만,
기존에 있던 Pod는 running로 운영되고 있습니다.
해당 노드에 더 이상 파드가 생성되지 않도록 보호하고 문제 해결을 위해 Cordon을 진행합니다.
- node describe 정보를 확인하니 NoSchedule Taint(해당 노드가 오염되어 스케쥴링 불가) 또는NodeNotSchedulable
상태가 되어 스케쥴링이 불가능한 노드가 된 것을 확인합니다.
이때, 좀 더 확실하게 고장난 노드(worker-1)가 스케쥴링이 불가능한 노드로 설정하고 문제를 파악하고자 합니다.
Cordon(차단) 설정
1-1 명령어
- cordon 적용
kubectl cordon [node 이름]
- cordon 해제
kubectl cordon [노드 이름]
- node의 상태 및 daemonset, pod의 상태 확인 => running 상태
1-2 적용확인: worker-1 노드에 cordon 적용 후 디플로이먼트 배포
kubectl create deployment nginx --image=nginx --replicas=3
=> worker-1 노드를 제외한 다른 노드에만 배포된 것을 확인
1-3 uncordon 적용
kubectl uncordon [노드 이름]
2. Drain
drain 사전적 뜻: 배수구, 물 빠짐, 배출 등의 의미로, 노드에 존재하는 모든 Pod를 제거하고, Pod를 다른 노드에 스케쥴링하도록 합니다. drain한 node는 cordon을 실행한 것과 동일하게 SchedulingDisabled 상태가 되기 때문에 신규 Pod를 스케쥴링하지 않습니다.
- drain은 기존에 운영하던 온프레미스와 public-cloud를 연결하여 하이브리드 클라우드로 운영 시 자원 낭비에 따른 서버 반납이나 커널 업그레이드와 같은 하드웨어 유지보수를 위한 중단 등으로 의도적으로 워커 노드를 축소시키고자 할 때, 축소 대상의 노드에서 운영중인 애플리케이션 Pod을 다른 노드로 모두 배출(drain)할 때 사용합니다.
Drain(배출) 설정
2-1 명령어
- 드레인 적용
kubectl drain [노드 명]
- 이 때 아래와 같이 오류가 뜬다. 이유는 daemonset이 아직 작동 중이라서 그렇다.
- 노드를 내리는 작업에서 문제가 발생하는 경우 권장하는 옵션을 사용
- --delete-local-data: local data 를 모두 삭제
- --ignore-daemonsets: demonset 을 무시하고 모두 삭제
- --force: 강제로 모두 삭제
* 데몬셋(daemonset)이란? 데몬셋은 파드를 생성하고 관리하는데 항상 실행되어야 할 특정 파드를 관리한다.
- ex. kube-proxy
- 드레인 해제
kubectl uncordon [노드 명]
드레인을 해제하고 다른 노드의 파드를 삭제하거나 scale로 파드 수를 조정하면 해당 노드에 재배포된 것을 확인