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;']

  • 相关阅读:
    什么是ORM
    ORM优缺点
    Azure 中快速搭建 FTPS 服务
    连接到 Azure 上的 SQL Server 虚拟机(经典部署)
    在 Azure 虚拟机中配置 Always On 可用性组(经典)
    SQL Server 2014 虚拟机的自动备份 (Resource Manager)
    Azure 虚拟机上的 SQL Server 常见问题
    排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
    上传通用化 VHD 并使用它在 Azure 中创建新 VM
    排查在 Azure 中新建 Windows VM 时遇到的部署问题
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/9426517.html
Copyright © 2011-2022 走看看