k8sでロギングってどんなやり方があるんかな?

と思ってここを読んでみたら面白かった。

kubernetes.io

理解したことをざっくりと書くと

コンテナレベルからクラスタレベルへ

Dockerからログを出力したとして、コンテナがクラッシュしたりノードが落ちたりしたときでもログは見られるようにしときたいよね。だから、ログの保存先は別にしといて、コンテナとかノードとかとは違うライフサイクルで管理したい。てのがクラスタレベルロギングって呼ばれてるコンセプト。

クラスタレベルロギングの前に基本とノードレベルの紹介から。

k8sのロギングの基本

コンテナから stdout とか stderr に出しとくと kubectl logs で見られる。

ノードレベルのロギング

f:id:bufferings:20180125220119p:plain

(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )

コンテナからの stdoutstderr をファイルに書き出すようにしとく。コンテナがリスタートした場合は、kubeletは終了したコンテナとそのログをキープするけど、ポッドがそのノードから追い出された時はコンテナもログもなくなってしまう。

それから、ログファイルがどんどん大きくなっていかないように、ファイルのローテーションは自分でやっといてね。

クラスタレベルロギング

3つ方法がある。

1. ノードロギングエージェントを使う

f:id:bufferings:20180125220619p:plain

(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )

ノードレベルのロギングをしといて、各ノードに置いたロギングエージェントからロギングのバックエンドに送る。

オススメ。アプリを変更せずにノードごとにエージェントを置けばいいだけだから。

2. サイドカーコンテナとロギングエージェント

これは2つのタイプがある

2-1. ストリーミングサイドカー

f:id:bufferings:20180125220943p:plain

(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )

ノードレベルのロギングだと stdoutstderr だけしか出せない。そうじゃなくて、アプリケーションが複数のファイルにログを出力している場合は、ストリーミング用のサイドカーコンテナを使うことができる。

例えばアプリケーションがa.logとb.logを出力してる場合に、a.logを読み込んで stdout stderr として出力するストリーミングコンテナと、b.logに対して同じことをするストリーミングコンテナを使えば、そこから出力したログをノードロギングエージェントからロギングバックエンドに送ることができる。

この方法だとディスクのアクセスが増えるので、もし1つのファイルにしか出してないんだったらそれを stdout stderr に出すようにしてノードロギングエージェントを使ったほうがいい。

2-2. サイドカーエージェント

f:id:bufferings:20180125221714p:plain

(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )

ノードロギングエージェントよりもうちょっと柔軟にやりたい場合は、ロギングエージェントとサイドカーとして立てることもできる。

消費リソースが増えることに注意ね。それと、ログがkubeletの管轄外になっちゃうから kubectl logs でログが見られなくなることに注意ね。

3. アプリから直接送る

f:id:bufferings:20180125222249p:plain

(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )

アプリから直接ロギングバックエンドに送るという手もある。k8sの管轄外だけど。

好きなのは

サイドカーエージェントかなー。面白かった。