zoukankan      html  css  js  c++  java
  • 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;']

  • 相关阅读:
    C++文件流类与文件流对象
    当java出现异常,应如何进行处理
    C语言函数的声明以及函数原型
    MySQL的create table as 与 like区别
    java中BigDecimal加减乘除基本用法
    项目小结
    自动化测试 如何快速提取Json数据
    Java Map 集合类在selenium自动化测试设计中的应用
    UFT对于PDF 文档的操作方法 VBS代码
    Selenium 自动化测试中对页面元素的value比较验证 java语言
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/9426517.html
Copyright © 2011-2022 走看看