【解決編】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時間を長くすることで、ログが正常に保存されることが可能になりました。
つまり流れを以下にできる。
- NodeのScale inが開始される
- アプリケーションpod と fluentd pod のターミネート処理が始まる
- fluentd podのpreStop内で長いsleepを実行
- 先にアプリケーションpodのターミネート処理が終わる
- fluentd podがログを保存する処理(flush)を実行(プロセスID 1にSIGTERMを送るとかで)
- fluentd podのターミネート処理が終わる アプリケーションPodとfluentd Podが終了したのでNodeインスタンスの終了処理が実行される
図にするとこんな感じ
以前と比べるとだいぶ自然な流れにできましたね。