

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

# 为 Beanstalk 集群环境配置网络
<a name="configuring-cluster-networking"></a>

Beanstalk 集群在 Amazon EKS 集群上运行您的环境。您选择的子网做两件事：它们决定群集节点的运行位置，以及决定哪个群集运行环境。如果您不选择任何子网，Elastic Beanstalk 将使用默认 VPC 的公有子网。

本主题涵盖环境的子网、流量如何从集群外部到达您的应用程序，以及您的环境如何在集群内相互寻址。

## 环境子网
<a name="configuring-cluster-networking-subnets"></a>

将`aws:elasticbeanstalk:eks:environment`命名空间中的`subnets`选项设置为以逗号分隔的子网 ID 列表。

由于子网选择集群，因此您可以在创建环境时对其进行设置：

```
$ aws elasticbeanstalk create-environment \
    --application-name {{my-app}} \
    --environment-name {{my-cluster-env}} \
    --option-settings '[{"Namespace":"aws:elasticbeanstalk:eks:environment","OptionName":"subnets","Value":"{{subnet-abc123,subnet-def456}}"}]'
```

该设置以 JSON 格式编写，因为子网列表包含逗号， AWS CLI 速记形式将其视为字段之间的分隔符。有关 AWS CLI 接受的表单，请参阅中的[使用速记语法。 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-shorthand.html)

Elastic Beanstalk 按此子网集将环境分组到集群上，因此使用相同子网的相同账户中的环境在同一个集群上运行，而使用不同集合的环境则在不同的集群上运行。子网的顺序并不重要。有关分组规则和报告集群分配的事件，请参阅[环境分组](beanstalk-cluster-concepts.md#beanstalk-cluster-clusters-sharing)。

## 流量如何到达您的应用程序
<a name="configuring-cluster-networking-lb-type"></a>

`aws:elasticbeanstalk:eks:environment`命名空间中的`load-balancer-type`选项选择流量如何到达您的应用程序。它接受两个值：
+ `ALB`，默认。Elastic Beanstalk 为环境创建和运行应用程序负载均衡器。您可以通过`aws:elasticbeanstalk:eks:alb`命名空间对其进行配置，也可以提供您已经拥有的应用程序负载均衡器。
+ `None`。Elastic Beanstalk 不会创建负载均衡器，也无法通过 Elastic Beanstalk 从集群外部访问环境。同一集群上的其他环境仍然可以通过其集群内地址到达该集群。

## 负载均衡器网络设置
<a name="configuring-cluster-networking-alb"></a>

环境的应用程序负载均衡器在`aws:elasticbeanstalk:eks:alb`命名空间中有自己的网络设置。


| Option | 默认值 | 说明 | 
| --- | --- | --- | 
| subnets | 无 | 以逗号分隔的负载均衡器子网列表。 | 
| scheme | 源自您的子网 | 是否可以从互联网访问负载均衡器，为internet-facing或internal。如果您不进行设置，Elastic Beanstalk 将从您选择的子网中派生出来：公有子网提供面向互联网的负载均衡器，私有子网提供内部负载均衡器。 | 
| security-groups | 无 | 以逗号分隔的负载均衡器安全组列表。 | 
| manage-backend-security-group-rules | true | Elastic Beanstalk 是否管理负载均衡器和您的应用程序之间的安全组规则。 | 

## 监听器和 HTTPS
<a name="configuring-cluster-networking-listeners"></a>

例如`[{"HTTPS":443},{"HTTP":80}]`，`aws:elasticbeanstalk:eks:alb`命名空间中的`listen-ports`选项将负载均衡器的监听器列为一个 JSON 数组，该数组将每个协议映射到一个端口。

Elastic Beanstalk 确保负载均衡器在某处终止 HTTPS：
+ 如果您未设置`listen-ports`，Elastic Beanstalk 会在端口 443 上配置 HTTPS 侦听器。
+ 如果您设置了`listen-ports`并且它已经在任何端口上包含 HTTPS 侦听器，则 Elastic Beanstalk 将不变地使用您的配置。
+ 如果您设置为`listen-ports`没有 HTTPS 侦听器，Elastic Beanstalk 会在端口 443 上添加一个 HTTPS 侦听器。如果使用其他协议的监听器已经占用了端口 443，则请求将失败，并且错误提示您释放端口 443 或在其他端口上添加显式 HTTPS 侦听器。

负载均衡器仅打开其配置的监听器。使用默认配置，即端口 443 上的 HTTPS，端口 80 上没有任何配置，因此对`http://`的请求无法连接并等到超时。您的环境的 URL `https://` 后面是环境的 CNAME。`DescribeEnvironments`返回不带架构的 CNAME，因此在打开`https://`时添加。

您不提供证书才能使其起作用。Elastic Beanstalk 为环境自己的域创建 AWS Certificate Manager (ACM) 证书，将其附加到 HTTPS 侦听器并进行续订，因此浏览器无需任何配置即可信任环境的 CNAME。Elastic Beanstalk 为每个环境创建一个证书，并在您终止环境时将其删除。

要从自己的域中为环境提供服务，请将证书的 ARN 放在`certificate-arn`选项中。然后，除了 Elastic Beanstalk 创建的证书外，负载均衡器还会携带您的证书，您仍负责续订和删除您的证书。

要同时接受 HTTP 请求，请将 HTTP 侦听器添加到 HTTPS 侦听器`listen-ports``ssl-redirect`并将其设置为 HTTPS 侦听器的端口。Elastic Beanstalk 将 HTTP 侦听器上的请求重定向到您的 HTTPS 侦听器。HTTP 侦听器永远不会直接为应用程序流量提供服务。`ssl-redirect`选择重定向目标的 HTTPS 端口，如果您未设置该端口，Elastic Beanstalk 将使用您的 HTTPS 侦听器端口。`listen-ports`值本身就是 JSON 文档，因此将设置传递到文件中，而不是在命令行上写入：

```
$ cat listeners.json
[
  {
    "Namespace": "aws:elasticbeanstalk:eks:alb",
    "OptionName": "listen-ports",
    "Value": "[{\"HTTPS\":443},{\"HTTP\":80}]"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:alb",
    "OptionName": "ssl-redirect",
    "Value": "443"
  }
]
$ aws elasticbeanstalk update-environment \
    --environment-name {{my-cluster-env}} \
    --option-settings file://listeners.json
```

当您设置为或`load-balancer-type`向自己的负载均衡器提供时`None`，Elastic Beanstalk 不会添加 HTTPS 侦听器。`arn`由于`None`该环境根本没有负载均衡器，因此它没有监听器。当您提供自己的负载均衡器时，其监听器配置由您管理。

## 使用您拥有的负载均衡器
<a name="configuring-cluster-networking-byo-alb"></a>

要将现有负载均衡器置于环境的前面，请将`aws:elasticbeanstalk:eks:alb`命名空间中的`arn`选项设置为其 ARN。该值必须是应用程序负载均衡器。Elastic Beanstalk 拒绝网络负载均衡器的 ARN。

当您提供负载均衡器时，您拥有其配置：其监听器、其 TLS 证书及其架构。Elastic Beanstalk 将您的应用程序注册为目标并将您的负载均衡器报告为环境的负载均衡器，因此`DescribeEnvironmentResources`返回的是您提供的负载均衡器，而不是 Elastic Beanstalk 创建的负载均衡器。

## 没有负载均衡器的环境
<a name="configuring-cluster-networking-no-lb"></a>

当您设置`load-balancer-type`为时`None`，Elastic Beanstalk 不会为环境创建负载均衡器，也不会`DescribeEnvironmentResources`报告任何负载均衡器。将其用于仅为同一集群上的其他环境提供服务的环境，例如内部 API 或其调用者直接访问的工作程序。

需要规划的两个后果：
+ 负载均衡器运行状况信号不适用，因为没有负载均衡器可以报告请求率、错误率或延迟。使用容器探测器和可观测性后端来判断应用程序是否正常运行。请参阅[监控 Beanstalk 集群环境](monitoring-cluster-environments.md)。
+ 呼叫者通过其集群内地址到达环境，如下一节所述。

## 从一个环境中处理另一个环境
<a name="configuring-cluster-networking-service-discovery"></a>

每个 Beanstalk 集群环境都可以在其集群内部通过一个可预测的地址进行访问，该地址是根据环境名称构建的：

```
service-{{environment-name}}.eb-{{environment-name}}.svc.cluster.local:{{service-port}}
```

端口是环境的`service-port`。Elastic Beanstalk 在命名`eb-`后接环境名称的 Kubernetes 命名空间中运行每个环境，环境名称是地址的第二个标签。使用`aws:elasticbeanstalk:eks:environment`命名空间中的`env-variables`选项，将应用程序需要的地址作为环境变量传递：

的值本身就`env-variables`是一个 JSON 文档，因此将选项设置传递到文件中而不是命令行。将以下内容保存为 `options.json`：

```
[
  {
    "Namespace": "aws:elasticbeanstalk:eks:environment",
    "OptionName": "env-variables",
    "Value": "{\"NOTIFIER_URL\":\"http://service-{{my-notifier}}.eb-{{my-notifier}}.svc.cluster.local:8080\"}"
  }
]
```

然后应用它：

```
$ aws elasticbeanstalk update-environment \
    --environment-name {{my-frontend}} \
    --option-settings file://options.json
```

此寻址仅适用于在同一集群上运行的环境，这意味着使用相同子网的环境。解析地址与允许连接不同。默认情况下，Beanstalk Cluster 会阻止共享集群上环境之间的流量，因此名称会解析，并且在您允许之前，连接仍然会失败。请参阅[允许环境进行通信](beanstalk-cluster-multi-tenancy.md#beanstalk-cluster-multi-tenancy-groups)。

**注意**  
由于该地址包含环境名称，因此您需要知道环境的名称，然后其他环境才能对其进行寻址。在创建一组相互调用的环境之前，先规划好它们的名称。

## 您在创建时选择的设置
<a name="configuring-cluster-networking-immutable"></a>

创建环境后无法更改其子网，因为它们会选择其集群。这同样适用于集群、节点和可观测性角色。要在不同的子网中运行应用程序，请使用所需的子网创建一个新环境，然后交换这两个环境别名。请参阅[Blue/Green 使用 Elastic Beanstalk 进行部署](using-features.CNAMESwap.md)。