😠
KarpenterでDaemonSet Podを最後に落とす
問題となっている事象
karpenterのノードが終了する際、少し長く生き残るワークロードがいる時にfluentdなどのDaemonSet PodがワークロードPodの終了を待たずにevictが叩かれてしまう。
例えば、fluentdがワークロードPodより早く落ちてしまうとログの欠損が起きる。
この記事と同じ感じ。
ノードシャットダウン時のevictionの仕組み
まず、nodeをreconcileしてdeletionTimestampがついていたら終了処理が開始される。
evict対象のPodをフィルタなど色々やった後に、evictするためにPodをグルーピングしている。
ここで重要なのが、criticalNonDaemon, criticalDaemon, nonCriticalNonDaemon, nonCriticalDaemon
という4つのグループ。
system-cluster-critical
もしくはsystem-node-critical
が付いたPodはcriticalに分類され、さらにDaemonSetか否かでグルーピングされている。
eviction order
order的にはnonCriticalNonDaemon
が最初。つまり、ワークロードPodを最初にevictしている。
原因
上のコードはevictionの順番は合っている。
しかし、グループごとにevictすることだけに責任を持っていて終了を待っていない。
解決されたバージョン
karpenterコミュニティはこの問題を認識している。
修正PR
そしてバージョン1.1
でリリースされました🎉
余談
karpenterのコミュニティはあるものの、リリースロードマップがない。
slackで聞いてみても回答なかった。
Discussion