쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되어있다. 특히 파드의 자동 복구 기술을 셀프 힐링이라고 하는데, 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 한다.
터미널에서 1초마다 nginx 웹 페이지를 받아오는 스크립트를 통해, 자동으로 다시 복구되는지 확인쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록 보장하는 기능이있다.
위 pod 중에서 echo-hname중 하나랑 nginx-pod를 지워본다
kubectl delete pod nginx-pod
kubectl delete pod echo-hname-7894b67f-45tkv
확인 결과 nginx pod는 삭제 되었지만 echo-hname pod는 여전히 6개가 있다. AGE를 확인해보면 삭제되가 다시 생성된 것을 볼 수 있다.
이렇게 된 이유는 nginx-pod는 디플로이먼트에 속한 파드가 아니며 어떤 컨트롤러도 이 파드를 관리하지 않는다. 따라서 nginx-pod는 삭제되어도 다시 생성되지않는다.
하지만 echo-hname은 디폴로이먼트에 속한 파드로 replicas를 6으로 선언했다. replicas는 파드를 선언한 수대로 유지하도록 파드의 수를 항상 확인하고 부족하면 새로운 파드를 만들어낸다. 따라서 임의로 파드를 삭제하면 자동으로 파드를 삭제한 수 만큼 생성하게 된다.
디플로이먼트에 속한 파드는 상위 디플로이먼트를 삭제해야 파드가 삭제된다.
kubectl delete deployment echo-hname
노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 한다.
최근 몇 차례 문제가 생긴 노드에 파드를 할당하면 문제가 생길 가능성이 높다. 어쩔 수 없이 해당 노드를 사용해야 한다면 영향도가 적은 파드를 할당해 일정 기간 사용하면서 모니터링 해야한다. 즉 노드에 문제가 생기더라도 파드의 문제를 최소화해야한다. 하지만 쿠버네티스는 모든 노드에 균등하게 파드를 할당하려고 한다. 그렇기 때문에 문제가 생길 가능성이 있는 노드라는 것을 쿠버네티스에게 알려주어야 한다. 쿠버네티스는 이런 경우에 cordon 기능을 사용한다.
kubectl scale deployment echo-hname --replicas=9
kubectl get pods \
> -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
-o=custom-columns -> 사용자가 임의로 열을 구성할 때 사용
확인해보면 3개의 노드에 9개 pod가 3개씩 균등하게 분배된것을 확인 할 수 있다.kubectl scale deployment echo-hname --replicas=3
kubectl get pods \
> -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
각 노드에 pod가 한 개씩 남아있는 것을 확인할 수 있다.
kubectl cordon w3-k8s
w3 노드를 제외하고 w1, w2 노드에 각각 pod가 4개씩 생성된 것을 볼 수 있다.
이렇게 cordon 기능으로 해당 노드에는 pod가 스케줄되지 않게(생성 되지 않게) 설정해 봤다.
쿠버네티스를 사용하다 보면 정기 또는 비정기적인 유지보수를 위해 노드를 꺼야 하는 상황이 발생한다. 이런 경우를 대비해 쿠버네티스는 drain 기능을 제공한다. drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수 할 수 있게 한다.
drain 명령을 사용하면 해당 노드를 파드가 없는 상태로 만든다. 그렇지만 이 명령을 그대로 사용하면 해당 노드의 데몬셋을 지울 수 없어 명령을 수행 할 수 없다.
drain은 실제 pod를 옮기는 것이 아닌 노드에서 파드를 삭제하고 다른 곳에 다시 생성하는 것이다. 파드는 언제라도 삭제할 수 있기 때문에 쿠버네티스에서 대부분 이동은 파드를 지우고 다시 만드는 과정을 의미한다. 그런데 DaemonSet은 각 노드에 1개만 존재하는 파드라서 drain으로는 삭제할 수 없다.kubectl drain w3-k8s --ignore-daemonsets
kubectl get pods -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
실행 결과 w3 노드에 pod가 사라지고 대신 w1 노드에 파드가 새로 생성된것을 볼 수 있다.
kubectl get nodes
cordon 명령과 마찬가지로 SchedulingDisabled 상태가 된것을 볼 수 있다.
kubectl uncordon w3-k8s