ACS事業部の谷合です。
今回はKubernetesの構造化ログが、どう実装されているのかご紹介します。
Introduce
Kubernetesが使うloggerは、Go言語のloggerであるglogをforkして、klogとして再実装しています。
klogはKubernetesのログを構造化し、key-valueの形式で出力します。
今後もklogを使い続ける予定いるそうです。
github.com
Deep Dive!
klogの出力の紹介
出力は以下のような構造となっています。
<message> <key1>=<value1> <key2>=<value2> <key3>=<value2>
これを実装するとなると以下のようになります。
e.g.
pod := corev1.Pod{Name: "nginx-1", Namespace: "default"...} klog.InfoS("Pod status updated", "pod", klog.KObj(pod), "stratus", "ready")
これは以下のように出力されます。
{ "ts": 123456789.09876, "v": 4, "msg": "Pod status updated", "pod":{ "name": "nginx-1", "Namespace": "default" }, "status": "ready" }
logging設定
klogのフォーマットはtextとjsonがあり、以下設定でtextとjsonの出力を変更することが可能です。
ちなみにtextがデフォルトです。
--logging-format=json
これはkubeletなどシステムコンポーネントの設定に記述できます。 kubernetes.io
パフォーマンス
textに比べて、jsonの方が9%も早く、CPUも2%使用率が低いそうです。
また、jsonの方が、出力サイズもおおむね10倍以上小さいです。
Contextual Logging
以下の関数でcontext.Contextをlogに含めることが可能となります。
- klog.FromContext
- klog.Background
- klog.TODO
さいごに
いかがでしたでしょうか?
趣味全開で書いて、若干マニアックな内容となりましたが、興味持っていただけたら嬉しいです!
ACS事業部のご紹介
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
www.ap-com.co.jp