Worker Node를 잠시 내루거나, 업데이트가 필요할 때
Node 내부의 Software를 업그레이드 해야하거나, 혹은 문제가 생겼을 경우에 해당 Node를 안전하게 내리고 다시 올려야 합니다.
그럼 문제가 되는 부분은 해당 Node에서 실행되고 있던 Pod들입니다. 만약 아무도 모르는 어떠한 오류로 인하여 Worker Node-1이 내려간다고 가정하였을 때, 사용자 입장에서 해당 Pod에 접속하다가 오류를 만나게 될 것입니다.
위의 그림에서처럼 만약 사용자가 파란색 Pod에 접속하여 서비스를 이용하고 있었을때, Worker Node-1번이 이유모를 오류로 내려갔다고 가정해봅시다.
그럼 사용자는 LoadBalancer와 같은 경로를 통해 Worker Node-2번에 배포되어 있는 파란색 Pod로 접속하면 다시 서비스가 가능합니다.
이렇게 ReplicaSet이 여러 개이고, 여러 Node에 흩어져 있는 경우는 문제가 되지 않습니다.
문제가 되는 경우는 아래와 같습니다.
- 사용자가 초록색 Pod에 접속하다가 Worker Node-1번이 내려간 경우
- 사용자가 빨간색 Pod에 접속하다가 Worker Node-3번이 내려간 경우
이런 경우에는 사용자는 기존에 이용하던 서비스를 이용할 수 없게 됩니다.
쿠버네티스는 어떻게 하고 있을까?
쿠버네티스는 Worker-Node가 다시 올라오길 기다립니다.
내려갔었던 Node가 바로 다시 돌아오면 사실 문제가 없습니다. 근데 이 '바로' 는 과연 몇 초, 몇 분일까요?
이건 kube-controller-manager
가 정할 수 있으며 default는 5분입니다.
해당 내용은 아래와 같은 명령어로 수정할 수 있습니다.
즉, node가 다운될때마다 master node는 5분동안 기다립니다. 해당 시간을 Pod Eviction Timeout이라고 합니다.
만약 Pod Eviction Timeout이 지난 후에 node가 돌아오면 node는 공백이 된 상태로 돌아오게 됩니다. (안에 아무 Pod가 없는 상태)
이렇게 되면 문제가 될 수 있기 때문에 명령어를 통해 미리 방지할 수 있게 도와줍니다.
drain
, uncordon
, cordon
drain
- worker node에 있는 Pod들을 안전하게 다른 Node들로 이동
drain
명령어는 worker node에 있는 Pod들을 안전하게 다른 Node들로 이동시켜줍니다.
만약 node-1이 문제가 생길 것 같다던가 모든 Pod들을 옮기고 update를 진행해야 하는 경우에 아래와 같은 명령어를 사용합니다
그래서 모든 작업이 다른 Node로 이동할 수 있게 합니다.
즉, drain 명령어를 실행하면 해당 node-1에서 pod 들이 정상적으로 종료되고, 다른 Node에서 Node-1에서 실행되던 Pod들이 재현되게 됩니다ㅏ.
restriction을 끝내지 않는 이상 위의 명령어를 입력하게 되면 node-1에서는 scheduling에서 제외되어서 pod 일정을 잡을 수 없게 됩니다.
그럼 다시 node-1이 정상적으로 돌아오더라도 node-1은 scheduling에서 제외됩니다.
다시 node-1이 일을 하게 하려면 uncordon
이라는 명령어를 사용하여야 합니다.
uncordon
- Worker Node Restriction 해제
위의 명령어를 사용하면 node-1이 다시 Pod Schedule이 가능하게 됩니다.
물론 그렇다고 해서 이동한 Pod들이 다시 돌아오는 것은 아닙니다. 다른 Node에서 Pod는 그대로 실행되고, 이후에 Pod가 삭제되거나 새로 생성될 때 Schedule 될 수 있습니다.
그럼 만약 Node-1에 있던 Pod들을 이동시키지 않고, 해당 Node-1이 더이상 Schedule하지 않도록 하려면 cordon
명령어를 사용합니다.
cordon
- 기존 node에서 pod를 종료하거나 이동시키지 않고 싶을 때
cordon은 drain과 달리 기존 node에서 pod를 종료하거나 이동시키지 않습니다.
단순히 해당 node에 새 pod가 scheduling되지 않도록 하는 명령어 입니다.
'클라우드 네이티브 > Kubernetes' 카테고리의 다른 글
쿠버네티스에 배포할 때 사용할 객체 (0) | 2024.03.08 |
---|---|
쿠버네티스 등장 배경과 용어 (4) | 2024.03.08 |
[DevOps] 쿠버네티스에 스프링 프로젝트 배포하기(macOS m1) (1) | 2023.12.07 |
[DevOps] ArgoCD와 사용 이유 (0) | 2023.12.07 |
도커, 도커 엔진, 컨테이너, 가상 서버, 도커 데몬 (0) | 2023.03.27 |