Chuyển đến nội dung chính

レッスン10: ノードトラブルシューティング

NotReadyノードのデバッグ: kubelet、コンテナランタイム、証明書。ノード条件、 リソースプレッシャー、ディスクプレッシャー。体系的トラブルシューティング手法。

ノードトラブルシューティングの判断フロー — NotReadyデバッグワークフロー

1. ノード条件

kubectl describe node node1 | grep -A20 Conditions

正常状態:
  Type              Status  
  ----              ------  
  MemoryPressure    False   ← 正常(True = メモリ不足)
  DiskPressure      False   ← 正常(True = ディスク不足)
  PIDPressure       False   ← 正常(True = プロセス過多)
  Ready             True    ← ノードは正常

異常状態:
  Ready             False   → kubeletが動作していない
  Ready             Unknown → ノードに到達できない(ネットワーク問題)

2. NotReadyノードのトラブルシューティング

体系的なアプローチ — 順番に実行:

1. ノード状態の確認
   kubectl get nodes
   kubectl describe node NODE_NAME | tail -40

2. ノードにSSH
   ssh node1

3. kubeletサービスの確認
   systemctl status kubelet
   journalctl -u kubelet -n 50 --no-pager

4. コンテナランタイムの確認
   systemctl status containerd
   crictl ps           # 実行中のコンテナ一覧
   crictl pods         # Podサンドボックス一覧

5. 証明書の確認(クラスタ経過時間による一般的な問題)
   ls /var/lib/kubelet/pki/
   openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -dates

6. 必要に応じてサービスを再起動
   systemctl restart kubelet
   systemctl restart containerd

試験のポイント:NotReadyデバッグ手順:kubectl describe node → SSH → systemctl status kubelet → journalctl -u kubelet。最も一般的な問題:kubelet停止、APIサーバーアドレスの誤り、証明書の期限切れ。

3. 一般的なノード問題

症状原因対処法
Node NotReadykubeletクラッシュsystemctl restart kubelet
Node Unknownネットワーク分断ノードネットワーク、ファイアウォールを確認
MemoryPressure: Trueメモリ不足Podの退避、ノードのスケール
DiskPressure: Trueディスク満杯/var/log、/tmp、未使用イメージのクリーンアップ
Pods stuck Terminatingノード到達不可kubectl delete pod --force --grace-period=0

4. kubelet設定

# kubelet設定ファイルの場所
/var/lib/kubelet/config.yaml     # メイン設定
/etc/kubernetes/kubelet.conf     # kubeconfig(kubeletのAPIサーバー接続方法)
/var/lib/kubelet/kubeconfig      # 代替パス

# 一般的なkubelet設定問題:
# APIサーバーアドレスの誤り
cat /etc/kubernetes/kubelet.conf | grep server

# クラスタDNSの誤り
cat /var/lib/kubelet/config.yaml | grep clusterDNS

# kubeletの証明書確認
cat /var/lib/kubelet/config.yaml | grep client-certificate

5. ノードイメージ & ディスククリーンアップ

# ディスク使用量の確認
df -h
du -sh /var/log/*
du -sh /var/lib/containerd

# 未使用コンテナイメージの削除
crictl rmi --prune

# 古いログの削除
find /var/log/pods -mtime +7 -delete

# PIDプレッシャーの確認
ps aux | wc -l

6. チートシート

タスクコマンド
ノード健全性サマリーkubectl describe node NAME
kubelet状態systemctl status kubelet
kubeletログjournalctl -u kubelet -n 100
ノード上の実行コンテナcrictl ps
スタックしたPodの強制削除kubectl delete pod NAME --force --grace-period=0

7. 練習問題

Q1:ノードが「Ready: Unknown」ステータスを表示しています。最も可能性の高い原因は?

  • A) ノード上のkubeletプロセスがクラッシュした
  • B) コントロールプレーンからノードに到達できない(ネットワーク問題) ✓
  • C) ノード上の全PodがOOM-killされた
  • D) ノードのCPUリソースが不足している

解説:Ready: UnknownはAPIサーバーがkubeletからのハートビートを最近受信していないことを意味します。通常、ノードが到達不能(ネットワーク分断、ノードの電源OFF)であることを示します。Ready: Falseはkubeletに到達可能だが問題を報告している状態です。

Q2:NotReadyノードにSSH後、「systemctl status kubelet」で「Active: failed」と表示されます。次に確認すべきは?

  • A) kubectl get pods -n kube-system
  • B) journalctl -u kubelet -n 50 でエラーログを確認 ✓
  • C) ノードを削除して再作成
  • D) ノードでkubeadm resetを実行

解説:kubeletが失敗した場合、journalctlは詳細なエラーを表示します:証明書問題、APIサーバーURLの誤り、/var/lib/kubelet/config.yamlの不在など。kubeletのダウンを確認した後の最初の診断ステップは常にこれです。

Q3:ノードがDiskPressure: Trueを報告しています。ワークロードへの即座の影響は?

  • A) 全Podが即座に削除される
  • B) ノードがスケジュール不可になり、BestEffort/BurstableのPodが退避される ✓
  • C) 新しいPodのスケジューリングのみが阻止される
  • D) kubeletサービスが停止する

解説:ディスクプレッシャー下ではKubernetesがPod退避をトリガーします。BestEffort(リクエスト/リミットなし)から開始し、次にBurstable。GuaranteedのPodは最後に退避されます。ノードには新しいスケジューリングを防ぐTaintも付与されます。