本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon EKS 容器组身份和 KEDA 在 Amazon EKS 中设置事件驱动的自动扩缩
Dipen Desai、Abhay Diwan、Kamal Joshi 和 Mahendra Revanasiddappa,Amazon Web Services
Summary
诸如 Amazon Elastic Kubernetes Service(Amazon EKS)之类的编排平台简化了基于容器的应用程序的生命周期管理。这有助于组织专注于构建、保护、操作和维护基于容器的应用程序。随着事件驱动的部署变得越来越普遍,组织也越来越频繁地根据各种事件源扩展 Kubernetes 部署。将这种方法与自动扩缩相结合后,通过提供按需计算资源和针对应用程序逻辑量身定制的高效扩缩,即可实现成本的大幅节省。
KEDA
AWS 提供支持各种 Kubernetes 部署选项的 AWS Identity and Access Management (IAM) 角色,包括亚马逊 EKS、Amazon EKS Anywhere、 AWS 云端 Red Hat OpenShift 服务 (ROSA) 和亚马逊弹性计算云 (亚马逊) 上的自行管理的 Kubernetes 集群。 EC2这些角色使用 IAM 结构(例如 OpenID Connect (OIDC) 身份提供商和 IAM 信任策略)在不同的环境中运行,无需直接依赖 Amazon EKS 服务或。 APIs有关更多信息,请参阅 Amazon EKS 文档中的服务账户的 IAM 角色。
Amazon EKS 容器组身份可简化 Kubernetes 服务账户在不需要 OIDC 提供商的情况下代入 IAM 角色的流程。因此,能够管理应用程序凭证。您可以将 IAM 角色与 Kubernetes 服务账户关联,然后将您的 Pod 配置为使用服务账户,而不是创建 AWS 证书并将其分配给容器或使用 Amazon EC2 实例的角色。这可以帮助您跨多个集群使用 IAM 角色,并允许在 IAM 角色之间重复使用权限策略,从而简化策略管理。
通过使用 Amazon EKS 容器组身份实施 KEDA,企业可以实现高效的事件驱动型自动扩缩和简化的凭证管理。应用程序可根据需求进行扩缩,从而优化资源利用率以及降低成本。
此模式可以帮助您将 Amazon EKS 容器组身份与 KEDA 进行集成。它展示了如何使用 keda-operator 服务账户以及通过 TriggerAuthentication 委派身份验证。此模式还描述了如何建立 KEDA 运算符的 IAM 角色和应用程序的 IAM 角色之间的信任关系。这种信任关系允许 KEDA 监控事件队列中的消息并调整目标 Kubernetes 对象的扩缩。
先决条件和限制
先决条件
AWS Command Line Interface (AWS CLI) 版本 2.13.17 或更高版本,已安装
Python 3.11.5 或更高版本,已安装
适用于 Python (Boto3) 的 AWS SDK 版本 1.34.135 或更高版本,已安装
Helm 版本 3.12.3 或更高版本,已安装
kubectl 版本 1.25.1 或更高版本,已安装
。 Docker Engine 版本 26.1.1 或更高版本,已安装
Amazon EKS 集群版本 1.24 或更高版本,已创建
创建 Amazon EKS 容器组身份代理的先决条件,已满足
限制
您必须建立
keda-operator角色和keda-identity角色之间的信任关系。此模式的操作说明部分中提供了说明。
架构
在此模式中,您可以创建以下 AWS 资源:
Amazon Elastic Container Registry(Amazon ECR)存储库 – 在此模式中,此存储库名为
keda-pod-identity-registry。此私有存储库可用于存储示例应用程序的 Docker 映像。Amazon Simple Queue Service(Amazon SQS)队列 – 在此模式中,此队列名为
event-messages-queue。队列充当消息缓冲区,可用于收集和存储传入的消息。KEDA 监控队列指标,例如消息计数或队列长度,并根据这些指标自动扩缩应用程序。应用程序的 IAM 角色 – 在此模式中,此角色名为
keda-identity。keda-operator角色会代入此角色。此角色允许访问 Amazon SQS 队列。KEDA 运算符的 IAM 角色 – 在此模式中,此角色名为
keda-operator。KEDA 操作员使用此角色进行所需的 AWS API 调用。此角色具有代入keda-identity角色的权限。由于keda-operator和keda-identity角色之间存有信任关系,keda-operator角色具有 Amazon SQS 权限。
通过 TriggerAuthentication 和 ScaledObject Kubernetes 自定义资源,运算符会使用 keda-identity 角色与 Amazon SQS 队列连接。根据队列大小,KEDA 会自动扩缩应用程序部署。它会根据队列中未读消息的数量,每 5 条新增 1 条。在默认配置中,如果 Amazon SQS 队列中没有未读消息,则应用程序会缩减到 0 个容器组(pod)。KEDA 运算符按照您指定的时间间隔监控队列。
下图显示了您如何使用 Amazon EKS 容器组身份为 keda-operator 角色提供对 Amazon SQS 队列的安全访问权限。

下图显示了如下工作流:
您在 Amazon EKS 集群中安装 Amazon EKS 容器组身份代理。
您在 Amazon EKS 集群的 KEDA 命名空间中部署 KEDA 运算符。
您在目标中创建
keda-operator和keda-identityIAM 角色 AWS 账户。建立 IAM 角色之间的信任关系。
您在
security命名空间中部署应用程序。KEDA 运算符将对 Amazon SQS 队列中的消息进行轮询。
KEDA 启动 HPA,而后者会根据队列大小自动扩缩应用程序。
工具
AWS 服务
Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
亚马逊 Elastic Kubernetes Service(亚马逊 EKS)可帮助你在上面运行 AWS Kubernetes,而无需安装或维护自己的 Kubernetes 控制平面或节点。
AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。
Amazon Simple Queue Service (Amazon SQS) 提供了一个安全、持久且可用的托管队列,它可帮助您集成和分离分布式软件系统与组件。
其他工具
KEDA
是一款基于 Kubernetes 的事件驱动型自动扩缩器。
代码存储库
此模式的代码可在使用 EK S Pod Id GitHub entity 和 KEDA 存储库的事件驱动的自动缩放
最佳实践
我们建议您遵循以下最佳实践:
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
创建 KEDA 运算符的 IAM 角色。 |
| AWS 管理员 |
为示例应用程序创建 IAM 角色。 |
| AWS 管理员 |
创建 Amazon SQS 队列。 |
| 常规 AWS |
创建 Amazon ECR 存储库。 |
| 常规 AWS |
| Task | 说明 | 所需技能 |
|---|---|---|
部署 Amazon EKS 容器组身份代理。 | 对于目标 Amazon EKS 集群,安装 Amazon EKS 容器组身份代理。按照 Amazon EKS 文档中设置 Amazon EKS 容器组身份代理的说明进行操作。 | AWS DevOps |
部署 KEDA。 |
| DevOps 工程师 |
为 Kubernetes 服务账户分配 IAM 角色。 | 按照 Amazon EKS 文档中向 Kubernetes 服务账户分配 IAM 角色中的说明进行操作。使用以下值:
| AWS DevOps |
创建 命名空间。 | 输入以下命令,以在目标 Amazon EKS 集群中创建
| DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
克隆应用程序文件。 | 输入以下命令,使用 EKS Pod Identity 和 KEDA 存储库从中克隆事件驱动的自动缩放
| DevOps 工程师 |
构建 Docker 映像。 |
| DevOps 工程师 |
将 Docker 映像推送到 Amazon ECR。 |
注意您可以导航到 Amazon ECR 存储库页面,然后选择查看推送命令,进而找到推送命令。 | DevOps 工程师 |
部署示例应用程序。 |
| DevOps 工程师 |
为应用程序服务账户分配 IAM 角色。 | 执行以下任一操作,将
| DevOps 工程师 |
部署 |
| DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
向 Amazon SQS 队列发送消息。 |
| DevOps 工程师 |
监控应用程序容器组(pod)。 |
| DevOps 工程师 |
问题排查
| 问题 | 解决方案 |
|---|---|
KEDA 运算符无法扩缩应用程序。 | 输入以下命令,以检查
如果有
如果出现
|
相关资源
设置 Amazon EKS 容器组身份代理(Amazon EKS 文档)
部署 KEDA
(KEDA 文档) ScaledObject 规格
(KEDA 文档) 使用进行身份验证 TriggerAuthentication
(KEDA 文档)