使用 Amazon CloudWatch Container Insights 自动监控 Amazon EKS 集群

发布时间:2024 年 7 月 30 日

您是否正在寻找用于 Amazon Elastic Kubernetes Service (Amazon EKS) 的监控解决方案,以实现可扩展性、减少错误以及节省时间和人力。设想一下,如果某个 Amazon EKS 集群环境配置了多个工作节点,而每个节点又配置了一个或多个 Kubernetes 容器组。面对这种环境,团队是否经常会遇到这样的难题:如何才能有效为系统级容器组和工作节点性能指标设置监控和警报功能。

Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
90 分钟
上次更新时间
2024 年 7 月 30 日

简介

本文将介绍一种利用 Amazon CloudWatch Container Insights metricsTerraformAWS CloudFormation 等亚马逊云科技服务和资源,实现对 Amazon EKS 集群监控的事件驱动型自动化解决方案。本解决方案适用于需要根据工作负载需求为 Amazon EKS 工作节点配置扩缩操作的环境。通过分析这些扩缩事件,您可以动态地创建和删除 Amazon CloudWatch 警报。本方法基于 Amazon EKS 可观测性的最佳实践,其中 Amazon EKS 可观测性是了解和监控 Amazon EKS 环境健康状况的重要一环。

了解 Amazon EKS 集群上 Amazon EKS 节点的动态特性

不同于系统 / 应用程序容器组和 DaemonSet 等组件,这类组件只有在更新时才会在集群上处于动态,而动态组件会根据工作负载需求、升级和修补等因素发生变化。

例如,对于受 Amazon EKS 集群上 Amazon EC2 自动扩缩组管理的 Amazon EKS 节点,其数量会随着工作负载需求的变化而波动。通常情况下,Amazon EKS 节点实例属于 Amazon EKS 节点组,而每个集群包含一个或多个 Amazon EKS 节点组。在扩展事件中,集群会添加新的节点;在缩减事件中,集群会删除多余的节点。除此之外,其他动态组件以及 Amazon EKS 升级和节点修补等事件也会改变 Amazon EKS 集群中 Amazon EKS 节点的数量。

特别是考虑到这种动态特性,要想监控 Amazon EKS 节点,就必须配置 Amazon CloudWatch 警报。本解决方案通过确保 Amazon CloudWatch 警报能够进行自动配置直接解决了该问题,从而实现了在 Amazon EKS 节点数量波动的情况下对其进行有效监控。

架构概述

本解决方案部署了以下基础设置(参见图 1):

  • 使用 AWS CloudFormation 模板部署的 Amazon EKS 集群和 Amazon CloudWatch Observability EKS插件。
  • 使用 Terraform 配置的 Amazon CloudWatch 静态警报。
  • 使用 AWS Lambda、Amazon SNS、Amazon EventBridge 和 Amazon S3 为 Amazon EKS 工作负载配置的动态警报。
图 1:自动化解决方案架构概述

静态警报流程

在本流程中,由 Terraform 创建的警报会在阈值被超过时触发邮件通知。

  1. Amazon CloudWatch (Kubernetes) DaemonSet 收集 Amazon EKS 集群指标并将数据发送至 Amazon CloudWatch Container Insights。其中 DaemonSet 会确保 Amazon CloudWatch 代理在集群的各工作节点上运行并从中收集数据。有关提取的指标列表,请参见 Amazon EKS 和 Kubernetes Container Insights
  2. Amazon CloudWatch Container Insights 在 terraform.tfvars Terraform 文件(位于本解决方案的 Github 仓库根目录)中定义警报配置。该文件是创建、删除或更新预定义警报的依据。您也可以针对特定用例在其中添加其他警报。在本文的演示部分,您需要克隆该仓库。
  3. Terraform 创建 terraform.tfvars 文件中指定的 Amazon CloudWatch 警报,并将 Amazon SNS 配置为端点以触发邮件通知。
  4. 当警报的定义阈值被超过时,警报通知事件会被触发,并被发送至 Amazon SNS 服务。
  5. Amazon SNS 服务通过电子邮件将警报通知发送至指定订阅者(例如,您的运营团队)。

动态警报流程

在本流程中,警报将根据集群中节点的扩缩活动生成。

  1. 节点自动扩缩器持续评估 Amazon EKS 工作节点的扩缩需求,并将相关事件提交至 Amazon EC2 自动扩缩组。
  2. Amazon EventBridge 规则监控扩缩活动,并在 Amazon EC2 自动扩缩组收到 EC2 Instance Launch Successful 事件和 EC2 Instance Terminate Successful 事件后捕获这些事件。
  3. 如果事件符合 Amazon EventBridge 规则,则其会触发负责创建和删除 Amazon CloudWatch 警报的 AWS Lambda 函数。
  4. AWS Lambda 函数对事件进行评估,确定其是扩展事件还是缩减事件,并在此基础上决定是在相关节点上创建还是终止 Amazon CloudWatch 警报。
  5. 对于扩展事件,AWS Lambda 函数会从存储在 Amazon S3 存储桶中的 alarm_list_inputs.json 文件获取已定义的警报属性,接着在相应 Amazon EKS 工作节点上创建 Amazon CloudWatch 警报;对于缩减事件,AWS Lambda 函数会终止与该工作节点相关的 Amazon CloudWatch 警报。
  6. Amazon CloudWatch 警报将创建 / 删除状态发送至 Amazon SNS。
  7. Amazon SNS 会通过电子邮件向指定订阅者(例如云管理团队)发送警报通知。

前提条件

  • 亚马逊云科技账户(已激活)
  • Amazon Linux 服务器或 Mac OS 服务器;如果使用 Mac OS 服务器,建议使用 Z shell (Zsh)。
  • 具有足够权限使用 Terraform 来配置资源的亚马逊云科技用户 / 角色。
  • Terraform CLI v1.7.5。
  • AWS Command Line Interface (AWS CLI) v2.11.1。
  • Kubectl v1.28.8-eks-ae9a62a(必须与 Amazon EKS v1.28 兼容)。

演示

步骤 1:部署基础设施并设置环境

使用 AWS CloudFormation 和 Terraform 部署 Amazon EKS 基础设施和 Amazon CloudWatch 警报。

1. 运行以下命令,克隆 eks-automated-monitoring GitHub 仓库

GitHub repository:
git clone https://github.com/aws-samples/eks-automated-monitoring.git
cd eks-automated-monitoring

2. 导航至 ./script/deploy.sh 文件,更新配置基础设施时需传输至 AWS CloudFormation 模板的变量。以下是必选变量:

  • SNS_EMAIL:接收警报和通知的电子邮件地址。
  • TF_ROLE:有权将资源部署到亚马逊云科技账户的 IAM 角色的 Amazon资源名称 (ARN)。

3. (可选)在仓库根目录中找到 terraform.tfvars 文件,修改预定义警报或添加新警报。

4. (可选)在仓库根目录的 files 文件夹中找到 alarm_list_inputs.json 文件,添加 Amazon EKS 节点级监控所需的警报。出于演示目的,我们已在该文件中添加了两个预定义警报。

5. 运行以下命令,在 us-east-1 区域中部署 Amazon Virtual Private Cloud (Amazon VPC) 和 Amazon EKS 集群。如果需要更改区域,请更新 ./script/deploy.sh 文件中的参数。./scripts/deploy.sh -o apply

重点:请记录该命令运行后输出的 AWS Lambda 函数的名称,因为稍后需要使用该 AWS Lambda 函数。

Amazon SNS 会向 ./script/deploy.sh 文件中 SNS_EMAIL 参数所配置的电子邮件地址发送订阅确认消息。在收到来自 Amazon SNS 的电子邮件后,打开邮件并选择 Confirm subscription 以确认订阅。接着,网页会打开并显示带有您的订阅 ID 的订阅确认信息。

接下来,您就可以测试和验证 Amazon CloudWatch 警报配置了。

步骤 2(有条件):为现有 Amazon EKS 节点配置动态警报

如果在部署本解决方案之前,您的环境中已存在工作节点,运行以下命令以触发 AWS Lambda 函数。

aws lambda invoke --function-name <Lambda function name> --invocation-type RequestResponse output

AWS Lambda 函数会根据 terraform.tfvars 文件中的警报列表设置指定的 Amazon CloudWatch 警报(该列表是部署期间以 .json 格式上传至 Amazon S3 存储桶的,包含对所有 Amazon EC2 实例的设置信息)。

步骤 3:验证静态组件的 Amazon CloudWatch 警报

  1. 登录亚马逊云科技账户。
  2. 打开 CloudWatch console
  3. 打开左侧导航栏中的 Alarms 页面。
  4. 验证先前克隆的 GitHub 仓库中 terraform.tfvars 文件中的警报列表所包含的预定义警报配置和新警报配置。

步骤 4:为自动扩缩事件设置警报

使用具有足够权限的角色执行以下步骤。

1. 增加或减少(扩展或缩减)deploy.sh 文件中 NUM_WORKER_NODES 变量的值,来模拟或测试警报。

2. 运行以下命令,更新 deploy.sh 文件:./scripts/deploy.sh -o apply

3. 登录亚马逊云科技账户。

4. 打开 Amazon CloudWatch 控制台

5. 打开左侧导航栏中的 Alarms 页面,确认更新。

启动或终止 Amazon EC2 自动扩缩组后,警报会得到创建,并且电子邮件警报也会发送至已订阅的电子邮件地址(与配置用于通知的 Amazon SNS 主题关联)。

清理资源

执行以下步骤,清理环境并避免产生额外的费用。

1. 运行以下命令,删除已配置的基础设施:./scripts/deploy.sh -o destroy

2. 删除先前为 Amazon EKS 工作节点创建的动态警报。有关说明,请参阅编辑或删除 Amazon CloudWatch 警报

故障排查

如果创建或删除警报失败,或未收到通知邮件,请尝试以下步骤:

1. 如果创建或删除 Amazon CloudWatch 警报失败,打开 AWS Lambda 函数的 Amazon CloudWatch 日志组并检查消息详情。有关使用 AWS Lambda 控制台访问日志,请参阅在 Amazon CloudWatch 日志控制台上查看查询

2. 使用 AWS Lambda 控制台中的 AWS Lambda 监控功能,查看错误计数和成功率 (%)调用次数等指标和图表。有关更多信息,请参阅在 AWS Lambda 控制台上监控功能

3. 更新 /scripts/eks-infra.yaml 文件中 EksAmiIds 参数的镜像 ID,将 Amazon EKS Amazon Machine Image (AMI) 更新至最新版本。有关更多信息,请参阅获取 Amazon EKS 优化版 Amazon Linux AMI IDs:本解决方案使用的 AMI 类型为 amazon-linux-2

总结

恭喜!至此您已成功构建了基于自动化和 Amazon EKS 可观测性最佳实践的解决方案来监控您的 Amazon EKS 集群环境。