Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

grafana,系列,文章,十三,如何,loki,收集,查看,kubernetes,events · 浏览次数 : 282

小编点评

**Kubernetes Events 的用途** Kubernetes Events 是一个用于处理 Kubernetes 日志的事件通知系统。它可以用于将 Events 发送到各种目标,包括 Loki、Prometheus 和 Alertmanager。 **kubernetes-event-exporter 的用途** kubernetes-event-exporter 是一个用于从 Kubernetes Events 中导出 JSON 格式的日志收集器。它可以通过 stdout 方式输出 Events 的 JSON 数据,并将其存储在 Loki 中。 **Promtail 的配置** Promtail 的配置用于指定从 Kubernetes Events 中提取哪些信息并将其输出到 Loki。以下是一些关键配置选项: * `job_name`: 指定要从 Kubernetes Events 中提取的信息的管道名称。 * `pipeline_stages`: 指定要处理的管道阶段。 * `json`: 配置 JSON 格式。 * `labels`: 配置标签。 **kubernetes-event-exporter 的配置** 以下是kubernetes-event-exporter 的基本配置: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: kubernetes-event-exporter spec: default: enabled: true timeoutSeconds: 300 timeoutSeconds: 5 writeTimeoutSeconds: 5 resources: requests: memory: 100Mi limits: memory: 200Mi volumeMounts: - name: kube-events-config mountPath: /etc/kubernetes/events.conf readOnly: true ``` **使用 kubernetes-event-exporter** 1. 将 `events.conf` 文件中的 `destination` 设置为 `Loki`。 2. 运行 `kubectl apply -f kubernetes-event-exporter.yaml` 命令。 3. 启动 Kubernetes 集群。 4. 在 Loki 中创建一个新的 dashboard。 5. 在 dashboard 中添加一个图表,使用 `namespace` 作为附加标签。 6. 启动 Promtail。 **总结** kubernetes-event-exporter 是一个用于从 Kubernetes Events 中导出 JSON 格式的日志收集器。它可以通过 stdout 方式输出 Events 的 JSON 数据,并将其存储在 Loki 中。这是一种方便的方法来收集和分析 Kubernetes 集群问题。

正文

前情提要

  1. IoT 边缘集群基于 Kubernetes Events 的告警通知实现
  2. IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置

概述

在分析 K8S 集群问题时,Kubernetes Events 是超级有用的。

Kubernetes Events 可以被当做是日志来处理,格式也和日志很像,都包括:

  1. 时间
  2. 组件
  3. 原因
  4. ...

但是,Kubernetes 默认只持久化了一个小时的事件,以减少 etcd 的负载。所以,考虑利用 Loki 存储和查询这些 Events。

实现

看过 我之前的文章 的可以知道,kubernetes-event-exporter 可以实现对 Kubernetes Events 的收集。

那我们就利用 kubernetes-event-exporter, 通过最简单的 stdout 方式来输出 json 格式的 event.

另外,再利用 Promtail 的 管道配置,将 NameSpace 作为附加标签添加到导出到 Loki 的日志中。

kubernetes-event-exporter 配置

如下:

logLevel: error
logFormat: json
trottlePeriod: 5
route:
  routes:
    - match:
        - receiver: "dump"
receivers:
  - name: "dump"
    stdout: { }

Promtail 配置

如下:

...
scrape_configs:
- job_name: kubernetes-pods-app
  pipeline_stages:
    - cri: {}
    - match:
        selector: '{app="event-exporter"}'
        stages:
        - json:
            expressions:
              namespace: involvedObject.namespace
        - labels:
            namespace: ""  
...        

上面的配置会从 Events 的 JSONPath involvedObject.namespace 中获取 NameSpace ,并将其作为一个标签 - namespace 添加。

至此,我可以只查看特定 NameSpace(如emqx) 的 Events, 如下图:

来自 emqx NameSpace 的 Events

🎉🎉🎉

📝Notes:

我的event-exporter 是部署在 monitoring NS 中的

❓️疑难解答

刚开始做的时候,发现的日志输出不对,格式实例如下:

错误的日志格式

2022-04-20T22:26:19.526448119+08:00 stderr F I0420 {...json...}

这是因为我用的 container runtime 是 CRI, 而非 Docker.

但是默认安装 Loki 的时候,配置文件里却用的是 docker 的 stage parser, 导致日志格式异常。初始的配置如下:

...
- job_name: kubernetes-pods-name
  pipeline_stages:
    - docker: {}
...    

Docker 的日志格式如下:

`{"log":"level=info ts=2019-04-30T02:12:41.844179Z caller=filetargetmanager.go:180 msg=\"Adding target\"\n","stream":"stderr","time":"2019-04-30T02:12:41.8443515Z"}`

CRI 的日志格式如下:

2019-01-01T01:00:00.000000001Z stderr P some log message

所以如上文所示,要根据自己的 container runtime 选择合适的 stage parser.

对于 CRI, cri: {} 其实就是如下细节的一个"语法糖":

- 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

📚️参考文档

Grafana 系列文章

Grafana 系列文章

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

与Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events相似的内容:

Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集群问题时,Kubernetes Events 是超级有用的。 Kubernetes Events 可

Grafana 系列文章(一):基于 Grafana 的全栈可观察性 Demo

📚️Reference: https://github.com/grafana/intro-to-mlt 这是关于 Grafana 中可观察性的三个支柱的一系列演讲的配套资源库。 它以一个自我封闭的 Docker 沙盒的形式出现,包括在本地机器上运行和实验所提供的服务所需的所有组件。 Grafan

Grafana 系列文章(二):使用 Grafana Agent 和 Grafana Tempo 进行 Tracing

👉️URL: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ ✍Author: Robert Fratto • 17 Nov 2020 📝Description

Grafana 系列文章(三):Tempo-使用 HTTP 推送 Spans

👉️URL: https://grafana.com/docs/tempo/latest/api_docs/pushing-spans-with-http/ 📝Description: 有时,使用追踪系统是令人生畏的,因为它似乎需要复杂的应用程序仪器或 span 摄取管道,以便 ... 有时,使

Grafana 系列文章(四):Grafana Explore

👉️URL: https://grafana.com/docs/grafana/latest/explore/ 📝Description: Explore Grafana 的仪表盘 UI 是关于构建可视化的仪表盘。Explore 剥离了仪表盘和面板选项,这样你就可以。.. Grafana 的仪表

Grafana 系列文章(五):Grafana Explore 查询管理

👉️URL: https://grafana.com/docs/grafana/latest/explore/query-management/ 📝Description: Explore 中的查询管理 为了帮助调试查询,Explore 允许你调查查询请求和响应,以及查询统计数据,... Exp

Grafana 系列文章(六):Grafana Explore 中的日志

👉️URL: https://grafana.com/docs/grafana/latest/explore/logs-integration/#labels-and-detected-fields 📝Description: Explore 中的日志 除了指标之外,Explore 还允许你在以

Grafana 系列文章(七):Grafana Explore 中的 Tracing

👉️URL: https://grafana.com/docs/grafana/latest/explore/trace-integration/ 📝Description: Tracing in Explore Explore 允许你将 tracing 数据源的痕迹可视化。这在 Grafana

Grafana 系列文章(八):Grafana Explore 中的 Inspector

👉️URL: https://grafana.com/docs/grafana/latest/explore/explore-inspector/ 📝Description: Explore 中的检查器 (Inspector). 检查器可以帮助你理解你的查询并排除故障。你可以检查原始数据,把这些

Grafana 系列文章(九):开源云原生日志解决方案 Loki 简介

简介 Grafana Labs 简介 Grafana 是用于时序数据的事实上的仪表盘解决方案。它支持近百个数据源。 Grafana Labs 想从一个仪表盘解决方案转变成一个可观察性 (observability) 平台,成为你需要对系统进行调试时的首选之地。 完整的可观察性 可观察性。关于这意味着