概要

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.Namespacestate.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)。

参考リンク