k8s 收集event事件至Loki

🧭 前言

在生产环境中,Kubernetes 事件(Event)默认存储时间短、查询不便。通过将事件导出并存储在 Grafana Loki 中,我们可以长期保留、可视化和告警 Kubernetes 的运行状态变化,这对故障排查、调度优化、容量规划非常重要。本文档基于 loki-distributed 部署方式,详细介绍如何使用 kubernetes-event-exporter 获取事件,存入 Loki,并在 Grafana 中导入官方 Dashboard(ID:17882),快速形成监控产物。

✅ 前置条件

确保你已有以下环境:

  1. Kubernetes 集群正常运行

  2. loki-distributed 已部署完成,且可访问 Loki 对外网关

  3. Grafana 已部署,并配置了 Loki 作为 Data Source

📁 部署目录及清单

bash 复制代码
.
├── 00-roles.yaml        # RBAC 配置
├── 01-config.yaml       # event-exporter 配置
└── 02-deployment.yaml   # Deployment 配置

1️⃣ RBAC 权限配置(00-roles.yaml)

bash 复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: event-exporter
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: event-exporter
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["get","watch","list"]
  - apiGroups: ["coordination.k8s.io"]
    resources: ["leases"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: event-exporter
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: event-exporter
subjects:
  - kind: ServiceAccount
    name: event-exporter
    namespace: monitoring

2️⃣ event-exporter 配置(01-config.yaml)

bash 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: event-exporter-config
  namespace: monitoring
data:
  config.yaml: |
    logLevel: debug
    logFormat: json
    metricsNamePrefix: event_exporter_
    sinks:
      loki:
        type: loki
        config:
          url: "http://loki-distributed-gateway.loki.svc.cluster.local:80/loki/api/v1/push"
    route:
      routes:
        - match:
            - receiver: "loki"

3️⃣ 部署 event-exporter(02-deployment.yaml)

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: event-exporter
      version: v1
  template:
    metadata:
      labels:
        app: event-exporter
        version: v1
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '2112'
        prometheus.io/path: '/metrics'
    spec:
      serviceAccountName: event-exporter
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: event-exporter
          image: ghcr.io/resmoio/kubernetes-event-exporter:latest
          args:
            - -conf=/config/config.yaml
          volumeMounts:
            - name: config-volume
              mountPath: /config
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      volumes:
        - name: config-volume
          configMap:
            name: event-exporter-config

4️⃣ 应用部署

bash 复制代码
kubectl apply -f 00-roles.yaml
kubectl apply -f 01-config.yaml
kubectl apply -f 02-deployment.yaml

确认 Pod 启动无误:

bash 复制代码
kubectl -n monitoring get pods -l app=event-exporter
kubectl -n monitoring logs deploy/event-exporter

kubectl  get pod -n monitoring  
NAME                              READY   STATUS    RESTARTS   AGE
event-exporter-6768f485cb-knx9v   1/1     Running   0          3h32m

5️⃣ Grafana 配置与 Dashboard 导入

  1. 添加 Loki 数据源

  2. Grafana → Settings → Data Sources → Add → Loki

  3. URL 填写:http://<loki-gateway-service>:80,测试连接

  4. 导入 Dashboard

  5. Grafana → "+" → Import → 输入 Dashboard ID:17882

  6. 选择刚配置的 Loki Data Source,完成导入

6️⃣ 验证与查询示例

  • 直接在 Grafana → Explore 中查询:
bash 复制代码
{app="event-exporter"} | json
  • 示例查询错误事件数并填补零值:
bash 复制代码
sum(count_over_time({app="event-exporter"} | json | reason="Failed"[$__interval])) or 0

📚 参考资料

  • 官方 GitHub:resmoio/kubernetes-event-exporter

  • Dashboard ID:17882 Kubernetes Event Exporter

  • Loki 文档:loki-distributed 模式说明(Simple Scalable)


✅ 小结

通过本文档,你将实现一个完整方案:监听 Kubernetes Event → event-exporter 将其推入 loki-distributed → Grafana 导入 Dashboard 可视化事件信息。可进一步优化包括消息过滤、报警告警及多集群统一事件收集。如需示例 Helm values 或 Kustomize 器,随时告诉我!

相关推荐
能不能别报错4 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错6 小时前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK7 小时前
k8s面试题
容器·面试·kubernetes
Serverless社区8 小时前
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
阿里云·云原生·serverless·函数计算
赵渝强老师8 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
能不能别报错10 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
稚辉君.MCA_P8_Java10 小时前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes
一叶飘零_sweeeet11 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署
码路工人14 小时前
附录B:kubectl 命令速查表 - Kubernetes 集群管理必备指南
docker·云原生·容器
码路工人14 小时前
附录A:常用 Docker 命令速查表
docker·云原生·容器