kubernetesを運用している皆さん、ランタイム移行はお済みでしょうか
私も運用しているEKSのnodeをdockerからcontainerdに移行するために諸々調整をしています
この移行にあたって、変更が大きくて面倒だな思っているのが、ログのフォーマットです
dockerはjsonだったのですが、criはそうではなくなっているので、同じconfigは使えません
それぞれのランタイムのnodeが混在する時期がある場合、それぞれのフォーマットに対応したconfigを作成して、それぞれのconfigを使用するdaemonsetを用意して、taintsを活用してdeployするnodeを指定して…
と、ちょっと面倒、できるならひとつで済ませたい
私はログの保存にLokiを使用しているのですが、promtailのconfigにはdockerもcriもプリセットのparserが用意されています
https://grafana.com/docs/loki/latest/clients/promtail/stages/docker/
https://grafana.com/docs/loki/latest/clients/promtail/stages/cri/
これがあるのでpromtailのpipeline_stagesには
- docker: {}
とか
- cri: {}
とか書いておけば細かい設定をしないならこれで事足ります
これって両方書いたらどっちもいい感じにparseしてくれるのでは…と思ったのですが結果としてはうまく出力できませんでした
両方ともparseすると、ログ本文・ストリーム・タイムスタンプの3つのフィールドが作られるのですが
docker
の場合はログ本文のキーが output
なのに対して、 cri
の場合は content
となっているあたりがダメな原因なのでしょうか?
そしてこの docker
と cri
それぞれ以下の設定のエイリアスになっているだけなので
- json:
output: log
stream: stream
timestamp: time
- labels:
stream:
- timestamp:
source: timestamp
format: RFC3339Nano
- output:
source: output
- regex:
expression: "^(?s)(?P<time>\\S+?) (?P<stream>stdout|stderr) (?P<flags>\\S+?) (?P<content>.*)$",
- labels:
stream:
- timestamp:
source: time
format: RFC3339Nano
- output:
source: content
この2つを組み合わせて
- json:
expressions:
content: log
stream:
time:
- regex:
expression: "^(?s)(?P<time>\\S+?) (?P<stream>stdout|stderr) (?P<flags>\\S+?) (?P<content>.*)$"
- labels:
stream:
- timestamp:
source: time
format: RFC3339Nano
- output:
source: content
とすると、docker/cri両方で使えるconfigになるはずです、たぶん…
jsonとregex両方ある部分がそこはかとなく怪しいですが、なんとなくいい感じにやってくれてるようで、今のとこ問題なく動いてます
fluent-bitとかはちょっと難しそうでしたね、残念