kubernets基于容器日志的报警和服务自动恢复

demo地址

https://github.com/cclient/kubernetes-filebeat-collector

 

高可用还谈不上,是对kubernete一种服务异常重启恢复的补充方案

 

之前已经完成了kubernete的日志的收集,日志监控,没什么好说的 kibana grafana都是很成熟的ui产品,也都支持elasticsearch数据源

 

主要关注点是报警及报警信息的应用

 

kibana基础版本不支持报警,es 产品x-pack支持报警,但这东西收费,所以不考虑

 

有es报警的部分产品 如ElastAlert,不知是否支持es6.3,暂时不考虑

 

而grafana本身也支持报警 alerting

 

结合grafana本身的ui,效果很不错,同时支持多种alert 规则,其中包含webhook,webhook的定制能力很强,可以在接收到报警日志后作一些自定义的事情

 

由于grafana已经可用,这里选型grafana作测试

 

 

kubernetes 的 liveness probe 功能有限

 

如 kube的 liveness probe 如http 是监听端口是否可用,有时会有这样的情况,服务的状态还可用,但已经无法完成有效的业务处理

 

比如,web服务可用,端口正常监听,但web服务依赖的后端服务出问题了,实际所有请求处理都失败(日志状态会区别于正常服务),这种情况kube默认的liveness probe 规则是无法察觉的,需要作更进一步的定制。

 

而如果根据为每个服务定制专用的liveness probe服务,成本比较高,也会对原项目有较高的侵入性

 

我们可以采用基于日志来间接判断服务状态的方案,虽然不是100%准确,但侵入小,适用面广,可以作为一个基础的方案,对准确性有更高要求的再后续定制

 

结合kubernetes的liveness probe,可以实现基于日志状况,报警,并重启服务

 

实现起来并不复杂

 

deploy->filebeat日志收集->写入es->grafana ui->grafana alerting 日志触发报警规则(例,10分钟内count数为0)-> webhook接收报警 -> 记录当前服务状态为失效

 

另外部署一套服务,查询服务状态

 

liveness probe 检查服务状态,若返回当前服务失效,则k8会自动重启服务

 

这样的流程,作为对kube liveness的简单补充

 

功能已经实现完成

 

服务状态持久化,选择简单的redis

 

而服务状态的api实现,这里直接用webhook(golang 实现的运维工具),配置规则即可,没必要另外开发

 

grafana 报警规则的配置,文字也不好说明,直接看图


启动服务时 kubernetes-init
del key

 

检查服务状态 kubernetes-liveness
exists key

 

webhook收到报警 grafana-redis-alert
set key 1

 

最后yml示例

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: consume
  namespace: default
  labels:
    app: consume
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: consume
    spec:
      containers:
      - name: consume
        imagePullPolicy: Always
        image: cuidapeng/busybox-curl:v0.1
        # del consume 
        command: ['sh', '-c', 'curl http://alert_hook_server:9000/hooks/kubernetes-init?contain=consume && echo The app is running! && sleep 3600']
        livenessProbe:
           exec:
             command: ['sh', '-c', 'return $(curl -fsSL http://alert_hook_server:9000/hooks/kubernetes-liveness?contain=consume)']
           initialDelaySeconds: 5
           periodSeconds: 5
      initContainers:
      - name: init-myservice
        image: cuidapeng/busybox-curl:v0.1
        command: ['sh', '-c', 'curl http://alert_hook_server:9000/hooks/kubernetes-init?contain=consume;']

posted @ 2018-08-05 17:43  cclient  阅读(337)  评论(0编辑  收藏  举报