本文介绍如何监控k8s服务层event及报警

问题

应用或服务部署到k8s集群时,首先会经过k8s的调度,这个过程可能会出现一些问题,比如 volume 无法正常挂载,没有足够的资源部署服务,服务异常退出等。

如何及时了解这些问题,保证服务正常运行?

监控层级

监控k8s集群,大致分为下面3个层级:

Yz3BuD.png

应用或服务部署到k8s集群时,k8s服务层会产生一系列的event事件,通过监控这些事件的类型,可以掌握服务状况

k8s event

k8s event是一种资源类型,当其他资源具有状态更改,错误或应向系统广播的其他消息时,会自动创建该资源类型。在调试Kubernetes集群中的问题时,它们是重要的渠道。

通过 kubectl get events 指令,可以看到集群当前的部分事件列表:

event源代码也可以看到有哪些event类型

type=Normal的event相当于应用层的 log.Info,比较有用的信息是 type=Warning的,可以加上过滤条件:

kubectl get events --field-selector type=Warning

可以通过Reason栏位看到更详细的信息,通过此栏位,可以根据我们服务的实际情况,来筛选出需要监控和报警的event

event 收集

使用kubernetes-event-exporter,可以方便的在k8s集群部署event收集服务并将其发送到 elasticsearch。

需要注意的是,目前该工具使用的是 elasticsearch 7.x 的api,并不兼容以下的版本。

使用 grafana 监控 event 和设定报警

在grafana中设定好 elasticsearch 的 source,然后在dashboard中建立Graph 图表(Grafana的Alert功能目前只支持 Graph 图表)。

可以通过下面两个指标来设定报警:

  • type.keyword
  • reason.keyword

type

部分值:

  • Warning
  • Normal

Warning基本上就是k8s的调度没有按照预期执行,只要有该类型的event,就可以发出alert

reason

部分值:

  • UPDATE
  • SuccessfulDelete
  • SuccessfulCreate
  • Started
  • Scheduled
  • ScalingReplicaSet
  • SawCompletedJob
  • Pulling
  • Pulled
  • Killing
  • FailedMount
  • Failed
  • Created
  • BackOff

可以根据服务的场景来确定需要alert的reason

Alert设定

  1. 在Panel中添加query:_index:[index-name] AND type:Warning
  2. Visualization选择graph
  3. Alert
    1. Rule设定规则,Evaluate every 1m For 2m,表示每1分钟计算一次,第3次计算仍然满足报警条件,则发出Alert
    2. Conditions设定报警条件,WHEN avg () OF query (A, 5m, now) IS ABOVE 0,表示检查5分钟内是否有Warning的Event
    3. Notifications设定Alert渠道,可以用webhook来发送消息到Server酱,调试webhook可以用在线工具webhook.site

参考