【解決編】EKS Cluster Autoscalerとログ保存用Daemonsetの組み合わせでスケールイン時にログが失われる問題

shepherdmaster.hateblo.jp の続き&解決編です。

add DaemonSet eviction option for empty nodes by yaroslava-serdiuk · Pull Request #3824 · kubernetes/autoscaler · GitHub がリリースされたので、--daemonset-eviction-for-empty-nodes=trueオプションをつけることで、アプリケーションpodのpreStop内のsleep時間を短くし、代わりにfluentd podのsleep時間を長くすることで、ログが正常に保存されることが可能になりました。

つまり流れを以下にできる。

  1. NodeのScale inが開始される
  2. アプリケーションpod と fluentd pod のターミネート処理が始まる
  3. fluentd podのpreStop内で長いsleepを実行
  4. 先にアプリケーションpodのターミネート処理が終わる
  5. fluentd podがログを保存する処理(flush)を実行(プロセスID 1にSIGTERMを送るとかで)
  6. fluentd podのターミネート処理が終わる アプリケーションPodとfluentd Podが終了したのでNodeインスタンスの終了処理が実行される

図にするとこんな感じ

f:id:shepherdMaster:20220223163245p:plain

以前と比べるとだいぶ自然な流れにできましたね。