概要
LWKD(Week Ending December 14, 2025)で紹介された、Kubelet の podcertificatemanager における nil ポインタ panic を防ぐ修正です。PodCertificateRequest(PCR)が発行前に削除されたケースで、エラーメッセージ生成中に nil を参照して panic していたのを回避します(PR #135635、2025-12-09 マージ)。
変更内容(何が変わったか)
handleProjectionの「PCRが削除されたようだ」と判断する分岐で、(nil になり得る)pcr.ObjectMetaを参照せず、projectionKey.Namespaceとstate.pcrNameからnamespace/nameを組み立ててエラー化するよう変更しました。- 回帰テスト
TestPCRDeletedWhileWaitingを追加し、待機中に PCR を削除してassumeDeletedThreshold(10分)を超えた後に再処理しても、panic ではなくエラーが返ることを検証しています。
背景(なぜこの変更が必要か)
IssuingManagerは、Pod のProjectedVolumeSource内にあるPodCertificateProjectionごとに workqueue を回し、PCR を informer/lister で監視して証明書バンドルを提供する構造です。- PR説明によると、Kubelet が作成した PCR が「発行される前に削除」されると、削除を示す状態に遷移したタイミングで nil オブジェクトから
ObjectMetaを参照して panic していました。 - 発火しやすい状況として PR説明では「signer がクラスタに実装されていない(開発中/未導入など)状態で Pod が証明書を要求し、後で PCR がクリーンアップされる」ケースを挙げています(クリーンアップ機構の詳細は本PR内では未確認)。
影響(運用者/利用者/開発者への影響、注意点、移行)
- 運用者: ノード上の
kubeletの panic は運用影響が大きいため、PodCertificate を使う環境では安定性向上につながります(削除レース/清掃のタイミングで落ちなくなる)。 - 利用者: 証明書が取得できないエッジケースでも「kubelet が落ちる」より「エラーとして扱える」方向になります。
- 開発者: signer 実装・検証中などで PCR が発行されない/消える状況でも、panic ではなく(対象
namespace/nameを含む)エラーとして扱えるようになり、テストで回帰も検出しやすくなります。
用語メモ(用語の軽い説明)
kubelet: 各ノードで Pod を実行・管理する Kubernetes コンポーネント。PodCertificateRequest(PCR): Kubelet が作成し、証明書発行のために利用するリソース(certificates/v1beta1)。PodCertificateProjection: Pod のprojectedボリュームに含まれるPodCertificate投影ソース。informer/lister: API オブジェクトのキャッシュとイベント駆動更新を提供する client-go の仕組み。signer: 証明書発行者を識別する名前(例:foo.com/signer)。
参考リンク
- https://lwkd.info/2025/20251218
- https://github.com/kubernetes/kubernetes/pull/135635
- https://github.com/kubernetes/kubernetes/blob/8d4237fde8ab58e1bdfecbae52146336cbde259d/pkg/kubelet/podcertificate/podcertificatemanager.go
- https://github.com/kubernetes/kubernetes/blob/8d4237fde8ab58e1bdfecbae52146336cbde259d/pkg/kubelet/podcertificate/podcertificatemanager_test.go