結論
Grafanaを使って以下のようにkubelet
のlog
を見れるようになります。
KubernetesのLogの概要
なので、Log
の観点で見るとPodのlog
と"kubelet"のlog
を抑えるとKubernetes全体のlogを把握することができることがわかります。
Grafana Loki とは
-
特徴としては以下があります。
-
promtail
というエージェントが各ノードのlogを収集してくれる - Grafanaを用いて、各ノードのlogを見ることができる
-
Lokiのhelmを用いるとPodのlogについては簡単にGrafanaから見れるようになりますが、そのままではkubelet(jurnal log)
を見ることができません。今回はその部分について、どうやったらみえるようになるか説明していきます。
- 参考
ここまでの話については、CloudNative Days Tokyo2019登壇時の使用した以下の資料により細かい話を記載しています。
Lokiでjournal log
を見るための変更ポイント
- promtailの設定ファイルである
promtail.yaml
について
apiVersion: v1
kind: ConfigMap
metadata:
name: loki-promtail
labels:
app: promtail
data:
promtail.yaml: |
scrape_configs:
- job_name: journal
journal:
max_age: 12h
labels:
job: systemd-journal
relabel_configs:
- source_labels: ['__journal__systemd_unit']
target_label: 'unit'
job_name
でjournal
を指定することで、promtail
に備わっているjournal log
を収集する機能を使用することができるようになります。
その他も含めた注意点を以下に記載します。
項目名 | 設定内容 | 説明 |
---|---|---|
job_name | journal | この項目を設定することでjournalをscrapeする機能が有効になります |
journal.max_age | 12h | promtail起動時に何時間前までのjournal logを取りに行くかを指定する項目になります。 |
relabel_configs | 割愛 | garafanaでみる際に絞り込むためのlabelの設定になります。今回はkubeletで絞り込みたいのでunitを指定しています |
-
promtail
のDeamonSet
について
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: loki-promtail
labels:
app: promtail
spec:
selector:
matchLabels:
app: promtail
template:
metadata:
labels:
app: promtail
spec:
containers:
- name: promtail
image: "grafana/promtail:v1.2.0-amd64"
args:
- "-config.file=/etc/promtail/promtail.yaml"
- "-client.url=http://loki:3100/loki/api/v1/push"
volumeMounts:
- name: config
mountPath: /etc/promtail
- name: journal-var
mountPath: /var/log/journal
readOnly: true
- name: journal-run
mountPath: /run/log/journal
readOnly: true
volumes:
- name: config
configMap:
name: loki-promtail
- hostPath:
path: /var/log/journal
name: journal-var
- hostPath:
path: /run/log/journal
name: journal-run
- ここでのポイントは2つです
- imageについては、
amd64
となっているものを使うこと - ノード上のjournalのlogが格納されている場所を
hostPath
mountすること
- imageについては、
これらがどうしてそうする必要があるのかについては、最後の方に記載します。
Grafanaでみるkubelet
のlog
-
Data Source
の設定でLokiを選択します。
- Lokiの接続先を設定します。
- Exploreから
unit
のlabelを指定してkubelet
のlog
を絞り込むことができます。
Grafanaから簡単にkubelet
のlog
を見れるようになるので非常に便利です。
Grafana Lokiと仲良くなる方法
ちょっと気難しいGrafana Lokiと仲良くなっていくための方法を記載します。
Grafana Labのblogを定期購読する。
Loki友の基本動作になります。Grafana LabsのblogはLokiに関する貴重な情報源になります。blogには書かれたかけど、Github上のドキュメントはありませんということも珍しくないので、Lokiの最新情報が知りたい場合はこのblogにたどり着くことになります。
今回のSystemd
のsupportについても、このblogの記事で知りました。
ドキュメントの通りに動かしてみる
ドキュメントに書かれている通りにjurnal log
をscrapeする機能を動かしてみます。
今回関係あるのはscrape_configs
のところだけ書き換えて動かしてみます。
特にエラーもなくpromtailが起動します。何も起こりません。
何の変化もなく、エラーもはかないです。
途方にくれます。
辛いです。
CHANGELOGを確認する
闇雲に探していくのも辛いので、CHANGELOGの中からjournal log
に関する変更と思われるものをピックアップして、チェックしていきます。
ピックアップした結果
- #730 promtail: Add systemd journal support
- #921 promtail: add "max_age" field to configure cutoff for journal reading
- #1109 Clarify journal warning
- #1261 Document systemd journal scraping
- #1298 pkg/promtail: remove journal target forced path
issueをみていく
-
#730 promtail: Add systemd journal support
journal log
の始まりのissueになります。この時点ではblogに記載内容とだいたい一緒です。
Files changed
とか眺めてみるともう少し、わかります。この機能が入ったのがlokiが0.3
の頃です。
-
#921 promtail: add "max_age" field to configure cutoff for journal reading
-
"max_age"が追加されたことと、その変更内容がここでわかります。設定しないくてもdefaultで
7h
が設定されることがここでわかります。
-
#1298 pkg/promtail: remove journal target forced path !
ここからlog fileのpath
を設定しないと、 defaultで/var/log/journal
と/run/log/journal
の両方が設定されることがわかります。
ここから、どうやってpromtailがノード上のjournal logにアクセスするんだろうというところに思いを馳せると、該当箇所をhostpathでmountすればいいことが類推できます。
- 所感
気づくと「それは、そう」って感じで少し恥ずかしいですが、ハマってる時は、迷走してるので分からないです。
ただし、まだ動きません。
見落としがないか探す。
行き詰まったので、今まで見た情報を再度丁寧に確認します。するとCHANGELOGに書いてあるメモが気になります。
今のversionが1.2
でこの記述が書かれた頃が0.3
なので、あまり気にしてなかったのですが、ここを手がかりに調べていくとjournal log
に関する機能がamd64のimageにしか含まれておらず、全ての設定が空振りしていたのでエラーも出さずにpromtailが動作していたことがわかります。(まだ、currentlyだったのか・・・)
これを乗り越えると、こんなふうにlokiでkubelet
のlogが見れるようになります。
皆さんもLokiと仲良くしてあげてください。