事件监控是Kubernetes中的另一种监控方式,可以弥补资源监控在实时性、准确性和场景上的缺欠。Kubernetes的架构设计是基于状态机的,不同的状态之间进行转换则会生成相应的事件,正常的状态之间转换会生成Normal等级的事件,正常状态与异常状态之间的转换会生成Warning等级的事件。开发者可以通过获取事件,实时诊断集群的异常与问题。

背景信息

kube-eventer是阿里云容器服务维护的开源Kubernetes事件离线工具,可以将集群的事件离线到钉钉、SLS等系统,并提供不同等级的过滤条件,实现事件的实时采集、定向告警、异步归档。更多内容请参见kube-eventer

通过以下三种场景为您介绍事件监控。

场景1:使用钉钉实现Kubernetes监控告警

使用钉钉机器人监控并告警Kubernetes的事件是一个非常典型的ChatOps实现。具体的操作步骤如下:

  1. 单击钉钉群右上角群设置图标,进入群设置页面。
  2. 单击群机器人,进入群机器人页面,选择需要添加的机器人。此处选择自定义机器人。

    自定义机器人
  3. 机器人详情页面,单击添加,进入添加机器人页面。

    添加机器人
  4. 根据如下信息配置群机器人后,单击完成添加
    配置 说明
    编辑头像 (可选)为群机器人设置头像。
    机器人名字 添加的机器人名称。
    添加到群组 添加机器人的群组。
    是否开启Outgoing机制 (可选)通过@群机器人,将消息发送到指定外部服务,还可以将外部服务的响应结果返回到群组。
    说明 建议不开启。
    POST 地址 接收消息的HTTP服务地址。
    说明 当选择开启Outgoing机制时,此项可配置。
    Token 用于验证请求来自钉钉的密钥。
    说明 当选择开启Outgoing机制时,此项可配置。
  5. 单击复制,复制webhook地址。

    复制webhook
    说明群机器人页面,选择目标群机器人,单击右侧设置按钮图标可以:
    • 修改群机器人的头像及机器人名字。
    • 开启关闭消息推送。
    • 重置webhook地址。
    • 删除群机器人。

    设置机器人
  6. 登录容器服务管理控制台
  7. 在Kubernetes菜单下,单击左侧导航栏中的应用 > 无状态,进入 无状态(Deployment)页面。
  8. 选择目标集群,命名空间选为kube-system,单击右上角使用模板创建
    创建应用
  9. 根据以下信息配置模板,完成后单击创建
    配置 说明
    集群 选择目标集群。
    命名空间 选择资源对象所属的命名空间,默认是 default。此处选择kube-system
    示例模板 阿里云容器服务提供了多种资源类型的 Kubernetes yaml 示例模板,让您快速部署资源对象。您可以根据 Kubernetes Yaml 编排的格式要求自主编写,来描述您想定义的资源类型。此处选择自定义
    模板 填写以下自定义内容:
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: eventer
      namespace: kube-system
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            task: monitoring
            k8s-app: eventer
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ''
        spec:
          serviceAccount: admin
          containers:
          - name: eventer
            image: registry.cn-hangzhou.aliyuncs.com/acs/eventer:v1.6.0
            imagePullPolicy: IfNotPresent
            command:
            - /eventer
            - --source=kubernetes:https://kubernetes.default
            - --sink=dingtalk:[your_webhook_url]&label=[your_cluster_id]&level=[可选参数:Normal或者Warning,默认值为:Warning]      #level可配置为:Normal或Warning,默认值为:Warning。当配置Normal时,会在钉钉群收到Normal和Warning级别的告警;不配置或配置为Warning时,钉钉群仅收到Warning级别的告警。
    集群列表页面选择目标集群,单击操作列控制台,进入Kubernetes 控制台,选择命名空间kube-system,单击左侧导航栏部署,可查看到eventer已部署成功。
    部署eventer

预期结果:

部署成功后30s,eventer生效,当事件等级超过阈值等级时,即可在钉钉群收到如下告警。
消息提醒

场景2:使用SLS离线Kubernetes事件

SLS(Log Service)可以将Kubernetes的事件以更持久的方式进行存储,从而提供更多的事件归档、审计的能力。具体的操作步骤如下:

  1. 创建project与logstore。
    1. 登录 日志服务管理控制台
    2. 单击页面右上角的创建 Project,填写 Project 的基本信息并单击确认进行创建。
      本示例创建一个名为 k8s-log4j,与 Kubernetes 集群位于同一地域(华东 1)的 Project。
      说明 在配置时,一般会使用与 Kubernetes 集群位于同一地域的日志服务 Project。因为当 Kubernetes 集群和日志服务 Project 位于同一地域时,日志数据会通过内网进行传输,从而避免了因地域不一致而导致的数据传输外网带宽费用和耗时,从而实现实时采集、快速检索的最佳实践。

      创建project
    3. 创建完成后,k8s-log4j 出现在 project 列表下,单击该 project 名称,进入 project 详情页面。
    4. 默认进入日志库页面,单击右上角的创建

      创建k8s log
    5. 填写日志库配置信息并单击确认
      本示例创建名为 k8s-logstore 的日志库。

      创建logstore
    6. 创建完毕后,页面会提示您创建数据接入向导。

      消息提醒
    7. 选择自定义数据下的log4jAppender,根据页面引导进行配置。
      本示例使用了默认配置,您可根据日志数据的具体使用场景,进行相应的配置。

      自定义数据
  2. 在 Kubernetes 集群中配置 log4j。
    1. 连接到您的 Kubernetes 集群。
    2. 获取demo-deployment.yaml文件并配置环境变量 JAVA_OPTS 设置 Kubernetes 集群日志的采集。
      demo-deployment.yaml 文件的示例编排如下。
      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata:
        name: kube-eventer
        namespace: kube-system
      spec:
        replicas: 1
        template:
          metadata:
            labels:
              task: monitoring
              k8s-app: kube-eventer
            annotations:
              scheduler.alpha.kubernetes.io/critical-pod: ''
          spec:
            serviceAccount: admin
            containers:
            - name: kube-eventer
              image: registry.cn-hangzhou.aliyuncs.com/acs/kube-eventer-amd64:v1.0.0-d9898e1-aliyun
              imagePullPolicy: IfNotPresent
              command:
              - /kube-eventer
              - --source=kubernetes:https://kubernetes.default
              - --sink=sls:https://sls.aliyuncs.com?logStore=[your_logstore]&project=[your_project]
      其中:
      • project:您所使用的阿里云日志服务 Project 的名称。本示例中为 k8s-log4j。
      • logStore:您所使用的阿里云日志服务 Logstore 的名称。本示例中为 k8s-logstore。
    3. 在命令行中执行以下命令,创建 deployment。
      kubectl create -f demo-deployment.yaml
    4. 获取demo-Service.yaml文件,并运行以下命令创建 service。
      您不需要修改demo-Service.yaml中的配置。
      kubectl create -f demo-service.yaml
  3. 操作集群(例如,删除Pod或者创建应用等)产生事件后,登录日志服务控制台查看数据采集。请参见控制台预览

    查看采集数据
  4. 设置索引与归档。请参见开启并配置索引
    1. 在日志服务控制台单击Project名称。
    2. 查询分析列,单击查询
    3. 单击右上角的开启索引

      开启索引
    4. 从右侧滑出查询分析页面,指定字段并进行配置。

      查询分析
    5. 单击确定
      此时会出现日志查询与分析页面。
      日志分析页面
      说明
      • 索引配置在1分钟之内生效。
      • 开启或修改索引后,新的索引配置只对新写入的数据生效。
    6. 如果您需要设置离线归档与计算的场景,可以在logstore上面将数据投递给MaxCompute或者OSS。请参见通过日志服务投递日志到MaxCompute投递日志到OSS

场景3:使用node-probelm-detector与eventer实现节点异常告警

node-problem-detector是Kubernetes节点诊断的工具,可以将节点的异常,例如:Docker Engine Hang、Linux Kernel Hang、网络出网异常、文件描述符异常转换为Node的事件,集合kube-eventer可以实现节点事件告警的闭环。具体的操作步骤如下:

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,在左侧导航栏选择市场 > 应用目录,在右侧选中ack-node-probelm-detector

    应用目录
  3. 应用目录 - ack-node-probelm-detector中,单击参数,可以看到node-problem-detector的默认配置。

    配置页面
    您可以参考以下参数说明,配置kube-eventer的离线通道。
    表 1. 参数说明
    参数 说明 默认值
    npd.image.repository npd的镜像地址 registry.cn-beijing.aliyuncs.com/acs/node-problem-detector
    npd.image.tag npd的镜像tag v0.6.3-16-g30dab97
    alibaba_cloud_plugins 开启阿里云插件的列表 fd_check
    eventer.image.repository eventer的镜像地址 registry.cn-hangzhou.aliyuncs.com/acs/eventer
    eventer.image.tag eventer的镜像tag v1.6.0-4c4c66c-aliyun
    eventer.image.pullPolicy eventer的镜像下载方式 IfNotPresent
    eventer.sinks.sls.enabled 是否开启eventer sls的离线链路 false
    eventer.sinks.sls.project 日志服务的project名称 -
    eventer.sinks.sls.logstore 日志服务的project下logstore的名称 -
    eventer.sinks.dingtalk.enabled 是否开始eventer 钉钉的离线链路 false
    eventer.sinks.dingtalk.level 事件离线的等级 warning
    eventer.sinks.dingtalk.label 打印事件的额外标签 -
    eventer.sinks.dingtalk.token 过滤的资源类型 -
    eventer.sinks.dingtalk.monitorkinds 过滤的资源命名空间 -
    eventer.sinks.dingtalk.monitornamespaces 钉钉机器人的Token -
  4. 在右侧的创建页面,在右侧选择对应的集群,同时可以看到命名空间已设定为 istio-system,发布名称已设定为ack-node-probelm-detector,然后单击创建
    单击应用 > 容器组,选择目标集群和命名空间,在容器组列表中可以看到守护进程集中的ack-node-problem-detector-daemonset运行正常。
    daemonset
此时node-problem-detector与eventer都正常运行后,可以通过配置的eventer的离线通道进行数据的离线或者报警。