😠

KarpenterでDaemonSet Podを最後に落とす

2024/12/20に公開

問題となっている事象

karpenterのノードが終了する際、少し長く生き残るワークロードがいる時にfluentdなどのDaemonSet PodがワークロードPodの終了を待たずにevictが叩かれてしまう。
例えば、fluentdがワークロードPodより早く落ちてしまうとログの欠損が起きる。
この記事と同じ感じ。
https://tech-blog.monotaro.com/entry/2024/09/25/090000

ノードシャットダウン時のevictionの仕組み

まず、nodeをreconcileしてdeletionTimestampがついていたら終了処理が開始される。
https://github.com/kubernetes-sigs/karpenter/blob/ced4d37eda825959758bb4933b808ef65a79898f/pkg/controllers/node/termination/controller.go#L77-L84

evict対象のPodをフィルタなど色々やった後に、evictするためにPodをグルーピングしている。
https://github.com/kubernetes-sigs/karpenter/blob/ced4d37eda825959758bb4933b808ef65a79898f/pkg/controllers/node/termination/terminator/terminator.go#L112
https://github.com/kubernetes-sigs/karpenter/blob/ced4d37eda825959758bb4933b808ef65a79898f/pkg/controllers/node/termination/terminator/terminator.go#L123-L140

ここで重要なのが、criticalNonDaemon, criticalDaemon, nonCriticalNonDaemon, nonCriticalDaemonという4つのグループ。

system-cluster-criticalもしくはsystem-node-criticalが付いたPodはcriticalに分類され、さらにDaemonSetか否かでグルーピングされている。

eviction order

order的にはnonCriticalNonDaemonが最初。つまり、ワークロードPodを最初にevictしている。
https://github.com/kubernetes-sigs/karpenter/blob/ced4d37eda825959758bb4933b808ef65a79898f/pkg/controllers/node/termination/terminator/terminator.go#L144-L149

原因

上のコードはevictionの順番は合っている。
しかし、グループごとにevictすることだけに責任を持っていて終了を待っていない。

解決されたバージョン

karpenterコミュニティはこの問題を認識している。
https://github.com/kubernetes-sigs/karpenter/issues/1133
https://github.com/aws/karpenter-provider-aws/issues/5858

修正PR
https://github.com/kubernetes-sigs/karpenter/pull/1478

そしてバージョン1.1でリリースされました🎉

余談

karpenterのコミュニティはあるものの、リリースロードマップがない。
slackで聞いてみても回答なかった。
https://kubernetes.slack.com/archives/C04JW2J5J5P/p1730865060370479

Discussion