跳到主要内容

在 AWS EC2 上自动扩缩容 APISIX 网关

自动扩缩容是一种根据流量负载自动调整网关可用资源的机制,确保在不同的流量负载下保持一致的性能。

本指南将引导你在 EC2 上以 解耦模式 部署 APISIX,为 APISIX 网关(也称为 APISIX 数据平面或 DP)配置自动扩缩容组 (ASG),定义扩缩容策略,并通过简单的负载测试验证扩缩容行为,以便你的网关可以自动响应流量变化。

前置条件

  • 一个 AWS 帐户。
  • 足够的 IAM 权限来创建和管理以下 AWS 资源:
    • EC2 实例
    • 自动扩缩容组 (Auto Scaling Groups)
    • 启动模板 (Launch Templates)
    • 安全组 (Security Groups)
  • 确保你在目标 AWS 区域中配置了 VPC,并为你的 EC2 实例配置了必要的子网。

配置安全组

此图直观地显示了 APISIX 及其支持组件之间的流量,突出了每个安全组的目的以及需要配置的规则:


备注

以下安全组配置仅供参考。它们遵循最小权限原则,并假设存在用于向 APISIX DP 实例分发流量的 ALB。你应该根据自己的网络和安全要求调整这些规则。

在 AWS 控制台中,导航到 EC2 > Security Groups。创建以下安全组 (SG) 并配置其入站和出站规则:

1. 应用负载均衡器 (ALB) 安全组

  • 入站
    • HTTP 80 和 HTTPS 443 来自 0.0.0.0/0 (任何地方)
  • 出站
    • 自定义 TCP 9080 到 APISIX DP 安全组

2. APISIX 控制平面 (CP) 安全组

  • 入站
    • SSH 22 来自受信任的来源,例如堡垒机或你自己的 IP 范围
    • TCP 9180 来自受信任的来源,例如堡垒机或你自己的 APISIX Admin IP 范围
  • 出站
    • 自定义 TCP 2379 到 ETCD 安全组

3. APISIX 数据平面 (DP) 安全组

  • 入站
    • SSH 22 来自受信任的来源,例如堡垒机或你自己的 IP 范围
    • 自定义 TCP 9080 来自 ALB 安全组
  • 出站
    • 自定义 TCP 2379 到 ETCD 安全组
    • HTTP 80 和 HTTPS 4430.0.0.0/0 (任何地方)

4. etcd 安全组

  • 入站
    • SSH 22 来自受信任的来源,例如堡垒机或你自己的 IP 范围
    • 自定义 TCP 2379 来自 APISIX CP 安全组
    • 自定义 TCP 2379 来自 APISIX DP 安全组
  • 出站
    • 自定义 TCP 2379 到 APISIX CP 安全组
    • 自定义 TCP 2379 到 APISIX DP 安全组

在 AWS 中创建的安全组

启动 EC2 实例

在本节中,你将启动 EC2 实例并安装 etcd 和 APISIX CP。

备注

为了简单起见,本节将引导你安装单个 etcd 实例和单个 APISIX CP 实例,因为本指南重点关注 DP 自动扩缩容。在生产环境中,建议在集群中运行多个 etcd 节点以确保高可用性和容错能力。

安装使用 amd64 架构上的 Ubuntu EC2 实例。如果你选择不同的 Linux 发行版或架构,请相应调整安装脚本。

你将在后面定义启动模板并使用 ASG 自动创建和扩展 APISIX DP 实例,而不是手动创建 APISIX DP 实例。

etcd

导航到 EC2 并启动一个 EC2 实例以托管 etcd,配置如下:

  • AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整安装步骤。
  • Instance type: 选择适合你工作负载的大小。
  • Key pair: 选择现有的密钥对或创建一个新的密钥对。通过 SSH 连接到 EC2 实例需要此密钥。如果你在没有密钥对的情况下继续操作,你仍然可以使用 AWS 控制台的“连接”选项连接到实例,但无法从本地计算机进行 SSH 访问。
  • Network settings: 选择 VPC 并选择现有的 etcd 安全组。

查看你的配置并启动实例。

实例启动后,记下其私有 IP,etcd 和 APISIX 将使用该 IP 进行通信:

# 替换为你的 etcd 实例的私有 IP
ETCD_INSTANCE_PRIVATE_IP=172.31.19.201

连接到实例(使用 SSH 或 AWS 控制台的“连接”选项)并运行以下命令以安装 etcd:

# 下载并解压 etcd
ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz

# 复制二进制文件到 /usr/bin
cd etcd-v${ETCD_VERSION}-linux-amd64
sudo cp -a etcd etcdctl /usr/bin/

# 启动 etcd
nohup etcd \
--name s1 \
--data-dir /tmp/etcd-data \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://${ETCD_INSTANCE_PRIVATE_IP}:2379 \
>/tmp/etcd.log 2>&1 &

APISIX CP

导航到 EC2 并启动一个 EC2 实例以托管 APISIX CP,配置如下:

  • AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整安装步骤。
  • Instance type: 选择适合你工作负载的大小。
  • Key pair: 选择现有的密钥对或创建一个新的密钥对。通过 SSH 连接到 EC2 实例需要此密钥。如果你在没有密钥对的情况下继续操作,你仍然可以使用 AWS 控制台的“连接”选项连接到实例,但无法从本地计算机进行 SSH 访问。
  • Network settings: 选择 VPC 并选择现有的 APISIX CP 安全组。

查看你的配置并启动实例。

连接到实例(使用 SSH 或 AWS 控制台的“连接”选项)。运行以下命令以安装 APISIX:

# 添加密钥和仓库 (amd64)
wget -O - http://repos.apiseven.com/pubkey.gpg | sudo apt-key add -
echo "deb http://repos.apiseven.com/packages/debian bullseye main" | sudo tee /etc/apt/sources.list.d/apisix.list

# 更新包并安装 APISIX
sudo apt update
sudo apt install -y apisix=3.14.0-0

编辑 APISIX 配置文件:

sudo vi /usr/local/apisix/conf/config.yaml

更新配置以将此实例配置为控制平面并将其连接到 etcd:

config.yaml
deployment:
role: control_plane
role_control_plane:
config_provider: etcd
etcd:
host:
- http://172.31.19.201:2379 # 替换为你的 etcd 实例的私有 IP
admin:
admin_key:
- name: admin
key: 'Sup3rs3cretWr1teK3y' # 替换为你的 admin key
role: admin

初始化配置并启动 APISIX 服务器:

sudo apisix init
sudo apisix start

创建启动模板

在本节中,将使用启动模板来定义如何创建 APISIX DP 实例。它包含 ASG 用于启动和管理 DP 实例的实例配置——例如 AMI、实例类型、安全组和启动脚本。

使用启动模板可确保一致地创建所有 DP 实例,并允许 ASG 随着流量变化自动添加或删除实例。

导航到 EC2 > Launch Templates 并使用以下配置创建启动模板:

  • Auto Scaling guidance: 启用此选项以指示该模板将由 ASG 使用。
  • AMI (Amazon Machine Image): 选择 Ubuntu。如果愿意,你可以使用不同的 Linux 发行版,但请确保相应调整用户数据脚本。
  • Instance type: 选择适合你工作负载的大小。
  • Network settings: 选择现有的 APISIX DP 安全组。
  • Advanced details > User data: 粘贴以下脚本。
#!/bin/bash
set -e

# 替换为你的 etcd 实例的私有 IP
ETCD_IP="172.31.19.201"
APISIX_VERSION="3.14.0-0"

# 添加 APISIX 仓库 (amd64)
wget -O - http://repos.apiseven.com/pubkey.gpg | apt-key add -
echo "deb http://repos.apiseven.com/packages/debian bullseye main" \
> /etc/apt/sources.list.d/apisix.list

# 安装 APISIX
apt update
apt install -y apisix=${APISIX_VERSION}

# 将 APISIX 配置为 DP
cat >/usr/local/apisix/conf/config.yaml <<EOF
deployment:
role: data_plane
role_data_plane:
config_provider: etcd
etcd:
host:
- http://${ETCD_IP}:2379
EOF

# 初始化并启动 APISIX
apisix init
apisix start

查看你的配置并创建模板。

在 AWS 中创建的启动模板

创建自动扩缩容组 (ASG)

自动扩缩容组 (ASG) 根据需求自动调整部署中的 EC2 实例数量。通过使用 ASG,你可以确保 APISIX DP(网关)在高流量期间横向扩展,并在流量减少时缩减,从而保持一致的 API 性能。

导航到 EC2 > Auto Scaling Groups 并使用以下配置创建 ASG:

  • Launch Template: 选择上一步中创建的 APISIX DP 实例的启动模板。
  • Network Settings: 选择适当的 VPC、可用区和子网。
  • Load Balancer: 如果负载均衡器当前不可用,请选择 No Load Balancer,或者如果已配置,请选择适当的负载均衡器和目标组。
  • Group size:Desired capacity 设置为 1(根据你的工作负载根据需要进行调整)。
  • Scaling:
    • Min desired capacity 设置为 1,将 Max desired capacity 设置为 5(根据你的工作负载根据需要进行调整)。
    • 选择 Target tracking scaling policy
      • Scaling policy name: Scale on CPU
      • Target value: 50。这意味着当 CPU 超过 50% 时,ASG 将添加 APISIX DP 实例,而在 CPU 降至 50% 以下时删除实例。

查看你的配置并创建 ASG。

创建 ASG 后,你应该会看到 ASG 启动一个新的 EC2 实例用于 APISIX DP,以满足所需的容量。

ASG 启动一个 DP 实例,所需容量也是一个

验证 CP 和 DP 连接性

连接到 APISIX CP 的 EC2 实例(使用 SSH 或 AWS 控制台的“连接”选项)。

在实例中,使用 mocking 插件创建一个示例路由,以便对 /200 的请求始终返回 200 响应,而不转发到任何上游:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: Sup3rs3cretWr1teK3y" \
-d '{
"id": "mocking200",
"uri": "/200",
"plugins": {
"mocking": {
"response_status": 200,
"response_example": "200 OK from mocking plugin"
}
}
}'

接下来,连接到 APISIX DP 的 EC2 实例(使用 SSH 或 AWS 控制台的“连接”选项)。

在实例中,向 /200 路由发送请求:

curl "http://127.0.0.1:9080/200" -i

你应该收到 HTTP/1.1 200 OK 响应。

关于健康检查

/200 端点稍后可用于 ALB 健康检查。或者,你可以启用 APISIX 的 Status API(默认端口 7085)并使用 /status 端点进行健康检查。

配置应用负载均衡器 (ALB)

应用负载均衡器 (ALB) 分发传入流量并执行健康检查,以确保流量仅路由到健康的实例。

备注

虽然本指南稍后通过直接向 APISIX DP 实例施加 CPU 负载而不是通过 ALB 来验证自动扩缩容,但为了完整性,本节包含 ALB 配置说明。在 ALB 后面部署 APISIX 的用户可以检查本节中的说明,以确保流量正确路由到 ASG 管理的网关实例,并可选择使用基于 ALB 的 CloudWatch 指标进行扩缩容。

创建目标组

创建 ALB 将用于将流量路由到 APISIX DP 实例的目标组。

导航到 EC2 > Target Groups 并使用以下配置创建目标组:

  • Target type: Instance
  • Protocol: HTTP
  • Port: 9080
  • VPC: 选择与你的 ASG 相同的 VPC。
  • Health check path: /200(或 APISIX 暴露的另一个有效健康检查端点)
  • Register targets: 不要手动注册特定实例。附加目标组后,ASG 将处理实例注册。

完成目标组创建并记下目标组名称,因为在将 ALB 附加到 ASG 时将引用该名称。

创建 ALB

导航到 EC2 > Load Balancers 并使用以下配置创建 ALB:

  • Scheme: Internet-facing
  • IP address type: IPv4.
  • Network mapping:
    • 选择 ASG 使用的相同 VPC。
    • 选择至少两个可用区及其对应的子网。
  • Security groups: 选择现有的 ALB 安全组。
  • Listeners and routing:
    • 在端口 80 上创建 HTTP 侦听器(如果配置了 TLS,则在端口 443 上创建 HTTPS)。
    • 对于默认操作,将流量转发到之前创建的 APISIX DP 目标组。

查看你的配置并创建 ALB。

将目标组附加到 ASG

将目标组附加到 ASG,以便新启动的 APISIX DP 实例将自动注册到目标组。

  • 导航到 Auto Scaling Groups 并选择 APISIX DP ASG。
  • Integrations > Load balancing 部分下编辑 Load balancer target groups
  • 选择 Attach to an existing load balancer
  • 附加之前创建的 APISIX DP 目标组并保存更改。

将目标组附加到 ASG

附加后,ASG 将自动向目标组注册新的 APISIX DP 实例,并在实例终止或缩减时取消注册实例。

验证 ALB 路由

ALB 仅将流量路由到健康目标。为了确保你的 APISIX DP 可达,请检查 ALB 目标组中目标的健康状态:

目标组健康检查显示一个健康目标

接下来,导航到 ALB 详细信息以查找其 DNS 名称,例如:

apisix-alb-xxxxxxxxx.ap-southeast-2.elb.amazonaws.com

从本地计算机,向健康检查路由(或任何路由)发送请求,以验证流量是否正确通过 ALB 路由:

curl apisix-alb-xxxxxxxxx.ap-southeast-2.elb.amazonaws.com/200 -i

如果一切配置正确,你应该收到 200 OK response

验证自动扩缩容

为了确认你的 APISIX DP ASG 工作正常,你可以使用 stress 实用程序模拟 DP 实例上的高 CPU 负载。这允许你观察当 CPU 使用率超过扩缩容阈值时是否自动启动新的 DP 实例。

连接到 DP 实例(使用 SSH 或 AWS 控制台的“连接”选项)并运行以下命令以安装 stress

sudo apt update
sudo apt install -y stress

检查可用 CPU 核心数:

nproc

假设有 2 个可用 CPU 核心。对两个核心施加 CPU 负载 600 秒(10 分钟):

stress --cpu 2 --timeout 600 &

stress 命令运行时观察扩缩容:

  1. 导航到 CloudWatch > Metrics 并选择 APISIX DP ASG 的 CPUUtilization 指标。你应该看到平均 CPU 利用率逐渐增加到 50% 以上。

    CloudWatch 指标

  2. 导航到 APISIX DP ASG 并监控 InstancesDesired capacity 值。随着自动扩缩容的进行,你应该看到这些值逐渐增加到 Max desired capacity

    扩展到最大实例数

stress 命令运行完成后,你应该看到 CPU 利用率随着时间的推移而下降。在缩减评估和冷却期之后,ASG 会逐渐终止多余的实例。

缩减

这确认了 APISIX DP 实例由 ASG 根据 CPU 负载自动扩缩容。

下一步

在本指南中,你已经学会了如何在 EC2 上基于 CPU 利用率实现 APISIX 网关实例的自动扩缩容。鼓励你进一步探索其他指标和策略,以针对你的工作负载优化自动扩缩容。有关更多信息,请参阅 Amazon EC2 Auto Scaling 的动态扩展