gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-02-10 14:31:27 24 4
gpt4 key购买 nike

前情提要

  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

                        
                      

📚️参考文档

  • How Grafana Labs Effectively Pairs Loki and Kubernetes Events | Grafana Labs
  • Configuration | Grafana Labs
  • What is the correct way to parse json logs in loki, promtail - Grafana Loki - Grafana Labs Community Forums

Grafana 系列文章

Grafana 系列文章 。

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

最后此篇关于Grafana系列文章(十三):如何用Loki收集查看KubernetesEvents的文章就讲到这里了,如果你想了解更多关于Grafana系列文章(十三):如何用Loki收集查看KubernetesEvents的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com