-
컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 3.2.2STUDY/Docker 2023. 5. 16. 23:17
6. 파드의 컨테이너 자동 복구 방법
쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되어 있는데, 특히 파드의 자동 복구 기술을 셀프 힐링(Self-Healing)이라고 한다. 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 한다.
7. 파드의 동작 보증 기능
쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록 보장하는 기능이 있다. 하지만 파드의 동작을 보증하기 위해서는 디플로이먼트로 생성해야 하는 조건이 있다.
디플로이먼트에 속한 파드가 아니면 어떤 컨트롤러도 해당 파드를 관리하지 않기 때문에, 해당 파드가 삭제되어도 다시 생성되지 않기 때문이다.
반면에 디플로이먼트에 속한 파드가 삭제될 경우에는 새로운 파드가 생성된다. replicas는 파드를 선언한 수대로 유지하도록 파드의 수를 항상 확인하고 부족하면 새로운 파드를 만들어 내는데, 임의의 파드가 삭제되면 replicas가 삭제된 파드를 확인하고 파드의 총 개수를 유지하기 위해 새로운 파드를 생성하기 때문이다.
이렇게 파드가 자동 복구가 되는 상황에서 디플로이먼트에 속한 파드를 삭제하기 위해서는, 상위 디플로이먼트를 삭제해야 디플로이먼트에 속한 파드가 삭제된다.
8. 노드 자원 보호하기
노드는 어떤 식으로 관리해야 할까? 우선 노드의 목적을 살펴보면, 노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 한다.
만약, 최근에 몇 차례 문제가 생긴 노드에 파드를 할당하게 되면 문제가 생길 가능성이 높아진다. 이런 경우 해당 노드를 사용해야 한다면, 영향도가 적은 파드를 할당해 일정 기간 사용하면서 모니터링해야 한다. 즉, 노드에 문제가 생기더라도 파드의 문제를 최소화해야 한다.
하지만 쿠버네티스는 모든 노드에 균등하게 파드를 할당하려고 한다. 이런 경우, 문제가 생길 가능성이 있는 노드라는 것을 쿠버네티스에 알려주기 위해 cordon 기능을 사용하고, 해당 기능을 통해 문제가 발생할 가능성이 있는 노드를 스케줄되지 않게 설정할 수 있다.
cordon 명령을 실행하면 해당 노드에 파드가 할당되지 않게 스케줄되지 않는 상태(ShedulingDisabled)라는 표시를 한다. 설정을 해제할 때는 uncordon 명령을 실행하면 된다.
$ kubectl cordon [노드명] -- 할당되지 않도록 설정
w3-k8s Ready,SchedulingDisabled <none> 117m v1.18.4
$ kubeclt uncordon [노드명] -- 할당되도록 설정 해제9. 노드 유지보수하기
쿠버네티스를 사용하다 보면 정기 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는 상황이 발생한다. 이런 경우를 대비해 쿠버네티스는 drain 기능을 제공한다. drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수할 수 있게 한다.
kubectl drain [노드명]
drain 명령을 실행하면 유지보수할 노드를 파드가 없는 상태로 만든다. 이때, 실제로 파드를 옮기는 것이 아니라 노드에서 파드를 삭제하고 다른 노드에 다시 생성한다(파드는 언제라도 삭제할 수 있기 때문에 쿠버네티스에서 대부분 이동은 파드를 지우고 다시 만드는 과정을 의미).
drain 명령을 그냥 실행하면 DaemonSet을 지울 수 없어서 명령을 수행할 수 없다고 나오는데, DaemonSet은 각 노드에 1개만 존재하는 파드라서 drain으로는 삭제할 수 없다. DaemonSet을 무시하고 진행하기 위해서는 ignore-daemonsets 옵션을 함께 사용해야 한다. 이렇게 하면 경고는 발생하지만 모든 파드가 이동된다.
kubectl drain [노드명] --ignore-daemonsets
drain 명령이 실행된 노드는 cordon 명령을 실행했을 때처럼 SchedulingDisabled 상태로 표시된다. 유지보수가 끝난 후 다시 스케줄을 받을 수 있는 상태로 복귀시키기 위해서는 uncordon 명령을 실행하면 된다.
10. 파드 업데이트하고 복구하기
파드에 속한 컨테이너의 버전을 업데이트하는 명령을 실행하면, 파드를 관리하는 replicas의 수를 줄이고 늘려 파드를 새로 생성하는 가장 쉬운 방식으로 동작한다. 이때 시스템의 영향을 최소화하기 위해 replicas에 속한 파드를 모두 한 번에 지우는 것이 아닌, 파드를 하나씩 순차적으로 지우고 생성한다. 이때 파드 수가 많으면 하나씩이 아니라 다수의 파드가 업데이트된다. 업데이트의 기본값은 전체의 1/4개이며, 최솟값은 1이다. 따라서 파드 업데이트 결과를 확인하면 파드들의 이름과 IP가 변경되어있는것을 확인할 수 있다.
반대로 업데이트를 하다가 이전 상태로 되돌려야 하는 경우, rollout undo를 사용해 업데이트 명령 실행을 취소하고 마지막 단계에서 전 단계로 상태를 되돌릴 수 있다.
kubectl rollout undo deployment rollout-nginx
만약 바로 전 상태가 아니라 특정 시점으로 되돌리고 싶을 때는 --to-revision 옵션을 사용하면 된다.
kubectl rollout undo deployment rollout-nginx --to-revision=1
출처 : 조훈,심근우,문성주, 『컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커』, 길벗(2022), p125-p146
'STUDY > Docker' 카테고리의 다른 글
쿠버네티스/도커 - Helm(헬름) (0) 2023.06.12 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 Part 3.4 (0) 2023.06.08 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 3.2.1 (0) 2023.05.09 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 3.1 (0) 2023.04.25 Dockerfile (0) 2023.02.22