

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Beanstalk 集群架构
<a name="beanstalk-cluster-concepts"></a>

Beanstalk Cluster 使用与 Beanstalk Standark 相同的 Elastic Beanstalk 应用程序、应用程序版本、环境和配置选项概念。Beanstalk Standard 是环境类型。 EC2-based Beanstalk 集群使用不同的计算层和配置表面。本主题按方面描述差异并确定适用的环境类型。

## 计算模型
<a name="beanstalk-cluster-compute"></a>

在 Beanstalk Standard 中，Elastic Beanstalk 在专用于该环境的 Auto Scaling 组中启动了亚马逊弹性计算云 (Amazon EC2) 实例。应用程序直接在这些实例上运行。在 Beanstalk 集群环境中，Elastic Beanstalk 改为将应用程序作为容器映像运行在亚马逊 EKS 集群上，该集群可以由您的 Beanstalk 集群环境共享。Elastic Beanstalk 创建并运行集群。Elastic Beanstalk 将应用程序调度到集群上。Elastic Beanstalk 隔离集群上的每个环境，并协调应用程序副本的数量以匹配配置的值。您无需创建集群、选择运行环境的集群或选择其 Kubernetes 版本。

您的多个环境可以在同一 Amazon EKS 集群上运行。Elastic Beanstalk 在集群上放置了一个为配置的 VPC 子网提供服务的环境。它会在首次使用这些子网时创建集群；请参阅[环境分组](#beanstalk-cluster-clusters-sharing)。亚马逊 EKS 自动模式提供节点容量。它添加和移除节点以适应已调度的容器。由于集群可以共享且节点容量由 Amazon EKS 管理，因此不通过`aws:autoscaling:asg`命名空间配置实例数量。相反，应用程序副本的数量是使用`aws:elasticbeanstalk:eks:environment:autoscaling`命名空间中的`min-replica`和`max-replica`选项设置的。有关副本边界和更改副本数量的触发器，请参阅[扩展 Beanstalk 集群环境](configuring-cluster-scaling.md)。

Elastic Beanstalk 根据您提供的选项设置解析环境配置，并在创建或更新环境时应用已解析的配置。如果多次提供相同的配置选项，则最后一次出现的选项获胜。要更改配置，请更新选项设置。

## 与 Beanstalk 标准的区别
<a name="beanstalk-cluster-differences"></a>

下表总结了Beanstalk标准版和Beanstalk集群环境之间面向客户的区别。每行都链接到深入介绍 Elastic Beanstalk 概念的主题。


| 方面 | Beanstalk 标准 | Beanstalk 集群环境 | 
| --- | --- | --- | 
| 计算 | 通过aws:autoscaling:\*命名空间配置的 Auto Scaling 组中的专用 Amazon EC2 实例。 | 计划在亚马逊 EKS 集群上的容器可以由您的 Beanstalk 集群环境共享。Elastic Beanstalk 隔离集群上的每个环境。节点由亚马逊 EKS 自动模式提供。 | 
| 扩展 | 由 Auto Scaling 组添加和移除的 Amazon EC2 实例，并通过aws:autoscaling:\*命名空间配置触发器和计划操作。请参阅[使用 Auto Scaling 功能自动扩缩 Elastic Beanstalk 环境实例](using-features.managing.as.md)。 | 在和max-replica边界内、CPU、内存、时间表或您自己的终端节点报告的指标上添加min-replica和删除了应用程序副本。请参阅[扩展 Beanstalk 集群环境](configuring-cluster-scaling.md)。 | 
| 部署工件 | Elastic Beanstalk 在平台（解决方案堆栈）AMI 上运行的源包。请参阅[Elastic Beanstalk 支持的平台](concepts.platforms.md)。 | 亚马逊弹性容器注册表 (亚马逊 ECR) 中的容器镜像。图像是直接提供的，或者提供源代码供Elastic Beanstalk构建成镜像。请参阅[为 Beanstalk 集群环境构建容器镜像](beanstalk-cluster-app-versions.md)。 | 
| 平台概念 | 托管解决方案堆栈（AMI 上的操作系统、Web 服务器和语言运行时）。请参阅[Elastic Beanstalk 支持的平台](concepts.platforms.md)。 | 没有解决方案堆栈或 AMI。运行时由容器镜像和 Elastic Beanstalk 创建的集群版本定义。 | 
| 部署策略 | All-at-once通过命名空间配置的、滚动部署或不可变部署。aws:elasticbeanstalk:command | 滚动更新（默认）或一次全部更新，使用aws:elasticbeanstalk:eks:environment:deployment命名空间中的strategy选项进行配置。一次全部的选项值为Recreate。 | 
| 配置命名空间 | 经典命名空间，例如和。aws:autoscaling:\* aws:elasticbeanstalk:environment请参阅[配置选项](command-options.md)。 | aws:elasticbeanstalk:eks:\*命名空间。所有经典的计算命名空间都不适用。 | 
| 健康 | 由每个实例的主机管理器和负载均衡器报告。 | Per-instance 未报告健康状况。对于应用程序负载均衡器，运行状况包括 Elastic Beanstalk 评估的负载均衡器指标。使用load-balancer-type=None时，该请求率、错误率和延迟评估不适用。请参阅[监控 Beanstalk 集群环境](monitoring-cluster-environments.md)。 | 

## Customer-provided 和服务管理的资源
<a name="beanstalk-cluster-resources"></a>

Elastic Beanstalk 创建并运行运行 Beanstalk 集群环境的亚马逊 EKS 集群。亚马逊 EKS 所需的集群和节点 AWS Identity and Access Management (IAM) 角色由客户提供。我们建议您使用中描述的角色名称和 AWS 托管策略[Beanstalk 集群的权限](beanstalk-cluster-permissions.md)，因为 Elastic Beanstalk 要求集群上的每个环境提供相同的角色。还可以通过 Amazon EKS Pod Identity 为正在运行的应用程序提供应用程序角色。应用程序角色是在环境创建期间在 Elastic Beanstalk 控制台中选择的。有关完整的 IAM 责任模型和应用程序角色程序，请参阅。[Beanstalk 集群的权限](beanstalk-cluster-permissions.md)

环境的 VPC 子网是可选的。如果省略子网，Elastic Beanstalk 将使用默认 VPC 的公有子网。子网集决定哪个集群运行环境。有关集群分配和 Elastic Beanstalk 运行的基础设施，请参阅。[环境分组](#beanstalk-cluster-clusters-sharing)

Elastic Beanstalk 在服务创建的集群上运行应用程序。它部署容器镜像并通过`aws:elasticbeanstalk:eks:environment:deployment`命名空间应用滚动更新。它将应用程序副本的运行数量与配置中的`min-replica`和边`max-replica`界进行协调。它通过中所述的运行状况报告环境级别的运行状况。[监控 Beanstalk 集群环境](monitoring-cluster-environments.md)Elastic Beanstalk 会跟踪其分配环境的每个集群，将其作为服务管理型集群。

**重要**  
Elastic Beanstalk 仅将环境分配给与预期的服务管理配置相匹配的集群。如果基础设施不再与该配置相匹配，Elastic Beanstalk 将停止为新环境选择集群。环境更改是通过 Elastic Beanstalk 操作和配置进行的。

## 应用程序要求和限制
<a name="beanstalk-cluster-when-to-use"></a>

Beanstalk 集群环境要求应用程序既可以作为容器镜像运行，也可以作为一个或多个相同、可互换的副本运行。负载均衡器是可选的。配置负载均衡器后，它会在应用程序副本之间分配请求。无状态的 Web 服务或 API 符合此要求，其副本不具有任何必须在重启后存活下来的本地状态。请求端口、CPU 和内存请求、应用程序副本数量和部署行为是通过这些`aws:elasticbeanstalk:eks:*`选项配置的。Elastic Beanstalk 通过 Amazon EKS 自动模式提供集群容量。

在创建 Beanstalk 集群环境之前，请确认以下应用程序要求和限制：
+ 本地存储不是永久性的。应用程序的每个副本都有临时存储空间，当副本重新启动时，这些存储空间会丢失。如果没有外部永久存储，则将上传、缓存或工作文件写入本地磁盘并要求它们在重启后继续运行的应用程序是不兼容的。
+ 请求分布在应用程序副本中。
+ Elastic Beanstalk 根据所支持语言的源代码构建容器镜像。你也可以提供 Dockerfile 或预建镜像。请参阅[为 Beanstalk 集群环境构建容器镜像](beanstalk-cluster-app-versions.md)。

## 配置示例
<a name="beanstalk-cluster-example"></a>

以下 AWS CLI 请求设置了 Beanstalk 集群环境的请求端口、内存请求、正在运行的副本数量和部署行为。这些设置使用`aws:elasticbeanstalk:eks:*`命名空间。

```
$ aws elasticbeanstalk update-environment \
    --environment-name my-cluster-env \
    --option-settings \
        Namespace=aws:elasticbeanstalk:eks:environment,OptionName=service-port,Value=8080 \
        Namespace=aws:elasticbeanstalk:eks:environment,OptionName=memory,Value=1Gi \
        Namespace=aws:elasticbeanstalk:eks:environment,OptionName=load-balancer-type,Value=ALB \
        Namespace=aws:elasticbeanstalk:eks:environment:autoscaling,OptionName=min-replica,Value=3 \
        Namespace=aws:elasticbeanstalk:eks:environment:autoscaling,OptionName=max-replica,Value=3 \
        Namespace=aws:elasticbeanstalk:eks:environment:deployment,OptionName=strategy,Value=RollingUpdate \
        Namespace=aws:elasticbeanstalk:eks:environment:deployment:strategy:rolling,OptionName=max-surge,Value=25% \
        Namespace=aws:elasticbeanstalk:eks:environment:deployment:strategy:rolling,OptionName=max-unavailable,Value=0
```

该`strategy`选项接受`RollingUpdate`或`Recreate`，控制台将其显示为滚动更新，并且一次全部显示。`max-surge`限定 `RollingUpdate` Elastic Beanstalk 在部署期间启动的额外副本数量。该`max-unavailable`选项限制了它一次删除多少现有副本。每个选项都接受一个计数或百分比。该`memory`值使用 Kubernetes 数量表示法，例如或。`1Gi` `512Mi`有关全套选项，请参阅[Beanstalk 集群环境的配置选项](command-options-general-eks.md)。

## 环境分组
<a name="beanstalk-cluster-clusters-sharing"></a>

Elastic Beanstalk 按您的 Beanstalk 集群环境使用的 VPC 子网将它们分组到集群中：
+ 使用相同子网集的同一 AWS 账户中的环境在*同一个*集群上运行。
+ 使用不同子网集的环境在*不同的*集群上运行。

您使用一组给定子网创建的第一个环境会导致 Elastic Beanstalk 为其创建集群，这大约需要十分钟。Elastic Beanstalk 在环境事件中报告了这一点：

```
INFO  Creating CloudFormation stack for cluster infrastructure. This is a one-time operation and generally takes about 10 minutes. stack='beanstalk-cluster-{{uuid}}'
INFO  Starting cluster assignment. environment='my-cluster-env'
INFO  Successfully completed cluster assignment. environment='my-cluster-env' clusterArn='arn:aws:eks:us-east-1:{{111122223333}}:cluster/beanstalk-cluster-{{uuid}}'
```

Elastic Beanstalk 在现有集群上放置了使用相同子网的后续环境。他们的事件在没有堆栈创建消息的情况下报告任务。Elastic Beanstalk 既为集群命名，也为创建它的 AWS CloudFormation 堆栈命名。`beanstalk-cluster-{{uuid}}`

Elastic Beanstalk 考虑子网的顺序并不重要；按不同顺序排列的相同子网是相同的集合。只有子网集选择集群。当群集已经为子网集注册时，您提供的群集和节点角色设置必须与为该群集注册的角色相匹配。Elastic Beanstalk 拒绝冲突的角色设置；不同的角色 ARN 不会选择不同的集群。您还要提供可观测性角色，Elastic Beanstalk 会以相同的方式针对集群对其进行验证。可选应用程序角色属于环境，可能因环境而异。使用中的环境创建过程对其进行配置。[配置应用程序角色](beanstalk-cluster-permissions.md#beanstalk-cluster-permissions-application-role)

Elastic Beanstalk 不限制共享一个集群的环境数量。Amazon EKS 自动模式会添加节点以适应集群上计划的容器。集群共享不会增加特定环境的扩展限制。每个环境仍受其配置的副本或自动扩展限制、适用的服务配额和可用容量的约束。要在单独的集群上运行环境，请使用一组不同的子网创建该环境。

**重要**  
您无法更改现有 Beanstalk 集群环境的子网或集群、节点和可观测性角色。Elastic Beanstalk 拒绝此类更新，而不是将您的环境移至不同的集群，并报告说：`Changes to EKS cluster configuration (subnets and IAM roles) are not currently supported for an existing environment. Please revert these option settings to continue.`要将应用程序移动到不同的子网或角色，请使用所需的设置创建一个新环境，然后交换两个环境别名。请参阅[Blue/Green 使用 Elastic Beanstalk 进行部署](using-features.CNAMESwap.md)。确定环境在创建时使用哪些子网和集群角色。请参阅[Beanstalk 集群入门](beanstalk-cluster-getting-started.md)。

## 共享计算的环境之间的隔离
<a name="beanstalk-cluster-isolation-pointer"></a>

子网是环境之间的主要边界。由于子网集选择集群，因此为一组环境提供自己的子网会为该组提供自己的集群、自己的节点和自己的网络。在单个集群中，Elastic Beanstalk 在默认情况下隔离 Beanstalk 集群环境之间的网络流量，`aws:elasticbeanstalk:eks:environment`命名空间中的选项允许特定环境进行通信或在专用节点上放置环境。

有关每个选项赋予您的边界、扩大边界的选项以及共享集群不分开的内容，请参阅[Multi-tenancy 适用于 Beanstalk 集群环境](beanstalk-cluster-multi-tenancy.md)。

## 托管基础架构配置
<a name="beanstalk-cluster-clusters-config"></a>

Elastic Beanstalk 使用您无法选择的固定配置创建每个集群：


| 设置 | Elastic Beanstalk 配置了什么 | 
| --- | --- | 
| Kubernetes 版本 | Elastic Beanstalk 在创建集群时选择版本。Elastic Beanstalk 使用其支持的最新 Kubernetes 版本创建了一个新集群。现有集群上的环境运行该集群已有的版本。该版本在集群的生命周期内保持不变。 | 
| 节点容量 | Amazon EKS 自动模式，它添加和删除节点以适应集群上计划的容器。 Node-capacity 配置由服务管理。 | 
| 集群基础设施访问权限 | Service-managed。通过 Elastic Beanstalk API AWS CLI、或 Elastic Beanstalk 控制台配置环境。 | 
| 集群附加组件 | Elastic Beanstalk 会安装并固定您的环境所依赖的插件。当 Elastic Beanstalk 推出新的固定插件版本时，它会在后续环境创建或更新期间将更新应用到您的集群。您无需自己计划或应用更新。 | 

由于 Elastic Beanstalk 自己设置这些设置，因此您可以*通过`aws:elasticbeanstalk:eks:*`选项来配置*应用程序，而不是配置集群。请参阅[Beanstalk 集群环境的配置选项](command-options-general-eks.md)。

## 集群配置偏差
<a name="beanstalk-cluster-clusters-drift"></a>

Elastic Beanstalk 仅在它创建的集群与预期的服务管理配置相匹配时才会运行该集群。如果基础设施不再与该配置相匹配，Elastic Beanstalk 会检测配置偏差，暂停集群维护并报告环境事件：

```
ERROR  Cluster drift detected for environment 'my-cluster-env'. {{what changed}}. Service will skip cluster maintenance for this environment.
```

当集群漂移时：
+ Elastic Beanstalk 不会在上面放置新的环境。
+ Elastic Beanstalk 不再对其进行维护，包括服务管理的插件版本更新。
+ 对已经在其上运行的环境的更新失败。

漂移是可以恢复的。要进行恢复，请还原导致它的更改，以使集群再次与 Elastic Beanstalk 预期的配置相匹配。漂移事件命名了更改的内容，告诉你要恢复什么。Elastic Beanstalk 会在下次环境操作时重新评估集群，并在配置匹配时继续对其进行管理。重试失败的操作。

如果您无法恢复预期配置，请联系 AWS 支持部门。

为避免偏差，请通过 Elastic Beanstalk 操作和配置选项来更改环境，而不是直接更改集群。请参阅[Beanstalk 集群环境的配置选项](command-options-general-eks.md)。

## 群集删除
<a name="beanstalk-cluster-clusters-lifecycle"></a>

Elastic Beanstalk 计划在您终止其最后一个环境三小时后删除集群。如果您在此间隔内创建另一个具有相同子网的环境，Elastic Beanstalk 将取消待处理的清理并重复使用现有集群。

**验证服务管理基础架构的删除情况**

1. 在终止最后一个环境之前，通过 Elastic Beanstalk 记录集群 ARN。对于服务创建的集群基础架构，该 CloudFormation 模板将集群名称设置为堆栈名称。因此，集群 ARN 最后一个斜杠后的名称标识了此过程中进行只读删除验证的堆栈：

   ```
   $ aws elasticbeanstalk describe-environment-resources \
       --environment-name my-cluster-env \
       --query 'EnvironmentResources.Cluster.Name'
   ```

   该命令返回集群 ARN。堆栈名称是 ARN 最后一个斜杠之后的部分。
**重要**  
派生的堆栈名称仅适用于只读 CloudFormation 服务员，并描述了如下所示的操作。不要将其传递给或任何其他更改服务管理基础架构的操作。`delete-stack` `update-stack`

   记录集群 ARN 和派生堆栈名称；您可以将它们用于随后的只读验证步骤。

1. 按照中的步骤终止环境并验证其是否到达`Terminated`[终止 Elastic Beanstalk 环境](using-features.terminating.md)。集群清理在三小时重用间隔后单独开始；环境终止不会等待集群删除。

1. 三小时后，使用有权描述服务创建的堆栈的 IAM 委托人。 CloudFormation 服务员每 30 秒使用一次只读堆栈描述，持续时间最长 60 分钟，并在堆栈不存在时成功：

   ```
   $ aws cloudformation wait stack-delete-complete \
       --stack-name {{cluster-stack-name}}
   ```

   当堆栈不存在时，服务员成功了。如果失败，则堆栈在截止日期之后仍然存在；使用`aws cloudformation describe-stacks`和`aws cloudformation describe-stack-events`检查堆栈状态和所有`DELETE_FAILED`事件。

1. 如果服务员报告堆栈在截止日期之后仍然存在，请确定其他环境是否重复使用了该集群。列出账户和区域中活跃的 Beanstalk 集群环境：

   ```
   $ aws elasticbeanstalk describe-environments \
       --query "Environments[?Tier.Name=='Cluster' && Tier.Type=='EKS'].EnvironmentName"
   ```

   对于每个列出的环境，请阅读其集群 ARN：

   ```
   $ aws elasticbeanstalk describe-environment-resources \
       --environment-name {{environment-name}} \
       --query 'EnvironmentResources.Cluster.Name'
   ```

   如果环境的集群 ARN 与记录的集群 ARN 相匹配，则表示删除已取消以供重复使用。如果没有匹配的环境，则使用堆栈状态和`DELETE_FAILED`事件来诊断保留的资源。不要手动删除或修改服务管理的堆栈。如果堆栈在截止日期之后仍然存在，没有处于活动环境或可操作的 CloudFormation 故障，请联系 AWS 支持部门。