cover_image

如何从k8s event发现集群内的问题

陈兴 三七互娱技术团队 2024年02月08日 10:00
01

k8s event是什么?

图片
图片

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:  表示容器已经被成功启动起来了。

02

查看k8s event

图片
图片

k8s event 一定是和某个资源对应起来的,我们可以查看具体某个资源的event,也可以查看整个namespace下所有资源的events。

查询具体某个资源的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值失败

查看某个命名空间下的所有events

方式:kubectl get events -n xxx, 查看xxx 命名空间下的所有events事件

图片
03

将events事件采集到日志系统

图片
图片

使用命令行查看events事件很不方便,而且只保留最近1小时的事件,不足以我们排查一小时前的问题。所以我们需要将这些事件采集下来,存放在日志系统里,方便我们排查问题。

工具和方法

1. 阿里云开源的kube-eventer工具 采集Kubernetes事件,Kubernetes事件采集相关源码请参见GitHub

2. Opsgenie开源的kubernetes-event-exporter,采集方法参考《 如何用Loki来分析Kubernetes事件 》, 相关源码请参见GitHub


采集k8s event到sls日志系统

图片

以自建集群采集event事件到阿里云SLS日志系统为例:

阿里云k8s集群

通过插件即可部署:
参考:https://help.aliyun.com/zh/sls/user-guide/create-and-use-an-event-center?spm=a2c4g.11186623.0.0.b3324496WsMa1Q#task-2389213

非阿里云k8s集群

参考链接:https://help.aliyun.com/zh/sls/user-guide/collect-kubernetes-events

1.新建logstore
name: k8s-event

2.申请阿里云的ak/sk
用于投递日志到sls,需要sls的权限

部署kube-eventer 采集

需配置以下参数: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 事件

图片
04

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: 该事件的类型

05

如何发现集群问题

图片
图片

我们需要关注的事件

1.Type: 事件的类型,当前k8s里只有 Normal, Warning两种类型。Normal一般是提示性消息,我们需要关注的是Warning类型

2.Reason:事件产生的原因有非常多,我们需要关注的带有faile字样的类型。可以在sls过滤全部带有fail的内容。(见下表:k8s event 事件Reason 及含义 )

3.component: 事件产生的组件

4.count: 事件产生的数量


表:k8s event 事件Reason 及含义

图片

制作grafana看板,确定好检查内容和看板结构

检查内容及作用:

第一部分、总览:查看事件总数趋势,其中Warning 类型的数量是否突增或持续增加,产生Warning事件最多的是哪些Reason;

第二部分、分组件统计

①node相关event: 可能出现node 未就绪,node磁盘空间不足,pid不足等;

③pod相关event: 可能出现调度失败,拉起镜像失败,启动失败等;

④容器相关event: 可能出现重启,健康探测失败等。

第三部分、 原始event信息:更详细的内容输出,及时发现上述看板未能覆盖到的内容。


看板

图片

第一部分:总览

图片

第二部分:分组件统计

图片

第三部分:原始event信息

图片
06

附录

图片
图片

k8s当前已有的事件类型

只有Normal, Warning两种类型,参考源码:

https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/api/core/v1/types.go#L6206 

图片

从k8s源码查询更多其他的事件原因

https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/events/event.go

图片

阿里云开源的kube-eventer工具采集Kubernetes事件

采集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 

Opsgenie开源的kubernetes-event-exporter工具采集事件

如何用Loki来分析Kubernetes事件:

https://cloud.tencent.com/developer/article/1822966 

GitHub

https://github.com/opsgenie/kubernetes-event-exporter


END



三七互娱技术团队

扫码关注 了解更多

图片

继续滑动看下一个
三七互娱技术团队
向上滑动看下一个