Slide 1

Slide 1 text

Kubernetesログのメタデータ追加処理 について調べてみた Kubernetes Meetup Tokyo #36(2020/11/30) @bells17

Slide 2

Slide 2 text

▶ @bells17 ▶ Software Engineer ▶ IDC Frontier inc. ▶ 普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発の調査・研究 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_

Slide 3

Slide 3 text

ElasticSearchなどに送ったときの Kubernetesのログをみたことがありますか?

Slide 4

Slide 4 text

なんかこんな感じでログ本体以外にもk8sのラベルとか⾊々ついてる

Slide 5

Slide 5 text

⼀⽅でdockerのコンテナログは

Slide 6

Slide 6 text

/var/lib/docker/containers/*/*.log の中⾝はこれしか無い

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

調べてみた

Slide 9

Slide 9 text

fabric8io/fluent-plugin-kubernetes_metadata_filter というのがあるのに気づいた どうやらこいつがKubernetetesのメタデータをいい感じにつけてくれるっぽいというところまでわかった

Slide 10

Slide 10 text

これはどうやらfluentdのfilterプラグインというやつらしい

Slide 11

Slide 11 text

Filter plugin? なんか受け取ったログデータをいい感じに加⼯する処理をする種類のプラグイン (という理解) ``` Filter plugins enable Fluentd to modify event streams. Some use cases are: 1. Filtering out events by grepping the value of one or more fields. 2. Enriching events by adding new fields. 3. Deleting or masking certain fields for privacy and compliance. ``` https://docs.fluentd.org/filter より

Slide 12

Slide 12 text

Filter pluginの使⽤例 https://docs.fluentd.org/filter より

Slide 13

Slide 13 text

fabric8io/fluent-plugin-kubernetes_metadata_filter の使⽤例 これは fluent/fluentd-kubernetes-daemonset というfluentdが公式に提供 しているっぽいkubernetesのログをelasticsearchなどに転送する daemonsetで使⽤されているfluentdの設定の⼀部

Slide 14

Slide 14 text

fabric8io/fluent-plugin-kubernetes_metadata_filter の構成

Slide 15

Slide 15 text

▶ プラグイン初期化時(正確にはconfigure呼び出し時)にPodとNamespaceのデータを取得 を⾏い、スレッドセーフなキャッシュストア(LruRedux::ThreadSafeCache)に保存する ▶ その後、PodとNamespaceのwatchを⾏い、これも更新があればキャッシュストアに反 映する ▶ これらをPodとNamespaceでそれぞれ別のスレッドで実⾏する ▶ filter_streamによりプラグインにログデータのイベントストリームが送られた際は、 キャッシュストアに保存しているデータからログデータに対し、各種メタデータの付与 を⾏う fabric8io/fluent-plugin-kubernetes_metadata_filter の構成

Slide 16

Slide 16 text

まとめ

Slide 17

Slide 17 text

感想 ▶ RubyのKubernetesのクライアント使ってる例初めて⾒た ▶ あとRubyでスレッドプログラミングしてる例も初めてみた ▶ どうやってdockerとかのコンテナログから⾊んなメタデータ取ってるの?それだけだと 無理じゃない?って思ってたけど、普通にKubernetesのAPIからデータ取ってるだけ だったよ ▶ 全ノードでPodのwatchしてるってことは思ったより負荷⾼い?

Slide 18

Slide 18 text

参考資料 ▶ https://github.com/fluent/fluentd-kubernetes-daemonset ▶ https://docs.fluentd.org/container-deployment/kubernetes ▶ https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter/tree/v2.5.2 ▶ https://qiita.com/sonots/items/a01d2233210b7b059967 fluentd label ▶ https://qiita.com/repeatedly/items/e882fdb46dfe85d9556f Fluentd id ▶ https://abicky.net/2017/10/23/110103/ fluentd id ▶ https://docs.fluentd.org/parser/none fluentd none parser ▶ https://github.com/fluent/fluentd-kubernetes-daemonset/tree/53267a7ec7bfd6ead4528a84d97739059e890f2d ▶ https://docs.fluentbit.io/stream-processing/overview データの流れ fluent bitの⽅だけどfluentd側で良い図がなかった ▶ https://docs.fluentd.org/storage storage plugin ▶ https://github.com/fluent-plugin-systemd/fluent-plugin-systemd#input-plugin-configuration systemd source plugin ▶ https://docs.fluentd.org/plugin-development/api-plugin-filter filter plugin の書き⽅ ▶ https://docs.fluentd.org/plugin-development fluentd pluginについて ▶ https://docs.fluentd.org/plugin-development/api-plugin-filter#filter_steam-tag-es filter stream ▶ http://rubykaigi.org/2014/presentation/S-NaotoshiSeo/ fluentd実装 ▶ https://docs.fluentd.org/plugin-development/api-plugin-base base plugin すべてのプラグインの基本 今回は config_param ⽤ ▶ https://github.com/fluent/fluentd/blob/v1.11.5/lib/fluent/plugin/base.rb base plugin 実装 ▶ https://github.com/fluent/fluentd/blob/v1.11.5/lib/fluent/plugin/filter.rb filter plugin 実装 ▶ https://github.com/fluent/fluentd/blob/v1.11.5/lib/fluent/configurable.rb ▶ https://github.com/fluent/fluentd/blob/v1.11.5/lib/fluent/system_config.rb ▶ https://github.com/fluent/fluentd/blob/v1.11.5/lib/fluent/event.rb event stream ▶ https://github.com/SamSaffron/lru_redux スレッドセーフなキャッシュストア ▶ https://docs.ruby-lang.org/ja/latest/class/Thread.html ruby のスレッド ▶ https://github.com/abonas/kubeclient Fluentd Kubernetes Metadata Filter Plugin が使ってる kubernetes client

Slide 19

Slide 19 text

Thanks / Question? ▶ @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_