쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되어있다. 특히 파드의 자동 복구 기술을 셀프 힐링이라고 하는데, 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 한다.
쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록 보장하는 기능이있다.
위 pod 중에서 echo-hname중 하나랑 nginx-pod를 지워본다
kubectl delete pod nginx-pod
kubectl delete pod echo-hname-7894b67f-45tkv
이렇게 된 이유는 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 -> 사용자가 임의로 열을 구성할 때 사용
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 명령을 사용하면 해당 노드를 파드가 없는 상태로 만든다. 그렇지만 이 명령을 그대로 사용하면 해당 노드의 데몬셋을 지울 수 없어 명령을 수행 할 수 없다.
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