EKSでFluentBitを使ってログ転送をしています。
別環境からEKSへの移設期間で双方のログを比較していたところ、EKS環境でログ欠損がかなり起きていることが分かり、対策でやったことを書いていきます。
対策
ログを確認する
FluentBitのログを見てみると以下の2つのログが出ていました。
Kinesisのログはretryされるので問題ないはずですが、mem buf overlimitはアウトです。
[ warn] [input] tail.0 paused (mem buf overlimit) level=warning msg="[kinesis 0] 34/500 records failed to be delivered. Will retry.\n"
podのmemory request/limitを上げる
mem buf overlimitが出ていたのでmemory sizeを増やしましょう。
今回はここは足りていましたが一応記載します。
resources: limits: memory: 750Mi requests: memory: 500Mi
Mem_Buf_Limitを上げる
podのmemoryは十分確保されていましたが、FluentBitのconfigでtail inputプラグインでMem_Buf_Limitが非常に低い値になっていました。 ここも余裕のある値にしておきます。
Tail - Fluent Bit: Official Manual
Mem_Buf_Limit 500MB
メモリ監視を入れる
これでも十分な値かは判断出来ないので、Datadog等でメモリ使用量を監視しましょう。
上限に引っかかるようであれば適宜増強します。
カスタムメトリクスを収集する
FluentBitはprometheusエンドポイントを作成出来ます。
Monitoring - Fluent Bit: Official Manual
Datadog等でメトリクスを収集するようにしましょう。
今回は収集しても怪しいデータは取れませんでした。
template: metadata: labels: name: fluentbit annotations: ad.datadoghq.com/aws-for-fluent-bit.check_names: | ["prometheus"] ad.datadoghq.com/aws-for-fluent-bit.init_configs: | [{}] ad.datadoghq.com/aws-for-fluent-bit.instances: | [ { "prometheus_url": "http://%%host%%:2020/api/v1/metrics/prometheus", "namespace": "fluentbit", "metrics": [ "fluentbit_input_records_total", "fluentbit_input_bytes_total", "fluentbit_output_proc_records_total", "fluentbit_output_proc_bytes_total", "fluentbit_output_errors_total", "fluentbit_output_retries_total", "fluentbit_output_retries_failed_total" ], "tags": [ "service_code:fluent-bit", "component:fluent-bit", "role:flunt-bit", "service_group:daemonset" ] } ]
Buffer_Chunk_SizeとBuffer_Max_Sizeを増やす
This value is used to increase buffer size.
ということなので増やすべきでしょう。これに関する不審なログは出ていませんでしたが1MBまで増やしました。
Buffer_Chunk_Size 1MB Buffer_Max_Size 1MB
Tail - Fluent Bit: Official Manual
どうしても欠損してしまうときは?
色々やっても欠損してしまう場合は諦めましょう! ログで送るのではなくDBに直接書き込むようにすべきです。