가끔가다 노드 서버가 죽는 경우가 있다.

이런 경우 죽은 노드에 배포된 deplyoment는 제대로 failover를 수행하여 다른 노드로 재배포 되지만 statefulset은 failover를 수행하지 못한다.

왜 이런걸까 ?

Pod Eviction Timeout 이란

  • ready 컨디션의 상태가 pod-eviction-timeout (kube-controller-manager에 전달된 인수) 보다 더 길게 Unknown 또는 False로 유지되는 경우, 노드 상에 모든 파드는 노드 컨트롤러에 의해 삭제되도록 스케줄 된다.

출처: https://medium.com/tailwinds-navigator/kubernetes-tip-how-statefulsets-behave-differently-than-deployments-when-node-fails-d29e36bca7d5

우선 노드가 죽은 경우 (Not Ready 상태) Pod는 계속 실행되지만 pod를 종료상태로 설정하기 전에 pod eviction timeout에 설정된 시간만큼 기다린다 ( default는 5분 )

그 후 위의 flow대로 흘러 pod가 다시 새로운 노드에 재배포된다.

sts는 cluster application 내에서 master, slave 구조를 가진다.

마스터는 노드가 실제로 죽었는지 아니면 실패가 네트워크 파티션으로 인한 문제인지를 확인할 정보가 부족하다 그렇기 때문에 마스터는 아무 조치도 취하지 않는다.

해결방법

  1. pod Spec에서 terminationGracePeriodSeconds를 0으로 설정하기.
    1. 이렇게 하면 노드가 클러스터에 다시 합류할때 sts pod이 강제로 삭제된다.
    2. 그럼 마스터는 새 복제본을 생성
  2. 노드가 정확하게 죽은거를 감지할 방법을 확인할수 있는 경우 노드를 강제로 삭제한다.
    1. 그럼 다른 노드에 sts가 재배포된다.
  3. 그냥 디플로이먼트 사용

레퍼런스

https://medium.com/tailwinds-navigator/kubernetes-tip-how-statefulsets-behave-differently-than-deployments-when-node-fails-d29e36bca7d5

+ Recent posts