k8s部署ELK補充篇:kubernetes-event-exporter收集Kubernetes集群中的事件
文章目錄
- k8s部署ELK補充篇:kubernetes-event-exporter收集Kubernetes集群中的事件
- 一、kubernetes-event-exporter簡介
- 二、kubernetes-event-exporter實戰部署
- 1. 創建Namespace(elk-namespace.yaml)
- 2. 部署Logstash(event-logstash.yaml)
- 3. 部署kubernetes-event-exporter(event-exporter.yaml)
- 4. 部署所有資源
- 5. 驗證Logstash Pod狀態
- 三、Kibana頁面展示
- 總結
在 Kubernetes 集群中,事件(Event) 是用于記錄資源狀態變化和異常信息的重要機制,常用于排查部署問題、資源調度異常或系統錯誤等。然而,Kubernetes 默認只保留最近一小時內的事件,且僅能通過 kubectl get events
命令臨時查看,無法滿足集中管理、持久化存儲和告警通知等生產需求。
為了解決這一問題,我們可以引入 kubernetes-event-exporter
,它能夠實時捕捉集群中的事件,并將其導出到日志系統、告警平臺或其他后端存儲系統中。配合 ELK(Elasticsearch + Logstash + Kibana)這一成熟的日志分析平臺,我們可以實現對集群事件的統一采集、分析和可視化展示。
本篇文章將介紹如何在 Kubernetes 環境中部署 kubernetes-event-exporter,實現事件的收集與輸出,為集群可觀測性和故障排查提供更全面的數據支撐。
一、kubernetes-event-exporter簡介
kubernetes-event-exporter 是一款專為 Kubernetes 設計的輕量級事件收集與導出工具,能夠實時捕捉 Kubernetes 集群中的事件(Events),并將其導出到指定的后端系統,如 Elasticsearch、Loki、Kafka、Webhook 或文件等。
相比于通過 kubectl get events 命令手動查看事件,這款工具支持 自動化
、持久化
、結構化
地處理事件數據,特別適用于與日志系統、監控平臺或告警系統集成,實現對集群狀態的可觀測性增強和異常快速響應。
kubernetes-event-exporter 提供了靈活的過濾規則和接收器配置,用戶可以根據事件的類型、命名空間、資源或原因等條件,自定義輸出策略,是構建 Kubernetes 運維監控體系的有力補充組件。
二、kubernetes-event-exporter實戰部署
1. 創建Namespace(elk-namespace.yaml)
首先,創建一個新的命名空間,用于部署 ELK 相關的資源
apiVersion: v1
kind: Namespace
metadata:name: elk
2. 部署Logstash(event-logstash.yaml)
以下配置將部署 Logstash
,并從 Kafka 中拉取事件數據,再輸出到 Elasticsearch
kind: Deployment
apiVersion: apps/v1
metadata:name: kube-event-logstashnamespace: elklabels:app: kube-event-logstash
spec:replicas: 1selector:matchLabels:app: kube-event-logstashtemplate:metadata:creationTimestamp: nulllabels:app: kube-event-logstashannotations:kubesphere.io/restartedAt: '2024-02-22T09:03:36.215Z'spec:volumes:- name: kube-event-logstash-pipeline-configconfigMap:name: kube-event-logstash-pipeline-configdefaultMode: 420- name: kube-event-logstash-configconfigMap:name: kube-event-logstash-config- name: logstash-configemptyDir: {}initContainers:- name: copy-logstash-configimage: harbor.local/k8s/busybox:1.37.0command: ['sh', '-c', 'cp /tmp/logstash.yml /usr/share/logstash/config/logstash.yml && chmod 777 /usr/share/logstash/config/logstash.yml']volumeMounts:- name: kube-event-logstash-configmountPath: /tmp/logstash.ymlsubPath: logstash.yml- name: logstash-configmountPath: /usr/share/logstash/configcontainers:- name: kube-event-logstashimage: harbor.local/k8s/logstash:7.17.0env:- name: NODE_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.name- name: PIPELINE_BATCH_SIZEvalue: '4000'- name: PIPELINE_BATCH_DELAYvalue: '100'- name: PIPELINE_WORKERSvalue: '4'- name: LS_JAVA_OPTSvalue: '-Xms2g -Xmx3500m' #JVM內存設置resources:limits:cpu: '2'memory: 4Girequests:cpu: '1'memory: 1GivolumeMounts:- name: kube-event-logstash-pipeline-configmountPath: /usr/share/logstash/pipeline- name: logstash-configmountPath: /usr/share/logstash/config/logstash.ymlsubPath: logstash.ymllivenessProbe:tcpSocket:port: 9600initialDelaySeconds: 39timeoutSeconds: 5periodSeconds: 30successThreshold: 1failureThreshold: 2readinessProbe:tcpSocket:port: 9600initialDelaySeconds: 39timeoutSeconds: 5periodSeconds: 30successThreshold: 1failureThreshold: 2terminationMessagePath: /dev/termination-logterminationMessagePolicy: FileimagePullPolicy: IfNotPresentrestartPolicy: AlwaysterminationGracePeriodSeconds: 30dnsPolicy: ClusterFirstsecurityContext: {}schedulerName: default-schedulerstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 25%maxSurge: 25%revisionHistoryLimit: 10progressDeadlineSeconds: 600
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-event-logstash-pipeline-confignamespace: elk
data:logstash.conf: |-input {kafka {bootstrap_servers => "kafka-0.kafka-headless.elk.svc.cluster.local:9092"group_id => "logstash-consumer-group-event"topics => ["k8s-event"]codec => "json"consumer_threads => 1decorate_events => truesecurity_protocol => "PLAINTEXT" }}output {elasticsearch {hosts => ["http://elasticsearch-0.elasticsearch-cluster.elk.svc.cluster.local:9200"]index => "k8s-event-%{+YYYY.MM.dd}"}}
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-event-logstash-confignamespace: elk
data:logstash.yml: |-http.host: "0.0.0.0"xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch-0.elasticsearch-cluster.elk.svc.cluster.local:9200"]
3. 部署kubernetes-event-exporter(event-exporter.yaml)
包含 ServiceAccount、ClusterRoleBinding、配置文件 ConfigMap 及 Deployment
apiVersion: v1
kind: ServiceAccount
metadata:namespace: elkname: event-exporter
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: event-exporter
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: view
subjects:- kind: ServiceAccountnamespace: elkname: event-exporter
---
apiVersion: v1
kind: ConfigMap
metadata:name: event-exporter-cfgnamespace: elk
data:config.yaml: |logLevel: errorlogFormat: jsonroute:routes:- match:- receiver: "kafka"drop:- kind: "Service" #可選,忽略 Service 類型事件receivers:- name: "kafka"kafka:clientId: "kubernetes"topic: "k8s-event"brokers:- "kafka-0.kafka-headless.elk.svc.cluster.local:9092"compressionCodec: "snappy"layout: #自定義字段格式kind: "{{ .InvolvedObject.Kind }}"namespace: "{{ .InvolvedObject.Namespace }}"name: "{{ .InvolvedObject.Name }}"reason: "{{ .Reason }}"message: "{{ .Message }}"type: "{{ .Type }}"timestamp: "{{ .GetTimestampISO8601 }}"cluster: "sda-pre-center"
---
apiVersion: apps/v1
kind: Deployment
metadata:name: event-exporternamespace: elk
spec:replicas: 1template:metadata:labels:app: event-exporterversion: v1spec:serviceAccountName: event-exportercontainers:- name: event-exporterimage: harbor.local/k8s/kubernetes-event-exporter:v1imagePullPolicy: IfNotPresentargs:- -conf=/data/config.yamlvolumeMounts:- mountPath: /dataname: cfgvolumes:- name: cfgconfigMap:name: event-exporter-cfgselector:matchLabels:app: event-exporterversion: v1
4. 部署所有資源
將上述 YAML 文件保存后,使用以下命令統一部署
kubectl apply -f elk-namespace.yaml
kubectl apply -f event-logstash.yaml
kubectl apply -f event-exporter.yaml
5. 驗證Logstash Pod狀態
kubectl get pod -n elk
三、Kibana頁面展示
訪問地址:http://ip:30601
在 Kibana 中創建索引模式 k8s-event-*
,可視化展示集群事件數據(不知道怎么創建的可以看我前面的文章)
總結
📌 本文作為對 ELK 在 Kubernetes 中部署使用的補充,介紹了如何通過部署 kubernetes-event-exporter 實時采集集群事件,并結合 Kafka 與 Logstash 將事件數據統一輸出至 Elasticsearch,從而實現對集群事件的集中管理與可視化展示。
通過這一方案,Kubernetes 原生事件不再局限于短時查看和手動排查,而是納入到完整的日志與監控體系中,極大提升了運維的效率與可觀測性,是生產環境中不可或缺的重要組成部分。