集群事件监控之 kube-eventer
# 一、背景
在 Kubernetes 中,事件分为两种,一种是 Warning 事件,表示产生这个事件的状态转换是在非预期的状态之间产生的;另外一种是 Normal 事件,表示期望到达的状态,和目前达到的状态是一致的。我们用一个 Pod 的生命周期进行举例,当创建一个 Pod 的时候,首先 Pod 会进入 Pending 的状态,等待镜像的拉取,当镜像录取完毕并通过健康检查的时候,Pod 的状态就变为 Running。此时会生成 Normal 的事件。而如果在运行中,由于 OOM 或者其他原因造成 Pod 宕掉,进入 Failed 的状态,而这种状态是非预期的,那么此时会在 Kubernetes 中产生 Warning 的事件。那么针对这种场景而言,如果我们能够通过监控事件的产生就可以非常及时的查看到一些容易被资源监控忽略的问题。
一个标准的 Kubernetes 事件有如下几个重要的属性,通过这些属性可以更好地诊断和告警问题。
- Namespace:产生事件的对象所在的命名空间。
- Kind:绑定事件的对象的类型,例如:Node、Pod、Namespace、Componenet 等等。
- Timestamp:事件产生的时间等等。
- Reason:产生这个事件的原因。
- Message: 事件的具体描述。
- 其他信息
阿里有开源的 K8s 事件监控项目 kube-eventer, 其将事件分为两种,一种是 Warning 事件,表示产生这个事件的状态转换是在非预期的状态之间产生的;另外一种是 Normal 事件,表示期望到达的状态,和目前达到的状态是一致的。
可以收集 pod/node/kubelet 等资源对象的 event,还可以收集自定义资源对象的 event,汇聚处理发送到配置好好的接受端,架构图如下所示。
目前支持的 sinks 如下:
Sink Name | Description |
---|---|
dingtalk (opens new window) | sink to dingtalk bot |
sls (opens new window) | sink to alibaba cloud sls service |
elasticsearch (opens new window) | sink to elasticsearch |
honeycomb (opens new window) | sink to honeycomb |
influxdb (opens new window) | sink to influxdb |
kafka (opens new window) | sink to kafka |
mysql (opens new window) | sink to mysql database |
wechat (opens new window) | sink to wechat |
# 二、安装部署
这里以钉钉为例
# 2.1、创建钉钉机器人
只要是管理员,在钉钉群聊中就可以创建。具体过程略。
# 2.2、部署资源
YAML 文件是官方文档中文件,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: kube-eventer
name: kube-eventer
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kube-eventer
template:
metadata:
labels:
app: kube-eventer
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
spec:
dnsPolicy: ClusterFirstWithHostNet
serviceAccount: kube-eventer
containers:
- image: registry.aliyuncs.com/acs/kube-eventer-amd64:v1.1.0-c93a835-aliyun
name: kube-eventer
command:
- "/kube-eventer"
- "--source=kubernetes:https://kubernetes.default"
## .e.g,dingtalk sink demo
- --sink=dingtalk:[your_webhook_url]&label=[your_cluster_id]&level=[Normal or Warning(default)]
env:
# If TZ is assigned, set the TZ value as the time zone
- name: TZ
value: "Asia/Shanghai"
volumeMounts:
- name: localtime
mountPath: /etc/localtime
readOnly: true
- name: zoneinfo
mountPath: /usr/share/zoneinfo
readOnly: true
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 250Mi
volumes:
- name: localtime
hostPath:
path: /etc/localtime
- name: zoneinfo
hostPath:
path: /usr/share/zoneinfo
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-eventer
rules:
- apiGroups:
- ""
resources:
- events
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-eventer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-eventer
subjects:
- kind: ServiceAccount
name: kube-eventer
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-eventer
namespace: kube-system
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
需要修改的地方就是上面备注的地方。前提需要先得到顶顶机器人的参数。
- --sink=dingtalk:[your_webhook_url]&label=[your_cluster_id]&level=[Normal or Warning(default)]
dingtalk:机器人 webhook 地址
label:标签,自定义
level:报警级别,默认是 warning
msg_type:发送消息的格式
# 2.3、报警测试
如果是企业微信的话,配置文件按下面的修改:
--sink=wechat:?corp_id=wwxxxxxxxxxx1a&corp_secret=gxxxxxxxxxxxxxxxxxxxxxxxxxxx4U&agent_id=10xxxxxx7&to_user=&level=Warning&label=K8S-Alert-Prod&msg_type=markdown
项目地址:https://github.com/AliyunContainerService/kube-eventer (opens new window)