KEP-4781: kubelet再起動時のPodステータス保持

概要

kubeletが再起動した際に、PodのStartedおよびReadyステータスをFalseにリセットしないようにするための改善提案です。これにより、kubelet再起動中の不要なサービス中断を防ぎます。

背景

現在の問題: kubelet(Kubernetesの各ノードで動作するエージェント)が何らかの理由で再起動すると、現在は以前のProbe(ヘルスチェック)の結果が失われてしまいます。その結果、実際には正常に動作しているPodであっても、すべてのPodが「Not Ready」状態にリセットされます。

これが引き起こす問題:

  • サービスが実際には問題ないのに、一時的に「利用不可」と誤判定される
  • 不要なアラートが発火される
  • ロードバランサーが正常なPodへのトラフィックを一時的に止める
  • 過去の議論: #100277#102367

詳細

このKEPが提案する解決策は、kubelet再起動時にPodのReady/Startedステータスを一方的にFalseにリセットするのではなく、既存のステータスを維持することです。

設計の重要なポイント:

  • kubelet再起動後、前回のProbe結果が記録されていれば、それを保持する
  • ただし、kubeletが nodeMonitorGracePeriod を超えてリース更新に失敗するほど長い時間再起動に要した場合は、Readyをfalseのままにする(ノードが本当に問題を抱えている可能性があるため)
  • 基本的なReadinessプローブの動作ロジックは変更しない

現在の状態:

  • Alphaステージ
  • フィーチャーゲート: ChangeContainerStatusOnKubeletRestart(デフォルト無効)
  • アクティブなリリースにはまだスケジュールされていない

使用例

このフィーチャーゲートを有効にすると、kubeletのメンテナンス(アップデートや設定変更による再起動)時でも、正常に動作しているPodがReadyステータスを維持できるようになります。Probe結果が十分に早く確認できれば、サービスのダウンタイムをゼロにすることも可能です。

# kubelet設定でフィーチャーゲートを有効にする例
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
  ChangeContainerStatusOnKubeletRestart: true

参考リンク