結論
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が格納されている場所を
hostPathmountすること
- 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と仲良くしてあげてください。








