(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】kubeletを停止したNodeは自動的にNotReadyとなる

スポンサーリンク

確認したいこと

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扱いになります。

以上です。