Grafana Lokiを使ったKubelet Logging入門


結論

Grafanaを使って以下のようにkubeletlogを見れるようになります。

KubernetesのLogの概要

  • Kubernetesの全体像は以下になります。

  • KubernetesをLogの観点でまとめてみると以下のようになります。

なので、Logの観点で見るとPodのlogと"kubelet"のlogを抑えるとKubernetes全体のlogを把握することができることがわかります。

Grafana Loki とは

  • Lokiは以下のようなアーキテクチャをもつログの収集基盤です。

  • 特徴としては以下があります。

    • promtailというエージェントが各ノードのlogを収集してくれる
    • Grafanaを用いて、各ノードのlogを見ることができる

Lokiのhelmを用いるとPodのlogについては簡単にGrafanaから見れるようになりますが、そのままではkubelet(jurnal log)を見ることができません。今回はその部分について、どうやったらみえるようになるか説明していきます。

]

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_namejournalを指定することで、promtailに備わっているjournal logを収集する機能を使用することができるようになります。

その他も含めた注意点を以下に記載します。

項目名 設定内容 説明
job_name journal この項目を設定することでjournalをscrapeする機能が有効になります
journal.max_age 12h promtail起動時に何時間前までのjournal logを取りに行くかを指定する項目になります。
relabel_configs 割愛 garafanaでみる際に絞り込むためのlabelの設定になります。今回はkubeletで絞り込みたいのでunitを指定しています
  • promtailDeamonSetについて
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すること

これらがどうしてそうする必要があるのかについては、最後の方に記載します。

Grafanaでみるkubeletlog

  • Data Sourceの設定でLokiを選択します。

  • Lokiの接続先を設定します。

  • Exploreからunitのlabelを指定してkubeletlogを絞り込むことができます。

Grafanaから簡単にkubeletlogを見れるようになるので非常に便利です。

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と仲良くしてあげてください。