背景
Kubernetes中的事件最终还是存储在etcd中,默认情况下只保存1个小时,由于etcd并不支持一些复杂的分析操作,默认Kubernetes只提供了非常简单的过滤方式,比如通过Reason、时间、类型等。同时这些事件只是被动的存在etcd中,并不支持主动推送到其他系统,通常只能手动的去查看。
而实际上我们对事件的使用需求非常高,例如:
- 对系统中的异常事件做实时告警,例如Failed、Evicted、FailedMount、FailedScheduling等。
- 通常问题排查可能要去查找历史数据,因此需要去查询更长时间范围的事件(几天甚至几个月)。
- 事件支持归类统计,例如能够计算事件发生的趋势以及与上一时间段(昨天/上周/发布前)对比,以便基于统计指标进行判断和决策。
- 支持不同的人员按照各种维度去做过滤、筛选。
- 支持自定义的订阅这些事件去做自定义的监控,以便和公司内部的部署运维平台集成。
为了让大家更便捷的使用Kubernetes事件功能,所需需要进行Kubernetes Event持久化。
一、什么是Kubernetes Event
Kubernetes的事件(Event)是一种资源对象(Resource Object),用于展示集群内发生的情况,Kubernetes系统中的各个组件会将运行时发生的各种事件上报给Kubernetes API Server。
例如,调度器做了什么决定,某些Pod为什么被从节点中驱逐。可以通过kubectl get event或kubectl describe pod 命令显示事件,查看Kubernetes集群中发生了哪些事件。执行这些命令后,默认情况下只会显示最近(1小时内)发生的事件。默认情况下 kubectl get events
并没有按照 events 发生的顺序进行排列,所以我们往往需要为其增加 --sort-by='{.metadata.creationTimestamp}'
参数来让其输出可以按时间进行排列。
由于Kubernetes的事件是一种资源对象,因此它们存储在Kubernetes API Server的Etcd集群中。为避免磁盘空间被填满,故强制执行保留策略:在最后一次的事件发生后,删除1小时之前发生的事件。
二、Kubernetes Event持久化方案
1、搭建sentry(略)
2、在sentry上创建项目
3、查看sentry DSN
4、准备自定义values.yaml文件
# Default values for sentry-kubernetes.
sentry:
#sentry DSN地址
dsn: http://****
#环境标识,自定义
environment: prod
logLevel: ~
# Sentry DSN config using an existing secret:
# existingSecret:
image:
repository: getsentry/sentry-kubernetes
tag: latest
pullPolicy: Always
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
serviceAccount:
# Specifies whether a ServiceAccount should be created
create: true
# The name of the ServiceAccount to use.
# If not set and create is true, a name is generated using the fullname template
name:
rbac:
# Specifies whether RBAC resources should be created
create: true
# Set priorityCLassName in deployment
# priorityClassName: ""
5、添加仓库
helm repo add googleapis-incubator https://kubernetes-charts-incubator.storage.googleapis.com
6、更新仓库信息
helm repo update
7、安装
helm upgrade --install sentry-kubernetes-events -f ./sentry-kubernetes-events.yaml googleapis-incubator/sentry-kubernetes --namespace tools
8、验证
kubectl get pods -n tools