と思ってここを読んでみたら面白かった。
理解したことをざっくりと書くと
コンテナレベルからクラスタレベルへ
Dockerからログを出力したとして、コンテナがクラッシュしたりノードが落ちたりしたときでもログは見られるようにしときたいよね。だから、ログの保存先は別にしといて、コンテナとかノードとかとは違うライフサイクルで管理したい。てのがクラスタレベルロギングって呼ばれてるコンセプト。
クラスタレベルロギングの前に基本とノードレベルの紹介から。
k8sのロギングの基本
コンテナから stdout
とか stderr
に出しとくと kubectl logs
で見られる。
ノードレベルのロギング
(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )
コンテナからの stdout
と stderr
をファイルに書き出すようにしとく。コンテナがリスタートした場合は、kubeletは終了したコンテナとそのログをキープするけど、ポッドがそのノードから追い出された時はコンテナもログもなくなってしまう。
それから、ログファイルがどんどん大きくなっていかないように、ファイルのローテーションは自分でやっといてね。
クラスタレベルロギング
3つ方法がある。
1. ノードロギングエージェントを使う
(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )
ノードレベルのロギングをしといて、各ノードに置いたロギングエージェントからロギングのバックエンドに送る。
オススメ。アプリを変更せずにノードごとにエージェントを置けばいいだけだから。
2. サイドカーコンテナとロギングエージェント
これは2つのタイプがある
2-1. ストリーミングサイドカー
(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )
ノードレベルのロギングだと stdout
と stderr
だけしか出せない。そうじゃなくて、アプリケーションが複数のファイルにログを出力している場合は、ストリーミング用のサイドカーコンテナを使うことができる。
例えばアプリケーションがa.logとb.logを出力してる場合に、a.logを読み込んで stdout
stderr
として出力するストリーミングコンテナと、b.logに対して同じことをするストリーミングコンテナを使えば、そこから出力したログをノードロギングエージェントからロギングバックエンドに送ることができる。
この方法だとディスクのアクセスが増えるので、もし1つのファイルにしか出してないんだったらそれを stdout
stderr
に出すようにしてノードロギングエージェントを使ったほうがいい。
2-2. サイドカーエージェント
(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )
ノードロギングエージェントよりもうちょっと柔軟にやりたい場合は、ロギングエージェントとサイドカーとして立てることもできる。
消費リソースが増えることに注意ね。それと、ログがkubeletの管轄外になっちゃうから kubectl logs
でログが見られなくなることに注意ね。
3. アプリから直接送る
(Image from https://kubernetes.io/docs/concepts/cluster-administration/logging/ )
アプリから直接ロギングバックエンドに送るという手もある。k8sの管轄外だけど。
好きなのは
サイドカーエージェントかなー。面白かった。