コードを追いながら「おそらくこういう処理だろう」という感じがわかったのでメモを残す。
正しいかどうかわからないので是非コメントいただければと思います。
ざっくりとした流れ
Node が削除されるときの流れは以下ドキュメントに記載があります。
1. Add the karpenter.sh/disruption=disrupting:NoSchedule taint to the node to prevent pods from scheduling to it. 2. Begin evicting the pods on the node with the Kubernetes Eviction API to respect PDBs, while ignoring all static pods, pods tolerating the karpenter.sh/disruption=disrupting:NoSchedule taint, and succeeded/failed pods. Wait for the node to be fully drained before proceeding to Step (3). - While waiting, if the underlying NodeClaim for the node no longer exists, remove the finalizer to allow the APIServer to delete the node, completing termination. 3. Terminate the NodeClaim in the Cloud Provider. 4. Remove the finalizer from the node to allow the APIServer to delete the node, completing termination.
翻訳
1. Pod がスケジューリングされないようにするため、ノードに karpenter.sh/disruption=disrupting:NoSchedule の taint を追加します。 2. Kubernetes Eviction API を使用してノード上の Pod の退避を開始し、PDB を尊重します。この際、すべての静的 Pod、karpenter.sh/disruption=disrupting:NoSchedule の taint を許容する Pod、および成功/失敗した Pod は無視します。ステップ(3)に進む前に、ノードが完全に drain されるのを待ちます。 3. 待機中に、ノードの基となる NodeClaim が存在しなくなった場合、API Server がノードを削除できるように finalizer を削除し、終了を完了します。 4. クラウドプロバイダーで NodeClaim を終了します。 5. AP IServer がノードを削除できるようにノードから finalizer を削除し、終了を完了します。
API Server 側
ユーザーまたはコントローラーがオブジェクトの削除をリクエストすると、API Server がそのリクエストを受け取ってオブジェクトの削除処理を始めます。
API Server は、Delete 処理内の BeforeDelete 処理で、オブジェクトのメタデータに deletionTimestamp
フィールドを追加します。
Karpenter 側
Node リソースの Reconcile で deletionTimestamp
フィールドが追加されたことを検知し、finalize 処理が始まります。
NodeClaim 側の finalize 処理はこちら
finalize 処理の中で、冒頭記載した処理を実行していきます。
リソースが削除可能になったら finalizer が削除され、API Server がリソースを削除します。
ちなみに、finalizer で指定される "karpenter.sh/termination" はここに定義され、
指定の finalizer が設定されているかの判定で使われている。