Event 是集群中某个事件的报告。它一般表示系统的某些状态变化,用于告诉我们集群内发生了什么。k8s集群中的各个组件会将运行时发生的各种事件上报给apiserver 。api-server 会将Event事件存在master的etcd中,为避免etcd内存空间的浪费,event默认只保留最近1小时的事件。
以pod创建为例:
我们创建了一个pod后,可以从event中看到这个pod详细的创建过程,一共经历了 Scheduled , Pulling, Pulled, Created, Started 等阶段。如果某一个环节出了问题,我们可以很方便地感知到。
注:
Scheduled : 表示该pod已经被成功调度到一台node节点上。
Pulling:表示正在拉取容器镜像。
Pulled: 表示容器的镜像已经被成功拉取下来。
created: 表示容器GitHub已经被成功创建出来。
stared: 表示容器已经被成功启动起来了。
k8s event 一定是和某个资源对应起来的,我们可以查看具体某个资源的event,也可以查看整个namespace下所有资源的events。
方法:kubectl describe 资源类型 资源实例
①查看pod事件
#] kubectl describe pod pod-name
②查看hpa的事件
#] kubectl describe hpa hpa-name
#] kubectl get event -n php-app "gxxx-xxxs-hpa.17834ddfc52766a6" -ojson 以json格式查看具体某一条event事件
上述事件含义:
①这是一条Warning类型的事件,是hpa触发的
②具体是php-app 命名空间下的gxx-xxes-hpa 这个hpa触发,触发原因是 获取资源指标数据失败,详细信息是 获取该hpa管理的pod的内存的request值失败
方式:kubectl get events -n xxx, 查看xxx 命名空间下的所有events事件
使用命令行查看events事件很不方便,而且只保留最近1小时的事件,不足以我们排查一小时前的问题。所以我们需要将这些事件采集下来,存放在日志系统里,方便我们排查问题。
1. 阿里云开源的kube-eventer工具 采集Kubernetes事件,Kubernetes事件采集相关源码请参见GitHub。
2. Opsgenie开源的kubernetes-event-exporter,采集方法参考《 如何用Loki来分析Kubernetes事件 》, 相关源码请参见GitHub
以自建集群采集event事件到阿里云SLS日志系统为例:
通过插件即可部署:
参考:https://help.aliyun.com/zh/sls/user-guide/create-and-use-an-event-center?spm=a2c4g.11186623.0.0.b3324496WsMa1Q#task-2389213
参考链接:https://help.aliyun.com/zh/sls/user-guide/collect-kubernetes-events
1.新建logstore
name: k8s-event
2.申请阿里云的ak/sk
用于投递日志到sls,需要sls的权限
需配置以下参数:endpoint、project、logStore、regionId、internal、accessKeyId和accessKeySecret
替换deployment 的 -sink= 参数后面的内容
检查
]$ kubectl get pod -n kube-system | grep kube-eventer
kube-eventer-76f976ff7c-glm2n 1/1 Running 0 106m
查看logstore 里event 事件
每一条event事件信息都是一个json文件,有标准的字段信息,它可以非常清晰地告诉我们:该事件类型,什么资源在什么时间发了什么事情,原因是什么?
其结构如下:
单条event事件
采集到日志系统之后
该事件含义:
①这是一条Warning类型的事件,是hpa触发的;
②具体是php-app 命名空间下的gxx-xxes-hpa 这个hpa触发,触发原因是 获取资源指标数据失败,详细信息是 获取该hpa管理的pod的内存的request值失败。
字段说明:
EventId.involvedObject.namespace: 该事件产生的命名空间
EventId.involvedObject.name: 该事件产生的具体的资源, 上图中"gxxx-xxxxes-hpa"是实际配置的hpa名字
EventId.reason: 该事件产生的原因,我们需要关注的是带有fail字样的。
EventId.message: 该事件产生的详细信息
EventId.source.component: 该事件产生的组件
EventId.firstTimestamp: 该事件产生的开始时间
EventId.lastTimestamp: 该事件最近一次产生的时间
EventId.count: 该事件从最开始产生到当前的次数
EventId.type: 该事件的类型
1.Type: 事件的类型,当前k8s里只有 Normal, Warning两种类型。Normal一般是提示性消息,我们需要关注的是Warning类型
2.Reason:事件产生的原因有非常多,我们需要关注的带有faile字样的类型。可以在sls过滤全部带有fail的内容。(见下表:k8s event 事件Reason 及含义 )
3.component: 事件产生的组件
4.count: 事件产生的数量
表:k8s event 事件Reason 及含义
检查内容及作用:
第一部分、总览:查看事件总数趋势,其中Warning 类型的数量是否突增或持续增加,产生Warning事件最多的是哪些Reason;
第二部分、分组件统计:
①node相关event: 可能出现node 未就绪,node磁盘空间不足,pid不足等;
③pod相关event: 可能出现调度失败,拉起镜像失败,启动失败等;
④容器相关event: 可能出现重启,健康探测失败等。
第三部分、 原始event信息:更详细的内容输出,及时发现上述看板未能覆盖到的内容。
第一部分:总览
第二部分:分组件统计
第三部分:原始event信息
只有Normal, Warning两种类型,参考源码:
https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/api/core/v1/types.go#L6206
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/events/event.go
采集Kubernetes事件:
https://help.aliyun.com/zh/sls/user-guide/collect-kubernetes-events#concept-g4y-nky-ngb
GitHub:
https://github.com/AliyunContainerService/heapster/tree/master/events
如何用Loki来分析Kubernetes事件:
https://cloud.tencent.com/developer/article/1822966
GitHub:
https://github.com/opsgenie/kubernetes-event-exporter
扫码关注 了解更多