默认情况下, K8S 会将事件保留在 etcd 中一个小时,超过1小时的事件将无法看到,所以 K8S 默认保留事件的时间不足以来更深入的了解集群,所以将事件导出到集群外存储是有必要的,以实现可观测性和告警。

Event事件持久化需要依赖以下三个组件:

  • grafana
  • elasticsearch
  • kubernetes-event-exporter

1 安装 elasticsearch

# 安装 elasticsearch
# -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" 配置内存大小
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e "xpack.security.enabled=false" elasticsearch:8.11.3

输出如下则 elasticsearch 安装正常:

Kubernetes实战(二十一)-event事件持久化-LMLPHP

2 安装 Grafana


# 安装 grafana,直接通过 Mac 来安装
$ brew install grafana
$ brew services start grafana

3 安装exporter 

# 下载 kubernetes-event-exporter
$ git clone https://github.com/resmoio/kubernetes-event-exporter.git
$ cd kubernetes-event-exporter

4 配置export发送到es

# config 配置文件
logLevel: debug
logFormat: json
maxEventAgeSeconds: 10
kubeQPS: 60
kubeBurst: 60
# namespace: my-namespace-only # Omitting it defaults to all namespaces.
route:
  routes:
    - match:
       - receiver: "dump"
receivers:
  - name: "dump"
    elasticsearch:
      hosts:
        - "http://127.0.0.1:9200"
      index: kube-events
      indexFormat: "kube-events"
      useEventID: true
# 运行 kube.config 是集群的 kubeconfig 文件
go run main.go -conf=config.yaml -kubeconfig=kube.config

5 配置 Grafana ,添加 es datasource 

参考:实践K8S-Event

附录

采集event事件的方式有两种:

方式一:发送给 elasticsearch

# 下载 kubernetes-event-exportergit clone https://github.com/resmoio/kubernetes-event-exporter.gitcd kubernetes-event-exporter
# 配置 configmapcat deploy/01-config.yamlapiVersion: v1kind: ConfigMapmetadata:  name: event-exporter-cfg  namespace: monitoringdata:  config.yaml: |    logLevel: debug    logFormat: json    route:      routes:        - match:            - receiver: "dump"    receivers:      - name: "dump"        elasticsearch:          hosts:            - "http://out_cluster_eaasticsearch:9200"
# 部署kubectl apply -f deploy/

方式二:将集群事件打印到容器的 stdout 中,通过日志方式来采集​​​​​​​

cat deploy/01-config.yamlapiVersion: v1kind: ConfigMapmetadata:  name: event-exporter-cfg  namespace: monitoringdata:  config.yaml: |    logLevel: debug    logFormat: json    route:      routes:        - match:            - receiver: "dump"    receivers:      - name: "dump"        stdout:          deDot: true

 参考:Kubernetes 高级篇 k8s Event详述及持久化方案-CSDN博客

 

02-05 16:06