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 器,随时告诉我!

相关推荐
春天花会开1316 小时前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
ysu_031414 小时前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
哈__1 天前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
九皇叔叔1 天前
K8S 资源菜单
docker·容器·kubernetes·k8s
安易算力1 天前
PUE优化工程实践:从1.5到1.2的制冷架构与气流组织改造路径
网络·python·容器·架构·kubernetes
天天喝旺仔1 天前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
逐流人2 天前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
kuroomi2 天前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
运维开发王义杰2 天前
跨项目直连数据库:是架构反模式,还是现实的工程妥协?
云原生
程序猿阿越2 天前
containerd如何创建Pod
后端·kubernetes·源码阅读