一、背景

在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,汇聚处理发送到配置好好的接受端,架构图如下所示。
arch.png

目前支持的sinks如下:

Sink Name Description
dingtalk sink to dingtalk bot
sls sink to alibaba cloud sls service
elasticsearch sink to elasticsearch
honeycomb sink to honeycomb
influxdb sink to influxdb
kafka sink to kafka
mysql sink to mysql database
wechat sink to wechat

二、安装部署

这里以钉钉为例

2.1、创建钉钉机器人

只要是管理员,在钉钉群聊中就可以创建。具体过程略。

2.2、部署资源

YAML文件是官方文档中文件,如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. name: kube-eventer
  6. name: kube-eventer
  7. namespace: kube-system
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: kube-eventer
  13. template:
  14. metadata:
  15. labels:
  16. app: kube-eventer
  17. annotations:
  18. scheduler.alpha.kubernetes.io/critical-pod: ''
  19. spec:
  20. dnsPolicy: ClusterFirstWithHostNet
  21. serviceAccount: kube-eventer
  22. containers:
  23. - image: registry.aliyuncs.com/acs/kube-eventer-amd64:v1.1.0-c93a835-aliyun
  24. name: kube-eventer
  25. command:
  26. - "/kube-eventer"
  27. - "--source=kubernetes:https://kubernetes.default"
  28. ## .e.g,dingtalk sink demo
  29. - --sink=dingtalk:[your_webhook_url]&label=[your_cluster_id]&level=[Normal or Warning(default)]
  30. env:
  31. # If TZ is assigned, set the TZ value as the time zone
  32. - name: TZ
  33. value: "Asia/Shanghai"
  34. volumeMounts:
  35. - name: localtime
  36. mountPath: /etc/localtime
  37. readOnly: true
  38. - name: zoneinfo
  39. mountPath: /usr/share/zoneinfo
  40. readOnly: true
  41. resources:
  42. requests:
  43. cpu: 100m
  44. memory: 100Mi
  45. limits:
  46. cpu: 500m
  47. memory: 250Mi
  48. volumes:
  49. - name: localtime
  50. hostPath:
  51. path: /etc/localtime
  52. - name: zoneinfo
  53. hostPath:
  54. path: /usr/share/zoneinfo
  55. ---
  56. apiVersion: rbac.authorization.k8s.io/v1
  57. kind: ClusterRole
  58. metadata:
  59. name: kube-eventer
  60. rules:
  61. - apiGroups:
  62. - ""
  63. resources:
  64. - events
  65. verbs:
  66. - get
  67. - list
  68. - watch
  69. ---
  70. apiVersion: rbac.authorization.k8s.io/v1
  71. kind: ClusterRoleBinding
  72. metadata:
  73. name: kube-eventer
  74. roleRef:
  75. apiGroup: rbac.authorization.k8s.io
  76. kind: ClusterRole
  77. name: kube-eventer
  78. subjects:
  79. - kind: ServiceAccount
  80. name: kube-eventer
  81. namespace: kube-system
  82. ---
  83. apiVersion: v1
  84. kind: ServiceAccount
  85. metadata:
  86. name: kube-eventer
  87. namespace: kube-system

需要修改的地方就是上面备注的地方。前提需要先得到顶顶机器人的参数。

  1. - --sink=dingtalk:[your_webhook_url]&label=[your_cluster_id]&level=[Normal or Warning(default)]

dingtalk:机器人webhook地址 label:标签,自定义 level:报警级别,默认是warning msg_type:发送消息的格式

2.3、报警测试

image.png
如果是企业微信的话,配置文件按下面的修改:

  1. --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