事件监控是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运行正常。

    此时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事件中心大盘中即可看到从集群中汇总的事件。