如何从k8s event发现集群内的问题
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: 表示容器已经被成功启动起来了。
查看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事件
将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 事件
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 及含义
制作grafana看板,确定好检查内容和看板结构
检查内容及作用:
第一部分、总览:查看事件总数趋势,其中Warning 类型的数量是否突增或持续增加,产生Warning事件最多的是哪些Reason;
第二部分、分组件统计:
①node相关event: 可能出现node 未就绪,node磁盘空间不足,pid不足等;
③pod相关event: 可能出现调度失败,拉起镜像失败,启动失败等;
④容器相关event: 可能出现重启,健康探测失败等。
第三部分、 原始event信息:更详细的内容输出,及时发现上述看板未能覆盖到的内容。
看板
第一部分:总览
第二部分:分组件统计
第三部分:原始event信息
附录
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
三七互娱技术团队
扫码关注 了解更多