一、概述
kube-eventer是ACK维护的开源Kubernetes事件离线工具,可以将集群的事件离线到钉钉、SLS、EventBridge等系统,并提供不同等级的过滤条件,实现事件的实时采集、定向告警、异步归档。
1、概念
kubernetes的核心设计理念是状态机。因此,Normal
当转移到期望状态时会发生事件,而Warning
当转移到非预期状态时会发生事件。 kube-eventer 可以帮助诊断、分析和报警问题。
2、架构图
二、envent
我们需要再了解一下event的概念,在k8s中,事件(evnet)也是一种资源对象,主要用于展示集群内发生的事件,然后将运行的事件发送给API server,再有APIserver保存到etcd中,为了避免,etcd中的数据量过多,默认会保留最近一个小时内的事件(event)。
1、事件类型
-
Faild events(错误事件)
当yaml文件语法错误、拉取镜像错误等
-
Evicted events(驱逐事件)
节点发生oom时触发
-
Faild scheduling events(错误调度事件)
因为资源不足、污点等无法调度
-
Volume events(卷事件)
配置模式不正确,或者网络等原因无法创建卷的情况
-
Node events(节点事件)
节点因为不可抗拒等原因与集群失联
2、事件级别
三、配置kube-eventer
需要配置集群角色以及角色绑定的配置文件,kube-eventer以deployment的形式部署在集群内,默认放在kube-system名称空间下,
我配置的为飞书告警,新增了namespace和podname等信息,可以更加清晰;
其他告警方式请参考github:https://github.com/AliyunContainerService/kube-eventer/tree/master
如果没有特别的需求,只需要将飞书机器人的webhook替换即可
例如:
--sink=webhook:https://open.feishu.cn/open-apis/bot/v2/hook/<你自己的机器人地址>?level=Warning&method=POST&header=Content-Type=application/json&custom_body_configmap=custom-body&custom_body_configmap_namespace=kube-system
1、具体的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:v1.2.7-ca03be0-aliyun
name: kube-eventer
command:
- "/kube-eventer"
- "--source=kubernetes:https://kubernetes.default"
## .e.g,dingtalk sink demo
- --sink=webhook:https://open.feishu.cn/open-apis/bot/v2/hook/<你自己的机器人地址>?level=Warning&method=POST&header=Content-Type=application/json&custom_body_configmap=custom-body&custom_body_configmap_namespace=kube-system
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:
- configmaps
- 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
---
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-body
namespace: kube-system
data:
content: '{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"header": {
"title": {
"tag": "plain_text",
"content": "Kube-eventer"
},
"template": "Red"
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "**EventType:** {{ .Type }}\n**Name:** {{ .InvolvedObject.Name }}\n**NameSpace:** {{ .InvolvedObject.Namespace }}\n**EventKind:** {{ .InvolvedObject.Kind }}\n**EventReason:** {{ .Reason }}\n**EventTime:** {{ .LastTimestamp }}\n**EventMessage:** {{ .Message }}"
}
}
]
}
}'
2、飞书展示
3、Webhook 参数
level
- 事件级别(可选。默认:警告。选项:警告和正常)namespaces
- 要过滤的命名空间(可选。默认值:所有命名空间,使用逗号分隔多个命名空间,支持正则表达式模式)kinds
- 过滤种类(可选。默认:所有种类,使用逗号分隔多种。选项:Node、Pod 等。)reason
- 过滤原因(可选。默认值:空,正则表达式模式支持)。您可以在查询中使用多原因字段。method
- 发送请求的方法(可选。默认值:GET)header
- 请求中的标头(可选。默认值:空)。您可以在查询中使用多标头字段。custom_body_configmap
- 请求正文模板的配置映射名称。您可以使用模板来自定义请求正文。 (选修的。)custom_body_configmap_namespace
- 请求正文模板的 configmap 命名空间。 (选修的。)