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

背景信息

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

ACK提供开箱即用的容器场景事件监控方案,通过ACK维护的NPD(node-problem-detector)以及包含在NPD中的kube-eventer提供容器事件监控能力。 事件监控关系图
  • 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事件中心操作步骤如下。

方法一:如果您在创建集群时,已选中安装node-problem-detector并创建事件中心,请按照以下步骤查看Kubernetes事件中心。关于通过创建集群,安装node-problem-detector并创建事件中心的详细信息,请参见创建Kubernetes托管版集群

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 选择运维管理 > 事件中心
  5. 单击右上角的事件中心管理,在K8s事件中心页面左侧导航栏,单击目标集群名称左边的展开图标展开,查看Kubernetes事件中心相关信息。
    您可以查看Kubernetes事件的总览及详情、Pod生命周期,还可以进行自定义查询及告警配置。 事件总览

方法二:如果您在创建集群时,未配置事件中心功能,请按照以下步骤使用Kubernetes事件中心。

  1. 对被监控集群安装NPD并激活SLS功能。具体安装步骤,请参见场景三:使用钉钉实现Kubernetes监控告警
    说明 如果您已安装NPD但未激活SLS,请先卸载旧版本。
    1. 在控制台左侧导航栏中,单击集群
    2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 选择应用 > Helm
    4. Helm页面,删除原有的ack-node-problem-detector组件以卸载旧版本NPD。
    您在配置NPD参数时,需将 eventer.sinks.sls.enabled设置为 true,以创建SLS日志项目。 sls
    成功部署NPD后,NPD会自动在SLS控制台内创建与集群对应的项目。
  2. 日志服务管理控制台为集群配置Kubernetes事件中心。
    1. 接入数据区域,单击Kubernetes-标准输出
    2. 设置项目Project为配置NPD时默认的SLS Project,选择日志库Logstore为自动创建的k8s-event
    3. 单击下一步,然后单击确认安装完毕
  3. 日志服务管理控制台Project列表区域,单击目标Project名称。
  4. 在左侧导航栏中,单击仪表盘,然后单击Kubernetes事件中心V1.5
    事件中心
    在Kubernetes事件中心大盘中即可看到从集群中汇总的事件。

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

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

  1. 登录容器服务管理控制台
  2. 在Kubernetes菜单下,在左侧导航栏选择市场 > 应用目录,在右侧查找并选中ack-node-problem-detector
    说明 若已经开启事件中心,请先删除原有的ack-node-problem-detector组件。
    1. 在控制台左侧导航栏中,单击集群
    2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 选择应用 > Helm
    4. Helm页面,删除原有的ack-node-problem-detector组件。
  3. 应用目录 - ack-node-problem-detector页面,在右侧的创建区域选择对应的集群。
    同时可以看到命名空间已设定为 kube-system,发布名称已设定为 ack-node-problem-detector,在 参数页签,可以看到node-problem-detector的默认配置。 配置页面
    您可以参考以下参数说明,配置kube-eventer的离线通道。
    表 1. 参数说明
    参数 说明 默认值
    npd.image.repository NPD的镜像地址。 registry.aliyuncs.com/acs/node-problem-detector
    npd.image.tag NPD的镜像版本。 v0.6.3-28-160499f
    alibaba_cloud_plugins 检测节点问题的插件列表,请参见下文的问题检查插件 包括fd_checkntp_checknetwork_problem_checkinode_usage_check
    plugin_settings.check_fd_warning_percentage fd_check监控插件的百分比报警阈值。 80
    plugin_settings.inode_warning_percentage inode监控插件的百分比报警阈值。 80
    controller.regionId 监控插件所在集群的地域。目前仅支持cn-hangzhoucn-beijingcn-shenzhencn-shanghai 集群所在区域
    controller.clusterType 监控插件所在集群的类型。 ManagedKubernetes
    controller.clusterId 监控插件所在集群的ID。 所在集群的ID
    controller.clusterName 监控插件所在集群的名称。 所在集群的名称
    controller.ramRoleType 访问控制角色类型。若值为restricted,表示使用默认的Token权限。 集群默认的访问控制角色类型
    eventer.image.repository eventer的镜像地址。 registry.cn-hangzhou.aliyuncs.com/acs/eventer
    eventer.image.tag eventer的镜像版本。 v1.6.0-4c4c66c-aliyun
    eventer.image.pullPolicy eventer的镜像下载方式。 IfNotPresent
    eventer.sinks.sls.enabled 是否开启eventer日志服务的离线链路。 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 钉钉机器人的Token。
    eventer.sinks.dingtalk.monitorkinds 过滤的资源类型。
    eventer.sinks.dingtalk.monitornamespaces 过滤的资源命名空间。
    eventer.sinks.eventbridge.enable 是否开启eventer离线eventBridge数据链路。 false

    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服务是否正常。 默认开启项。
    说明 默认开启项:创建集群时 日志服务选中 安装node-problem-detector并创建事件中心或在集群 组件管理中一键安装 ack-node-problem-detector组件时的默认开启检查项。从 应用目录中安装 ack-node-problem-detector组件时还需要手动开启检查项。
  4. 在右侧的创建区域,单击创建

    在集群列表页,单击目标集群名称或者目标集群右侧操作列下的应用管理,然后单击守护进程集页签,看到守护进程集中的ack-node-problem-detector-daemonset运行正常。

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

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

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

  1. 单击钉钉群右上角群设置图标,进入群设置页面。
  2. 单击智能群助手,单击添加机器人,单击+,选择需要添加的机器人。此处选择自定义机器人。
    自定义机器人
  3. 机器人详情页面,单击添加,进入添加机器人页面。
    添加机器人
  4. 根据以下信息配置群机器人后,阅读并同意服务及免责条款,然后单击完成
    参数 描述
    编辑头像 (可选)为群机器人设置头像。
    机器人名字 添加的机器人名称。
    添加到群组 添加机器人的群组。
    安全设置

    安全设置目前支持3种方式:自定义关键词、加签和IP地址(段)。目前集群的事件监控仅支持第一种方式,即自定义关键词

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

  5. 单击复制,复制webhook地址。
    复制webhook
    说明群机器人页面,选择目标群机器人,单击右侧 设置按钮图标可以进行以下操作:
    • 修改群机器人的头像及机器人名字。
    • 开启关闭消息推送。
    • 重置webhook地址。
    • 删除群机器人。
  6. 登录容器服务管理控制台
  7. 在左侧导航栏选择市场 > 应用目录,在阿里云应用页面选中ack-node-problem-detector
    说明 若已经开启事件中心,请先删除原有的ack-node-problem-detector组件。
    1. 在控制台左侧导航栏中,单击集群
    2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 选择应用 > Helm
    4. Helm页面,删除原有的ack-node-problem-detector组件。
  8. 应用目录 - ack-node-problem-detector页面的参数页签,修改以下内容。
    • npd下方的enabled设置为false
    • eventer.sinks.dingtalk.enabled设置为true
    • 通过步骤5创建webhook地址查看Token,填入Token字段。
    填入token字段
  9. 在右侧的创建页面,选择对应的集群,同时可以看到命名空间已设定为kube-system,发布名称已设定为ack-node-problem-detector,然后单击创建

预期结果:

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

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

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

  1. 创建Project与Logstore。
    1. 登录日志服务管理控制台
    2. Project列表区域,单击创建Project,填写Project的基本信息并单击确认进行创建。
      本示例创建一个名为k8s-log4j,与Kubernetes集群位于同一地域(华东1)的Project。
      说明 在配置时,一般会使用与Kubernetes集群位于同一地域的日志服务Project。因为当Kubernetes集群和日志服务Project位于同一地域时,日志数据会通过内网进行传输,从而避免了因地域不一致而导致的数据传输外网带宽费用和耗时,从而实现实时采集、快速检索的最佳实践。
    3. 创建完成后,k8s-log4j出现在Project列表下,单击该Project名称,进入Project详情页面。
    4. 默认进入日志库页面,在页面左侧,单击加号+,弹出创建Logstore对话框。
    5. 填写日志库配置信息并单击确定
      本示例创建名为k8s-logstore的日志库。 创建k8s log
    6. 创建完毕后,页面会提示您使用数据接入向导。单击数据接入向导,弹出接入数据对话框。
    7. 选择log4jAppender,根据页面引导进行配置。
      本示例使用了默认配置,您可根据日志数据的具体使用场景,进行相应的配置。
      自定义数据
  2. 在Kubernetes集群中配置log4j。
    1. 登录容器服务管理控制台
    2. 在左侧导航栏选择市场 > 应用目录,在右侧选中ack-node-problem-detector
      说明 若已经开启事件中心,请先删除原有的ack-node-problem-detector组件。
      1. 在控制台左侧导航栏中,单击集群
      2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      3. 选择应用 > Helm
      4. Helm页面,删除原有的ack-node-problem-detector组件。
    3. 应用目录 - ack-node-problem-detector中,在参数页签,修改以下内容。
      • npd下方的enabled设置为false
      • eventer.sinks.sls.enabled设置为true
      • 步骤1创建好的ProjectLogstore分别填入各字段。

        若未在创建集群时自定义Project,默认Projectk8s-log-{YOUR_CLUSTER_ID}

      事件监控
    4. 配置完成后,单击创建,将eventer部署到目标集群中。
  3. 操作集群(例如,删除Pod或者创建应用等)产生事件后,登录日志服务控制台查看数据采集。请参见普通消费
    查看采集数据
  4. 设置索引与归档。请参见配置索引
    1. 在日志服务控制台Project列表区域,单击Project名称。
    2. 单击日志库名称后的日志库管理图标图标,选择查询分析
    3. 单击右上角的开启索引
    4. 查询分析对话框中配置索引。
    5. 单击确定
      此时会出现日志查询与分析页面。 日志分析页面
      说明
      • 索引配置在1分钟之内生效。
      • 开启或修改索引后,新的索引配置只对新写入的数据生效。
    6. 如果您需要设置离线归档与计算的场景,可以在Logstore上面将数据投递给OSS。请参见投递日志到OSS

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

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

  1. 开通事件总线EventBridge。具体操作,请参见开通事件总线EventBridge并授权
  2. 登录容器服务管理控制台
  3. 在控制台左侧导航栏选择市场 > 应用目录,在右侧选中ack-node-problem-detector
    说明 若已经开启事件中心,请先删除原有的ack-node-problem-detector组件。
    1. 在控制台左侧导航栏中,单击集群
    2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 选择应用 > Helm
    4. Helm页面,删除原有的ack-node-problem-detector组件。
  4. 应用目录 - ack-node-problem-detector中,在参数页签,修改以下内容。
    配置事件中心并开启EventBridge事件离线数据链路。
    • npd下方的enabled设置为true
    • eventer.sinks.eventbridge.enable设置为trueeventbridge_enable
  5. 配置完成后,单击创建,完成ack-node-problem-detector事件中心组件的安装。
  6. 数据链路开启成功后,可在事件总线EventBridge控制台查看容器事件。
    1. 登录事件总线EventBridge控制台
    2. 在控制台左侧导航栏中,单击云服务专用总线
    3. 云服务专用总线页面左侧导航栏中,单击事件查询
    4. 选择事件查询方式及范围,单击查询
    5. 在事件列表操作列单击事件详情
    EventBridge_detail