確認したいこと
WorkerNode上で動作するkubeletプロセスが停止した場合にNodeとしてどのように見えるのか。
尚、以下のようにMasterNodeとなっているNode上でkubeletを停止させることで事象を確認する。
# kubectl get node NAME STATUS ROLES AGE VERSION test Ready control-plane,master ... v1.23.2
環境情報
# kubelet --version Kubernetes v1.23.2
確認結果
kubeletを手動で停止させると
# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: inactive (dead) since ... ...
Node上ではNotReadyとなり、Podが新しくスケジューリングされない状態となる。
# kubectl get node NAME STATUS ROLES AGE VERSION test NotReady control-plane,master ... v1.23.2
ただし、既存で動いているPodは動作し続ける。
以下、補足です。
補足
kubeletが落ちたNodeを見に行くと分かりますが
# kubectl describe node ... Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- NetworkUnavailable False ... CalicoIsUp Calico is running on this node MemoryPressure Unknown ... NodeStatusUnknown Kubelet stopped posting node status. DiskPressure Unknown ... NodeStatusUnknown Kubelet stopped posting node status. PIDPressure Unknown ... NodeStatusUnknown Kubelet stopped posting node status. Ready Unknown ... NodeStatusUnknown Kubelet stopped posting node status. ...
kubeletが落ちたことで「NodeStatusUnknown」となり、Nodeにコンテナがスケジューリングされない形となります。
この状態でkubeletを上げるとNodeのイベントに以下のように情報が記載されて
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Starting 2s kubelet Starting kubelet. Normal NodeHasSufficientMemory 2s (x2 over 2s) kubelet Node test status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 2s (x2 over 2s) kubelet Node test status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 2s (x2 over 2s) kubelet Node test status is now: NodeHasSufficientPID Normal NodeNotReady 2s kubelet Node test status is now: NodeNotReady Normal NodeAllocatableEnforced 1s kubelet Updated Node Allocatable limit across pods
Nodeは復旧状態になりました。
ちなみに今回はkubeletを直接落としましたがAPI Serverとの通信に失敗すると
kubelet.service[6104]: .. kubelet_node_status.go:460] \"Error updating node status, will retry\" err=\"error getting node \\\"X.X.X.X\\\": Get \\\"https://.../api/v1/nodes/X.X.X.X?timeout=10s\\\": context deadline exceeded - error from a previous attempt: EOF\"...
同じようにNodeはNotReady扱いになります。
以上です。