事件监控是Kubernetes中的另一种监控方式,可以弥补资源监控在实时性、准确性和场景上的缺欠。开发者可以通过获取事件,实时诊断集群的异常与问题。

背景信息

Kubernetes的架构设计基于状态机,不同的状态之间进行转换则会生成相应的事件,正常的状态之间转换会生成Normal等级的事件,正常状态与异常状态之间的转换会生成Warning等级的事件。kube-eventer是ACK维护的开源Kubernetes事件离线工具,可以将集群的事件离线到钉钉、SLS等系统,并提供不同等级的过滤条件,实现事件的实时采集、定向告警、异步归档。更多内容请参见kube-eventer

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

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

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

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

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

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

  5. 单击复制,复制webhook地址。
    复制webhook
    说明群机器人页面,选择目标群机器人,单击右侧设置按钮图标可以进行以下操作:
    • 修改群机器人的头像及机器人名字。
    • 开启关闭消息推送。
    • 重置webhook地址。
    • 删除群机器人。
  6. 登录容器服务管理控制台
  7. 在左侧导航栏选择市场 > 应用目录,在右侧选中ack-node-problem-detector
    应用目录
  8. 应用目录 - ack-node-problem-detector页的参数页签,修改以下内容。
    • 将npd下方的enabled设置为false。
    • 将eventer下方的dingtalk中的dingtalk.enabled设置为true。
    • 通过步骤5创建webhook地址查看token,填入token字段。
    填入token字段
  9. 在右侧的创建页面,选择对应的集群,同时可以看到命名空间已设定为kube-system,发布名称已设定为ack-node-problem-detector,然后单击创建
部署成功后30s,eventer生效,当事件等级超过阈值等级时,即可在钉钉群收到如下告警。消息提醒

场景2:使用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
      应用目录
    3. 应用目录 - ack-node-problem-detector中,在参数页签,修改以下内容。
      • 将NPD下方的enabled设置为false
      • 将eventer下方的sink中的sls.enabled设置为true
      • 步骤1创建好的Project和Logstore分别填入各字段。
    4. 配置完成后,单击创建,将eventer部署到目标集群中。
  3. 操作集群(例如,删除Pod或者创建应用等)产生事件后,登录日志服务控制台查看数据采集。请参见普通消费
    查看采集数据
  4. 设置索引与归档。请参见开启并配置索引
    1. 在日志服务控制台Project列表区域,单击Project名称。
    2. 单击日志库名称后的日志库管理图标图标,选择查询分析
    3. 单击右上角的开启索引
      开启索引
    4. 配置索引。
    5. 单击确定
      此时会出现日志查询与分析页面。日志分析页面
      说明
      • 索引配置在1分钟之内生效。
      • 开启或修改索引后,新的索引配置只对新写入的数据生效。
    6. 如果您需要设置离线归档与计算的场景,可以在Logstore上面将数据投递给MaxCompute或者OSS。请参见通过日志服务投递日志到MaxCompute投递日志到OSS

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

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

  1. 登录容器服务管理控制台
  2. 在Kubernetes菜单下,在左侧导航栏选择市场 > 应用目录,在右侧选中ack-node-problem-detector
    应用目录
  3. 应用目录 - 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 检测节点问题的插件列表,请参见下文的NPD支持的问题检测插件 包括fd_check、ntp_check、network_problem_check、inode_usage_check
    plugin_settings.check_fd_warning_percentage fd_check监控插件的百分比报警阈值。 80
    plugin_settings.inode_warning_percenage inode监控插件的百分比报警阈值。 80
    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 过滤的资源命名空间。

    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服务是否正常。
  4. 在右侧的创建页面,在右侧选择对应的集群,同时可以看到命名空间已设定为 kube-system,发布名称已设定为ack-node-problem-detector,然后单击创建
    单击应用 > 容器组,选择目标集群和命名空间,在容器组列表中可以看到守护进程集中的ack-node-problem-detector-daemonset运行正常。daemonset

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

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

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

  1. 为被监控集群安装NPD并激活SLS功能。安装步骤请参见场景3
    如果您已安装但未激活SLS,请先卸载旧版本。成功部署NPD后,NPD会自动在SLS控制台内创建与集群对应的项目。
    您在配置NPD参数时,需将false设置为true,以创建SLS日志项目。sls
  2. 日志服务管理控制台为集群配置Kubernetes事件中心。
    1. 接入数据区域,单击Kubernetes标准输出
    2. 设置项目Project为配置NPD时默认的SLS Project,选择日志库Logstore为自动创建的k8s-event
    3. 单击下一步,然后单击确认安装完毕
  3. 日志服务管理控制台Project列表区域,单击目标Project名称。
  4. 在左侧导航栏中,单击仪表盘,然后单击Kubernetes事件中心V1.1
    事件中心
    在Kubernetes事件中心大盘中即可看到从集群中汇总的事件。