APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

KubeCon EU 2023: Kubernetesの構造化ログ Deep Dive!

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

www.kubernetes.dev

さいごに

いかがでしたでしょうか?
趣味全開で書いて、若干マニアックな内容となりましたが、興味持っていただけたら嬉しいです!

ACS事業部のご紹介

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp

本記事の投稿者: 谷合純也
AKS/ACAをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn