事件监控

事件监控是Kubernetes中的一种监控方式,可以弥补资源监控在实时性、准确性和场景上的不足。您可以通过使用NPD(node-problem-detector)结合SLS的Kubernetes事件中心、配置NPD集群检查项以及异常事件离线功能、使用钉钉、使用SLS离线Kubernetes事件及使用EventBridge离线Kubernetes事件,实时监控集群的异常与问题。

费用说明

ACK事件监控功能默认上报集群事件至SLS日志服务,SLS日志服务提供事件数据的存储、分析能力,默认90天内的ACK集群事件数据免费。详细信息,请参见创建并使用K8s事件中心

背景信息

Kubernetes的架构设计基于状态机,不同的状态之间进行转换会生成相应的事件,正常的状态之间转换会生成Normal等级的事件,正常状态与异常状态之间的转换会生成Warning等级的事件。

ACK提供开箱即用的容器场景事件监控方案,通过ACK维护的NPD以及包含在NPD中的kube-eventer提供容器事件监控能力。

image
  • NPD(node-problem-detector)是Kubernetes节点诊断的工具,可以将节点的异常,例如Docker Engine Hang、Linux Kernel Hang、网络出网异常、文件描述符异常转换为Node的事件,结合kube-eventer可以实现节点事件告警的闭环。更多信息,请参见NPD

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

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

场景一:使用NPD结合SLS的Kubernetes事件中心监控集群事件

NPD根据配置与第三方插件检测节点的问题或故障、生成相应的集群事件。而Kubernetes集群自身也会因为集群状态的切换产生各种事件,例如Pod驱逐、镜像拉取失败等异常情况。日志服务SLS(Log Service)的Kubernetes事件中心实时汇聚Kubernetes中的所有事件并提供存储、查询、分析、可视化、告警等能力。将集群事件接入日志服务的Kubernetes事件中心操作步骤如下。

步骤一:安装ack-node-problem-detector组件

  • 如果您在创建集群时,已选中安装node-problem-detector并创建事件中心,可直接按照步骤二查看Kubernetes事件中心。关于如何通过创建集群时安装NPD组件,请参见创建ACK托管集群

  • 若创建集群时未选中安装node-problem-detector并创建事件中心,则需手动安装,具体的操作步骤如下。

    1. 登录容器服务管理控制台

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

    3. 日志与监控页签,查找并安装ack-node-problem-detector

步骤二:查看事件中心

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 事件中心

  3. 单击右上角的事件中心管理,在K8s事件中心页面的左侧导航栏,单击目标集群名称左边的展开图标展开,查看Kubernetes事件中心相关信息。

    您可以查看Kubernetes事件的总览及详情、Pod生命周期,还可以进行自定义查询和告警配置。更多信息,请参见采集Kubernetes事件

场景二:配置NPD集群检查项以及异常事件离线功能

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

操作流程

  1. 安装ack-node-problem-detector组件,安装过程请参见安装ack-node-problem-detector组件

    说明

    若之前已安装过ack-node-problem-detector组件,请删除重新安装。具体操作,请参见如何重新安装ack-node-problem-detector组件

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 守护进程集

  3. 守护进程集页面,选择命名空间为kube-system,查看组件ack-node-problem-detector-daemonset运行正常。

    当node-problem-detector与eventer都正常运行后,可以通过配置的eventer的离线通道进行数据的离线处理或者报警。

NPD支持的问题检查插件

插件名

功能

说明

fd_check

检查集群节点系统的已打开的文件描述符是否超过最大上限的80%。

80%为默认值,可通过参数修改。该检查项消耗资源较多,不建议开启。

ram_role_check

检查集群节点是否具有RAM Role以及相应的鉴权密钥。

ntp_check

检查集群节点上的NTP时间同步服务是否正常运行。

默认开启项。

nvidia_gpu_check

检查集群节点上的NVIDIA GPU计算卡是否具有有效的xid

network_problem_check

检查集群节点上的conntrack表用量是否超过了总量的90%。

默认开启项。

inodes_usage_check

检查集群节点系统盘的inode是否超过了总量的80%。

80%为默认值,可通过参数修改。默认开启项。

csi_hang_check

检查集群节点上的CSI存储插件状态是否正常。

ps_hang_check

检查集群节点系统中是否有状态为D(挂起且无法唤醒)的进程。

public_network_check

检查集群节点是否可以访问公网。

irqbalance_check

检查集群节点系统中的irqbalance服务是否正常。

pid_pressure_check

检查集群节点系统中的进程pid数与系统内核中允许的pid最大数占比是否超过了85%。

默认开启项。

docker_offline_check

检测集群节点上的docker daemon服务是否正常。

默认开启项。

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

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

  1. 单击钉钉群右上角的群设置图标,进入群设置页面。

  2. 单击机器人,然后单击添加机器人,选择需要添加的机器人。此处选择自定义机器人。

    自定义机器人

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

    添加机器人

  4. 根据以下信息配置群机器人后,阅读并同意服务及免责条款,然后单击完成

    参数

    说明

    编辑头像

    (可选)为群机器人设置头像。

    机器人名字

    添加的机器人名称。

    添加到群组

    添加机器人的群组。

    安全设置

    安全设置支持3种方式:自定义关键词、加签和IP地址(段)。

    目前集群的事件监控仅支持第一种方式,即自定义关键词

    选中自定义关键词,填入Warning可接收所有监控报警。如果发现机器人消息发送过于频繁,可增加关键词进行过滤,最多支持设置10个关键词。ACK发送消息时也会同步此关键词。

  5. 单击复制,复制webhook地址以备后续使用。

    复制webhook

    说明

    群机器人页面,选择目标群机器人,单击右侧设置按钮图标可以进行以下操作:

    • 修改群机器人的头像及机器人名字。

    • 开启关闭消息推送。

    • 重置webhook地址。

    • 删除群机器人。

  6. 安装ack-node-problem-detector组件,安装过程请参见安装ack-node-problem-detector组件

    说明

    若之前已安装过ack-node-problem-detector组件,请删除重新安装,具体操作请参见如何重新安装ack-node-problem-detector组件

  7. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  8. 在Helm页面,找到ack-node-problem-detector组件,然后在组件对应的操作列单击更新,修改以下内容,然后单击确定

    • npd下方的enabled设置为false

    • eventer.sinks.dingtalk.enabled设置为true

    • 通过步骤5创建webhook地址查看Token,填入Token字段。

预期结果:

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

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

阿里云日志服务SLS(Log Service)可以将Kubernetes的事件以更持久的方式进行存储,从而提供更多的事件归档、审计的能力。详情请参见创建并使用K8s事件中心

  1. 创建Project与Logstore。

    1. 登录日志服务管理控制台

    2. Project列表区域,单击创建Project,填写Project的基本信息并单击确认进行创建。

      本示例创建一个名为k8s-log4j的Project,与Kubernetes集群位于同一地域(华东1)。

      说明

      为降低成本并提高效率,通常建议将日志服务与Kubernetes集群配置在同一地域。这样可以使日志数据通过内网进行传输,避免因地域不一致产生的外网数据传输费用,并减少传输延迟,实现日志的实时采集和快速查询。

    3. 创建完成后,k8s-log4j出现在Project列表下,单击该Project名称,进入Project详情页面。

    4. 默认进入日志库页面,在页面左侧,单击加号+,弹出创建Logstore对话框。

    5. 填写日志库配置信息并单击确定

      本示例创建名为k8s-logstore的日志库。

      image

    6. 创建完毕后,页面会提示您使用数据接入向导。单击数据接入向导,弹出接入数据对话框。

    7. 选择Log4j 1/2,根据页面引导进行配置。

      本示例使用了默认配置,您可根据日志数据的具体使用场景,进行相应的配置。

      自定义数据

  2. 在Kubernetes集群中配置log4j。

    1. 安装ack-node-problem-detector组件,安装过程请参见安装ack-node-problem-detector组件

    重要
    • 单击安装ack-node-problem-detector组件时,在配置项中将步骤1创建好的ProjectLogstore分别填入各字段。

    • 若之前已安装过ack-node-problem-detector组件,请删除重新安装,具体操作请参见如何重新安装ack-node-problem-detector组件

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

    2. Helm页面,找到ack-node-problem-detector组件,然后在组件对应的操作列单击更新,修改以下内容,然后单击确定

      • npd下方的enabled设置为false

      • eventer.sinks.sls.enabled设置为true

  3. 操作集群(例如,删除Pod或者创建应用等)产生事件后,登录日志服务控制台查看数据采集。请参见通过API消费

    查看采集数据

  4. 设置索引与归档。请参见创建索引

    1. 在日志服务控制台Project列表区域,单击Project名称。

    2. 单击日志库名称后的日志库管理图标图标,选择查询分析

    3. 单击右上角的开启索引

    4. 查询分析对话框中配置索引,然后单击确定

      此时会出现日志查询与分析页面。日志分析页面

      说明
      • 索引配置在1分钟之内生效。

      • 开启或修改索引后,新的索引配置只对新写入的数据生效。

    5. (可选)在需要设置离线归档与计算的场景下,在Logstore上将数据投递给MaxCompute或者OSS,请参见创建MaxCompute投递任务(新版)创建OSS投递任务(新版)

场景五:使用EventBridge离线Kubernetes事件

事件总线EventBridge是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用及SaaS应用以标准化、中心化的方式接入,并能够以标准化的CloudEvents 1.0协议在这些应用之间路由事件。容器服务事件可支持通过离线到EventBridge实现构建松耦合、分布式的事件驱动架构。关于EventBridge的详情,请参见什么是事件总线EventBridge

  1. 开通事件总线EventBridge。具体操作,请参见开通事件总线EventBridge并授权

  2. 安装ack-node-problem-detector组件,安装过程请参见安装ack-node-problem-detector组件

    说明

    若之前已安装过ack-node-problem-detector组件,请删除重新安装,具体操作请参见如何重新安装ack-node-problem-detector组件

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  4. Helm页面,定位ack-node-problem-detector组件,然后在组件对应的操作列单击更新,将eventer.sinks.eventbridge.enable修改为true,以配置事件中心并开启EventBridge事件离线数据链路,然后单击确定

    image

  5. 数据链路开启成功后,在事件总线EventBridge控制台查看容器事件。

    1. 登录事件总线EventBridge控制台
    2. 在左侧导航栏,单击事件总线
    3. 事件总线页面,单击目标总线名称。
    4. 在左侧导航栏,单击事件追踪
    5. 选择事件查询方式,设置查询条件,单击查询

    6. 在事件列表操作列,单击事件详情,查看事件详细内容。

      更多信息,请参见查询事件

如何重新安装ack-node-problem-detector组件

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 任务

  3. 任务页面,单击kube-eventer-init-v1.7-xxxx右侧更多,单击删除

  4. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  5. Helm页面,删除原有的ack-node-problem-detector组件。

  6. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  7. 日志与监控页签,查找并重新安装ack-node-problem-detector