

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

# Multi-tenancy 适用于 Beanstalk 集群环境
<a name="beanstalk-cluster-multi-tenancy"></a>

使用相同子网的 Beanstalk 集群环境在同一 Amazon EKS 集群上运行，因此它们共享计算基础设施。Elastic Beanstalk 在共享集群上将它们分开：每个环境的应用程序在自己的集群分区中运行，而 Elastic Beanstalk 默认情况下会阻塞环境之间的网络流量。本主题描述了您获得的分离、如何扩大或收紧分离，以及共享集群无法满足的要求。

Beanstalk 集群环境之间的隔离有两个独立的维度。网络隔离控制哪些环境可以向环境的应用程序发送流量。计算隔离控制环境的应用程序副本是否与其他环境共享节点。您可以配置其中一个而不配置另一个。

## 选择隔离边界
<a name="beanstalk-cluster-multi-tenancy-boundary"></a>

在创建环境之前，先确定环境需要多强的边界，因为选择是通过分配的子网做出的，您无法更改现有环境的子网。有两个边界可用，它们对应于 Amazon EKS 记录的两种多租户模型。


| 边界 | 你怎么得到的 | 它有什么区别 | 
| --- | --- | --- | 
| 共享集群（软多租户） | 使用相同的子网集创建环境。这是环境共享 VPC 配置时的默认设置。 | 每个环境的应用程序都在自己的群集分区中运行，默认情况下，环境之间的网络流量会被阻塞。除非您配置专用节点，否则环境会共享群集本身并共享节点。 | 
| 独立集群（硬多租户） | 使用不同的子网集创建环境。然后，Elastic Beanstalk 为每个集合创建一个单独的集群。 | 什么都不共享。不同的集群有单独的控制平面、不同的节点，在其上运行的应用程序之间没有网络路径。 | 

共享集群提供环境之间的逻辑分离，由 Elastic Beanstalk 应用于集群的配置强制执行。单独的集群提供基础架构隔离。Amazon EKS 将集群记录为提供强大安全边界的结构，因为获得节点访问权限的工作负载可能会访问该节点上运行的任何其他设备的凭证和数据。集群内的逻辑分离是软多租户；每个租户的集群是硬多租户。有关这反映的一般指导，请参阅《* Amazon EKS 最佳实践指南》[中的](https://docs.aws.amazon.com/eks/latest/best-practices/tenant-isolation.html)租户隔离*。

**重要**  
当环境运行不得共享基础架构的工作负载时，使用单独的子网集，从而使用单独的集群。示例包括属于业务不同终端客户的环境、运行您无法控制的代码的环境以及合规制度范围内需要基础架构分离的环境。本主题其余部分中描述的控件将共享集群上的环境分开，但它们并不使共享集群等同于单独的集群。

单独的集群成本更高，容量的使用效率更低，因为每个集群单独计费，节点不能在集群之间共享。对于一个团队共同拥有和运行的环境（例如构成单个应用程序的服务），共享集群是正确的选择。将生产与开发分开是使用不同子网集的常见原因，即使没有必要也是如此。有关 Elastic Beanstalk 如何将环境分组到集群中，请参阅。[环境分组](beanstalk-cluster-concepts.md#beanstalk-cluster-clusters-sharing)有关子网设置本身，请参阅[为 Beanstalk 集群环境配置网络](configuring-cluster-networking.md)。

## 共享集群上的网络隔离
<a name="beanstalk-cluster-clusters-isolation"></a>

默认情况下，Elastic Beanstalk 会阻止共享集群上的 Beanstalk 集群环境之间的网络流量。无需进行任何配置即可获得此功能，也没有任何选项可以将其关闭。除非您使用本节中的任一选项允许，否则环境的应用程序副本无法在任何端口上接收来自其他环境应用程序副本的流量。

Elastic Beanstalk 允许自己的操作组件访问您的应用程序，因此运行状况报告、日志收集和基于指标的扩展可以继续发挥作用。

通过负载均衡器到达环境的流量不受影响。阻塞适用于从一个环境的应用程序副本直接发送到另一个环境的应用程序副本的流量，不适用于来自集群外部的流量。通过应用程序负载均衡器到达您的应用程序的请求通常会被传送，包括其他环境发送到该负载均衡器的公共端点的请求。

### 允许环境进行通信
<a name="beanstalk-cluster-multi-tenancy-groups"></a>

`aws:elasticbeanstalk:eks:environment`命名空间中的三个选项允许共享集群环境之间的流量。每个都采用一个以逗号分隔的列表。名称仅限于字符`a-z`、`A-Z``0-9`、和`-`；它们必须以字母开头，长度为 4 到 40 个字符。更改其中任何一个都不会中断环境。


| Option | 效果 | 什么时候使用 | 
| --- | --- | --- | 
| ingress-groups | 将环境加入一个或多个命名组。一个组中的每个环境都可以向该组中的所有其他环境双向发送流量。一个环境可以属于多个组。 | 一组环境都需要相互调用，例如一个应用程序的服务。 | 
| ingress-allowlist-environments | 允许命名环境向该环境发送流量。权限是一种方式：在此处命名环境不允许该环境调用它。 | 环境为特定其他环境调用的内部 API 提供服务。 | 
| ingress-allowlist-groups | 允许指定组中的每个环境在不加入这些组的情况下单向向该环境发送流量。 | 一个环境为一组已经共享一个群组的呼叫者提供服务，他们不得作为回报获得访问权限。 | 

在加入群组的每个环境`ingress-groups`上设置；群组成员资格不是从一个地方配置的。当您从组`ingress-groups`值中移除组或终止该环境时，环境会离开该组。在*接收*流量的环境上设置允许名单选项，命名要允许的呼叫者。

这两种机制结合在一起。环境可以以对等身份加入群组以使用其服务的群组，并单独将必须单向拨打该群组的呼叫者列入许可名单。有关如何在环境上设置配置选项，请参阅[配置选项](command-options.md)。

允许流量并不能配置发现。您的应用程序仍然需要知道要调用哪个地址，您通过环境属性提供该地址的方式与提供任何其他设置的方式相同。Elastic Beanstalk 不会注入您允许的环境的地址。

## 环境的专用节点
<a name="beanstalk-cluster-multi-tenancy-nodes"></a>

默认情况下，Elastic Beanstalk 将来自任何环境的应用程序副本调度到集群的共享节点容量上，因此来自不同环境的副本可以在同一个节点上运行。要将环境的应用程序副本保留在其他环境未使用的节点上，请将`aws:elasticbeanstalk:eks:environment`命名空间中的`node-pool`选项设置为您选择的名称。

然后，Elastic Beanstalk 会为该名称保留一组节点，并仅将来自具有相同`node-pool`值的环境的应用程序副本调度到这些节点上。不能将未设置值或其他值的环境放置在这些节点上。

**重要**  
共享`node-pool`价值的环境彼此共享节点。要为单个环境节点赋予其他任何其他环境都不使用的值，请为其指定一个其他环境不使用的值。

更改`node-pool`会重新启动环境的应用程序副本，这样 Elastic Beanstalk 就可以将它们重新安排到正确的节点上。专用节点还可以减少一个环境的资源使用对另一个环境的影响，因为这些环境不再争夺同一个节点的 CPU 和内存。专用节点独立于网络隔离：环境可以在不同的节点上运行，但仍允许通信，或共享节点并被禁止通信。

`node-pool`为专门针对节点容量的要求进行预留。如果您的目标是将环境彼此分开，则为它们提供不同的子网会更简单，并且可以将集群和节点分开。

## 共享集群不能分离的内容
<a name="beanstalk-cluster-multi-tenancy-limits"></a>

在将具有不同安全性或合规性要求的环境置于同一个集群上之前，请先了解这些限制。它们中的每一个都是环境共享一个集群的结果，通过为环境提供不同的子网，这样 Elastic Beanstalk 可以创建单独的集群，从而将每个集群移除。
+ **出站流量不受限制。**默认分隔会阻止到达环境的流量。它不限制环境的应用程序可以将流量发送到何处。应用程序可以到达其网络配置和其 IAM 权限允许的任何目的地，包括互联网和其他 AWS 服务。没有任何选项可以限制来自 Beanstalk 集群环境的出站流量。
+ **集群的控制平面是共享的。**集群上的每个环境都由一个 Amazon EKS 控制平面提供服务，其 Kubernetes 版本在集群的生命周期内是固定的。Elastic Beanstalk 负责操作控制平面，您无需对其进行配置，但不会在每个环境中对其进行复制。
+ **除非您配置专用节点，否则节点是共享的。**否`node-pool`则，来自不同环境的应用程序副本在相同的节点上运行，并使用相同的 CPU 和内存。Elastic Beanstalk 不为每个环境预留节点容量。
+ **Cluster-wide 故障会影响集群上的每个环境。**如果 Elastic Beanstalk 因为集群的基础设施不再符合预期配置而停止管理该集群，则该集群上的每个环境的更新都会失败，直到偏差得到解决。恢复是针对每个集群而不是每个环境进行的：恢复导致它的更改，然后 Elastic Beanstalk 将恢复管理集群及其所有环境。请参阅[集群配置偏差](beanstalk-cluster-concepts.md#beanstalk-cluster-clusters-drift)。

Application-level 在任一边界内，保护都是你的责任。环境之间的网络隔离不会对呼叫者进行身份验证、加密环境之间的流量，也不会限制应用程序使用其持有的凭据执行的操作。为每个环境赋予自己的应用程序角色，使其 AWS 权限限限定在其范围内，并将环境之间允许的流量视为应用程序仍必须授权的流量。请参阅[应用程序权限](beanstalk-cluster-permissions.md#beanstalk-cluster-permissions-application)。

## 将要求与控件相匹配
<a name="beanstalk-cluster-multi-tenancy-choosing"></a>


| 要求 | 控件 | 
| --- | --- | 
| 环境不得共享基础架构 | 使用不同的子网集创建它们，这样 Elastic Beanstalk 就会为每个子网创建一个单独的集群。在创建环境之前先决定这一点；之后不能更改子网。 | 
| 环境不得通过网络相互接触 | 没有配置。这是共享集群的默认设置。 | 
| 一组环境必须互相调用 | 将它们分别设置ingress-groups为相同的组名。 | 
| 一个环境必须接受来自其他特定环境的呼叫，但不能相反 | ingress-allowlist-environments在接收流量的环境上设置或ingress-allowlist-groups。 | 
| 环境的应用程序副本不得与其他环境共享节点 | 设置node-pool为其他环境不使用的值。 | 
| 必须限制环境的出站流量 | 无法通过配置选项获得。在应用程序中对其进行限制，或者通过分配给环境的子网的网络配置对其进行限制。 | 