LoginSignup
35
19

More than 3 years have passed since last update.

Grafana Lokiを使ったKubelet Logging入門

Last updated at Posted at 2019-12-11

結論

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

KubernetesのLogの概要

  • Kubernetesの全体像は以下になります。
    Kubernetes_Logging入門_-_Google_Slides.png

  • KubernetesをLogの観点でまとめてみると以下のようになります。
    Kubernetes_Logging入門_-_Google_Slides.png

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

Grafana Loki とは

  • Lokiは以下のようなアーキテクチャをもつログの収集基盤です。
    Kubernetes_Logging入門_-_Google_Slides.png

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

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

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

Kubernetes_Logging入門_-_Google_Slides.png]

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を選択します。
    Add_data_source__Add_data_source_-_Grafana.png

  • Lokiの接続先を設定します。
    Loki__Settings_-_Grafana.png

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

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

Grafana Lokiと仲良くなる方法

ちょっと気難しいGrafana Lokiと仲良くなっていくための方法を記載します。

Grafana Labのblogを定期購読する。

Loki友の基本動作になります。Grafana LabsのblogはLokiに関する貴重な情報源になります。blogには書かれたかけど、Github上のドキュメントはありませんということも珍しくないので、Lokiの最新情報が知りたい場合はこのblogにたどり着くことになります。

今回のSystemdのsupportについても、このblogの記事で知りました。

Loki’s_Path_to_GA__Docker_Logging_Driver_Plugin___Support_for_Systemd___Grafana_Labs.png

ドキュメントの通りに動かしてみる

ドキュメントに書かれている通りにjurnal logをscrapeする機能を動かしてみます。

loki_configuration_md_at_master_·_grafana_loki.png

今回関係あるのはscrape_configsのところだけ書き換えて動かしてみます。

特にエラーもなくpromtailが起動します。何も起こりません。

何の変化もなく、エラーもはかないです。

途方にくれます。

辛いです。

CHANGELOGを確認する

闇雲に探していくのも辛いので、CHANGELOGの中からjournal logに関する変更と思われるものをピックアップして、チェックしていきます。

loki_CHANGELOG_md_at_master_·_grafana_loki.png

ピックアップした結果

  • #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に記載内容とだいたい一緒です。

promtail__Add_systemd_journal_support_by_rfratto_·_Pull_Request__730_·_grafana_loki.png

Files changedとか眺めてみるともう少し、わかります。この機能が入ったのがlokiが0.3の頃です。
promtail__Add_systemd_journal_support_by_rfratto_·_Pull_Request__730_·_grafana_loki.png

  • #921 promtail: add "max_age" field to configure cutoff for journal reading
  • "max_age"が追加されたことと、その変更内容がここでわかります。設定しないくてもdefaultで7hが設定されることがここでわかります。
     promtail__add__max_age__field_to_configure_cutoff_for_journal_reading_by_rfratto_·_Pull_Request__921_·_grafana_loki.png

  • #1298 pkg/promtail: remove journal target forced path !

    ここからlog fileのpathを設定しないと、 defaultで/var/log/journal/run/log/journalの両方が設定されることがわかります。

pkg_promtail__remove_journal_target_forced_path_by_rfratto_·_Pull_Request__1298_·_grafana_loki.png

ここから、どうやってpromtailがノード上のjournal logにアクセスするんだろうというところに思いを馳せると、該当箇所をhostpathでmountすればいいことが類推できます。  

  • 所感
    気づくと「それは、そう」って感じで少し恥ずかしいですが、ハマってる時は、迷走してるので分からないです。

ただし、まだ動きません。

見落としがないか探す。

行き詰まったので、今まで見た情報を再度丁寧に確認します。するとCHANGELOGに書いてあるメモが気になります。
loki_CHANGELOG_md_at_master_·_grafana_loki.png

今のversionが1.2でこの記述が書かれた頃が0.3なので、あまり気にしてなかったのですが、ここを手がかりに調べていくとjournal logに関する機能がamd64のimageにしか含まれておらず、全ての設定が空振りしていたのでエラーも出さずにpromtailが動作していたことがわかります。(まだ、currentlyだったのか・・・)

これを乗り越えると、こんなふうにlokiでkubeletのlogが見れるようになります。

Alerting__Alert_Rules_-_Grafana.png

皆さんもLokiと仲良くしてあげてください。

35
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
19