Problem
서버 셧다운, 리부팅시 실제 해당 서버에 떠있는 파드로 통신은 할 수 없지만 kubectl 명령어로 확인했을때 running 상태인걸 확인 할 수 있다.
리부팅되어 서버가 정상화 되어도 pod가 다른 node가 아닌 기존 node에 할당 되어 있는것을 확인할 수 있다.
Cause
pod, node의 헬스체크 주기가 길어 실제 node에 문제가 생겼지만 다음 헬스체크까지 이상을 감지 못하는 상황
Solution
kube-apiserver.yaml, kube-controller-manager.yaml 에서 아래 옵션을 변경하여 not ready 상태의 노드 체크 주기를 줄인다
api-server
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
- --default-not-ready-toleration-seconds=30 // default 300
- --default-unreachable-toleration-seconds=30 // default 300
- --v=6
- -default-not-ready-toleration-seconds int Default: 300
Indicates the tolerationSeconds of the toleration for notReady:NoExecute that is added by default to every pod that does not already have such a toleration.
아직 해당 톨러레이션이 없는 모든 파드에 기본적으로 추가되는 notReady:NoExecute에 대한 톨러레이션초를 나타냅니다.
- -default-unreachable-toleration-seconds int Default: 300
Indicates the tolerationSeconds of the toleration for unreachable:NoExecute that is added by default to every pod that does not already have such a toleration.
아직 해당 톨러레이션이 없는 모든 파드에 기본적으로 추가되는 unreachable:NoExecute에 대한 톨러레이션 초를 나타냅니다.
- -v, --v int
number for the log level verbosity
controller-manager
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/
- --node-monitor-grace-period=30s // Default: 40s
- --node-monitor-period=10s // Default: 5s
- --v=6
- -node-monitor-grace-period duration Default: 40s
Amount of time which we allow running Node to be unresponsive before marking it unhealthy. Must be N times more than kubelet's nodeStatusUpdateFrequency, where N means number of retries allowed for kubelet to post node status.
노드를 unhealthy 상태로 표시하기 전에 실행 중인 노드가 응답하지 않도록 허용하는 시간입니다. kubelet의 nodeStatusUpdateFrequency보다 N배 더 커야 하며, 여기서 N은 kubelet이 노드 상태를 게시하는 데 허용되는 재시도 횟수를 의미합니다.
- -node-monitor-period duration Default: 5s
The period for syncing NodeStatus in NodeController.
노드 컨트롤러에서 노드 상태를 동기화하는 기간입니다.
Kubernetes Tip: How To Make Kubernetes React Faster When Nodes Fail?