ノードがNot-Ready状態
背景
Corporation XYZのDevOpsチームは新しいノードグループをデプロイし、アプリケーションチームはretail-app以外の新しいアプリケーションをデプロイしました。これにはデプロイメント(prod-app)とそれをサポートするDaemonSet(prod-ds)が含まれています。
これらのアプリケーションをデプロイした後、監視チームはノードがNotReady状態に移行していることを報告しています。根本的な原因はすぐには明らかではなく、DevOpsのオンコールエンジニアとして、ノードが応答しなくなっている理由を調査し、正常な動作を回復するための解決策を実装する必要があります。
ステップ1: ノードの状態を確認する
まず、ノードの状態を確認して、現在の状態を確認しましょう:
~$kubectl get nodes --selector=eks.amazonaws.com/nodegroup=new_nodegroup_3
NAME STATUS ROLES AGE VERSION
ip-10-42-180-244.us-west-2.compute.internal NotReady <none> 15m v1.27.1-eks-2f008fe
ステップ2: ノード名をエクスポートする
~$NODE_NAME=$(kubectl get nodes --selector=eks.amazonaws.com/nodegroup=new_nodegroup_3 --no-headers | awk '{print $1}' | head -1)
ステップ3: システムPodの状態をチェックする
影響を受けているノード上のkube-system podsの状態を調べて、システムレベルの問題を特定しましょう:
~$kubectl get pods -n kube-system -o wide --field-selector spec.nodeName=$NODE_NAME
このコマンドは、影響を受けたノード上で実行されているすべてのkube-system podsを表示し、それらによって引き起こされる可能性のあるノードの問題を特定するのに役立ちます。すべてのpodがrunning状態であることに注意してください。
ステップ4: ノードの状態を調べる
NotReady状態の原因を理解するために、ノードのdescribe出力を調べてみましょう。
~$kubectl describe node $NODE_NAME | sed -n '/^Taints:/,/^[A-Z]/p;/^Conditions:/,/^[A-Z]/p;/^Events:/,$p'
Taints: node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule
Unschedulable: false
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure Unknown Wed, 12 Feb 2025 15:20:21 +0000 Wed, 12 Feb 2025 15:21:04 +0000 NodeStatusUnknown Kubelet stopped posting node status.
DiskPressure Unknown Wed, 12 Feb 2025 15:20:21 +0000 Wed, 12 Feb 2025 15:21:04 +0000 NodeStatusUnknown Kubelet stopped posting node status.
PIDPressure Unknown Wed, 12 Feb 2025 15:20:21 +0000 Wed, 12 Feb 2025 15:21:04 +0000 NodeStatusUnknown Kubelet stopped posting node status.
Ready Unknown Wed, 12 Feb 2025 15:20:21 +0000 Wed, 12 Feb 2025 15:21:04 +0000 NodeStatusUnknown Kubelet stopped posting node status.
Addresses:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Starting 3m18s kube-proxy
Normal Starting 3m31s kubelet Starting kubelet.
Warning InvalidDiskCapacity 3m31s kubelet invalid capacity 0 on image filesystem
Normal NodeHasSufficientMemory 3m31s (x2 over 3m31s) kubelet Node ip-10-42-180-244.us-west-2.compute.internal status is now: NodeHasSufficientMemory
Normal NodeHasNoDiskPressure 3m31s (x2 over 3m31s) kubelet Node ip-10-42-180-244.us-west-2.compute.internal status is now: NodeHasNoDiskPressure
Normal NodeHasSufficientPID 3m31s (x2 over 3m31s) kubelet Node ip-10-42-180-244.us-west-2.compute.internal status is now: NodeHasSufficientPID
Normal NodeAllocatableEnforced 3m31s kubelet Updated Node Allocatable limit across pods
Normal RegisteredNode 3m27s node-controller Node ip-10-42-180-244.us-west-2.compute.internal event: Registered Node ip-10-42-180-244.us-west-2.compute.internal in Controller
Normal Synced 3m27s cloud-node-controller Node synced successfully
Normal ControllerVersionNotice 3m12s vpc-resource-controller The node is managed by VPC resource controller version v1.6.3
Normal NodeReady 3m10s kubelet Node ip-10-42-180-244.us-west-2.compute.internal status is now: NodeReady
Normal NodeTrunkInitiated 3m8s vpc-resource-controller The node has trunk interface initialized successfully
Warning SystemOOM 94s kubelet System OOM encountered, victim process: python, pid: 4763
Normal NodeNotReady 52s node-controller Node ip-10-42-180-244.us-west-2.compute.internal status is now: NodeNotReady
ここでは、ノードのkubeletがUnknown状態にあり、到達できないことがわかります。このステータスについては、Kubernetesドキュメントで詳細を確認できます。
ノードステータス情報
ノードには次のtaintsがあります:
- node.kubernetes.io/unreachable:NoExecute: このtaintを許容しないポッドは退避されることを示します
- node.kubernetes.io/unreachable:NoSchedule: 新しいポッドがスケジュールされるのを防ぎます
ノードの状態は、kubeletがステータスの更新を停止したことを示しています。これは通常、深刻なリソース制約やシステムの不安定さを示しています。