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