TLDR
- 無料枠の f1-micro には fluentd は大きい
- 軽量なログ収集エージェント fluent-bit
- Kubernetes 対応
- Go でのプラグイン作成可能
- fluent-bit で Stackdriver Logging にログを出力することで大幅なリソース削減
今までのあらすじ
GCP の無料枠だけで GKE クラスタを作ることができたが、一部の Pod が Pending となっっていた。
http://qiita.com/apstndb/items/788f705e71e7660967a6#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9
調べてみると、最大の Pod は Stackdriver Logging への各コンテナのログ収集のために生成されている fluentd-cloud-logging
であり、実測 80 MB を超えるリソースを使用していた。
http://qiita.com/apstndb/items/1c3f8ea026ed6b27e357#%E5%86%85%E8%A8%B3
貧者のログ収集
fluentd-cloud-logging
はクラスタ生成時に --no-enable-cloud-logging
を指定して無効化することができるが、 12factor のログ が扱えないのは非常に不便である。何か代替を考える必要がある。
fluent-bit
そこで今回目をつけたのが C で書かれた軽量なログ収集エージェントの fluent-bit だ。
Kubernetes 対応 もあり、Ruby で動く fluentd よりも省リソースであることが期待できる。
実際の Kubernetes 連携の例を探してみると、 DaemonSet として動作して Elasticsearch に出力する例も公式で fluent/fluent-bit-kubernetes-daemonset として見つかった。
Elasticsearch は JVM で動作して富豪的なリソースを要求するため貧者には手が届かないが、これができるのであればやりたいことは大体できそうだ。
プラグインの書き方を探したところ、 Go でプラグインが書けることがわかった。
https://github.com/fluent/fluent-bit/blob/master/GOLANG_OUTPUT_PLUGIN.md
https://github.com/fluent/fluent-bit-go
Go には Google 公式の Stackdriver Logging のクライアントライブラリがあるため、 Stackdriver Logging に出力する fluent-bit を Kubernetes のログ収集に使うことができるのではないか。
fluent-bit-stackdriver
というわけで検証してみたのが下記リポジトリだ。
apstndb/fluent-bit-stackdriver
まだ他の人が使えるようには整備しておらず、品質も低いが、実際に Kubernetes の各 Pod が出力するログが Stackdriver Logging へと渡ることが確認できている。
まだリソース使用量を見てみると、下記のように 10 MB のオーダーのメモリ使用量となった。
$ kubectl top pod --all-namespaces
NAMESPACE NAME CPU(cores) MEMORY(bytes)
default hostnames-3799501552-99h7f 0m 0Mi
kube-system heapster-v1.2.0.1-1382115970-gjg66 0m 24Mi
kube-system fluent-bit-kgjzl 0m 10Mi
kube-system kubernetes-dashboard-3543765157-s86rn 0m 16Mi
kube-system kube-proxy-gke-sandbox-cluster-default-pool-8b3dece3-ngf9 0m 12Mi
kube-system kube-dns-2185667875-75kdg 0m 16Mi
以前計測した fluentd よりも 70 MB 程度は削減できている。これなら 600 MB しか RAM のない f1-micro インスタンスでのログ収集が現実的なものになってきたのではないか。