

# 适用于 Amazon ECS 蓝绿部署、线性部署和金丝雀部署的网络负载均衡器资源
<a name="nlb-resources-for-blue-green"></a>

要将网络负载均衡器用于 Amazon ECS 蓝绿部署，需要配置特定的资源，以便在蓝色服务修订版和绿色服务修订版之间进行流量路由。本节将介绍所需组件及其配置。

如果配置中包含网络负载均衡器，Amazon ECS 会在以下生命周期阶段添加 10 分钟的延迟：
+ TEST\$1TRAFFIC\$1SHIFT
+ PRODUCTION\$1TRAFFIC\$1SHIFT

此延迟用于解决网络负载均衡器的时间问题，该问题可能导致配置的流量权重与数据面板的实际流量路由不一致。

## 目标组
<a name="nlb-target-groups"></a>

对于使用网络负载均衡器的蓝绿部署，需要创建两个目标组：
+ 一个用于蓝色服务修订版（当前生产流量）的主目标组
+ 一个用于绿色服务修订版（新服务修订版）的备用目标组

两个目标组都应配置以下设置：
+ 目标类型：`ip`（适用于 Fargate 或采用 `awsvpc` 网络模式的 EC2）
+ 协议：`TCP`（或应用程序使用的协议）
+ 端口：应用程序侦听端口（HTTP 通常为 `80`）
+ VPC：与 Amazon ECS 任务相同的 VPC
+ 运行状况检查设置：配置为正确检查应用程序的运行状况

  对于 TCP 运行状况检查，网络负载均衡器会与目标建立 TCP 连接。如果连接成功，则视为目标运行正常。

  对于 HTTP/HTTPS 运行状况检查，网络负载均衡器会向目标发送 HTTP/HTTPS 请求并验证响应。

在蓝绿部署期间，Amazon ECS 会根据部署阶段自动将任务注册到相应的目标组。

**Example 为网络负载均衡器创建目标组**  
以下 AWS CLI 命令将创建两个目标组，用于使用网络负载均衡器的蓝绿部署：  

```
aws elbv2 create-target-group \
    --name blue-target-group \
    --protocol TCP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-protocol TCP

aws elbv2 create-target-group \
    --name green-target-group \
    --protocol TCP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-protocol TCP
```

## 网络负载均衡器
<a name="nlb-load-balancer"></a>

需要创建具有以下配置的网络负载均衡器：
+ 方案：面向互联网或内部（视需求而定）
+ IP 地址类型：IPv4
+ VPC：与 Amazon ECS 任务相同的 VPC
+ 子网：至少两个位于不同可用区的子网

与应用程序负载均衡器不同，网络负载均衡器在传输层（第 4 层）运行，不使用安全组。相反，需要确保与 Amazon ECS 任务关联的安全组允许来自网络负载均衡器的流量通过侦听器端口。

**Example 创建网络负载均衡器**  
以下 AWS CLI 命令将创建用于蓝绿部署的网络负载均衡器：  

```
aws elbv2 create-load-balancer \
    --name my-network-load-balancer \
    --type network \
    --subnets subnet-12345678 subnet-87654321
```

## 使用 NLB 进行蓝绿部署的注意事项
<a name="nlb-considerations"></a>

使用网络负载均衡器进行蓝绿部署时，请考虑以下事项：
+ **第 4 层操作**：网络负载均衡器在传输层（第 4 层）运行，不检查应用程序层（第 7 层）的内容。这意味着您无法使用 HTTP 标头或路径进行路由决策。
+ **运行状况检查**：网络负载均衡器运行状况检查仅限于 TCP、HTTP 或 HTTPS 协议。对于 TCP 运行状况检查，网络负载均衡器仅验证是否可以建立连接。
+ **连接保存**：网络负载均衡器会保留客户端的源 IP 地址，可用于安全和日志记录目的。
+ **静态 IP 地址**：网络负载均衡器为每个子网提供静态 IP 地址，可用于列入白名单或将客户端连接到固定 IP 地址。
+ **测试流量**：网络负载均衡器不支持基于内容的路由，因此必须将测试流量发送到与生产流量不同的端口。

## 侦听器和规则
<a name="nlb-listeners"></a>

对于使用网络负载均衡器的蓝绿部署，需要配置以下侦听器：
+ 生产侦听器：处理生产流量（通常在端口 80 或 443 上）
  + 一开始，先将流量转发到主目标组（蓝色服务修订版）
  + 部署后，将流量转发到备用目标组（绿色服务修订版）
+ 测试侦听器（可选）：处理测试流量，以便在转移生产流量之前验证绿色服务修订版
  + 可以在不同的端口（例如 8080 或 8443）上进行配置
  + 在测试期间将流量转发到备用目标组（绿色服务修订版）

与应用程序负载均衡器不同，网络负载均衡器不支持基于内容的路由规则。相反，流量是根据侦听器端口和协议进行路由的。

以下 AWS CLI 命令将为网络负载均衡器创建生产和测试侦听器：

将 *user-input* 替换为您的值。

```
aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/net/my-network-lb/1234567890123456 \
    --protocol TCP \
    --port 80 \
    --default-actions Type=forward, TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/blue-target-group/1234567890123456

aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/net/my-network-lb/1234567890123456 \
    --protocol TCP \
    --port 8080 \
    --default-actions Type=forward, TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/1234567890123456
```

## 服务配置
<a name="nlb-service-configuration"></a>

必须拥有允许 Amazon ECS 代表您管理集群中负载均衡器资源的权限。有关更多信息，请参阅 [适用于负载均衡器的 Amazon ECS 基础设施 IAM 角色](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)。

在为使用网络负载均衡器的蓝绿部署创建或更新 Amazon ECS 服务时，需要指定以下配置：

将 *user-input* 替换为您的值。

此配置中的关键组件包括：
+ `targetGroupArn`：主目标组（蓝色服务修订版）的 ARN
+ `alternateTargetGroupArn`：备用目标组（绿色服务修订版）的 ARN
+ `productionListenerRule`：适用于生产流量的侦听器的 ARN
+ `testListenerRule`（可选）：适用于测试流量的侦听器的 ARN
+ `roleArn`：允许 Amazon ECS 管理网络负载均衡器资源的角色的 ARN
+ `strategy`：设置为 `BLUE_GREEN` 以启用蓝绿部署
+ `bakeTimeInMinutes`：生产流量转移后，蓝色服务修订版和绿色服务修订版同时运行的持续时间

```
{
    "loadBalancers": [
        {
            "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/blue-target-group/1234567890123456",
            "containerName": "container-name",
            "containerPort": 80,
            "advancedConfiguration": {
                "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/1234567890123456",
                "productionListenerRule": "arn:aws:elasticloadbalancing:region:123456789012:listener/net/my-network-lb/1234567890123456/1234567890123456",
                "testListenerRule": "arn:aws:elasticloadbalancing:region:123456789012:listener/net/my-network-lb/1234567890123456/2345678901234567",
                "roleArn": "arn:aws:iam::123456789012:role/ecs-nlb-role"
            }
        }
    ],
    "deploymentConfiguration": {
        "strategy": "BLUE_GREEN",
        "maximumPercent": 200,
        "minimumHealthyPercent": 100,
        "bakeTimeInMinutes": 5
    }
}
```

## 部署期间的流量流
<a name="nlb-traffic-flow"></a>

在使用网络负载均衡器进行蓝绿部署期间，流量按如下方式流经系统：

1. *初始状态*：所有生产流量均路由到主目标组（蓝色服务修订版）。

1. *绿色服务修订版部署*：Amazon ECS 部署新任务并将其注册到备用目标组。

1. *测试流量*：如果配置了测试侦听器，则会将测试流量路由到备用目标组以验证绿色服务修订版。

1. *生产流量转移*：Amazon ECS 更新生产侦听器，将流量路由到备用目标组（绿色服务修订版）。

1. *烘焙时间*：生产流量转移后，蓝色服务修订版和绿色服务修订版同时运行的持续时间。

1. *完成*：成功部署后，蓝色服务修订版将终止。

如果在部署期间检测到问题，Amazon ECS 可以通过将流量路由回主目标组（蓝色服务修订版）实现自动回滚。