在 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。创建以下安全组并配置其入站和出站规则:
1. 应用负载均衡器 (ALB) 安全组
- 入站
- HTTP
80和 HTTPS443来自0.0.0.0/0(任何地方)
- HTTP
- 出站
- 自定义 TCP
9080到 APISIX DP 安全组
- 自定义 TCP
2. APISIX 控制面 (CP) 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - TCP
9180来自受信任的来源,例如堡垒机或你自己的 APISIX Admin IP 范围
- SSH
- 出站
- 自定义 TCP
2379到 ETCD 安全组 - HTTP
80和 HTTPS443到0.0.0.0/0(任意地址),用于安装软件包和拉取 APISIX 镜像
- 自定义 TCP
3. APISIX 数据面 (DP) 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - 自定义 TCP
9080来自 ALB 安全组
- SSH
- 出站
- 自定义 TCP
2379到 ETCD 安全组 - HTTP
80和 HTTPS443到0.0.0.0/0(任何地方)
- 自定义 TCP
4. etcd 安全组
- 入站
- SSH
22来自受信任的来源,例如堡垒机或你自己的 IP 范围 - 自定义 TCP
2379来自 APISIX CP 安全组 - 自定义 TCP
2379来自 APISIX DP 安全组
- SSH
- 出站
- HTTP
80和 HTTPS443到0.0.0.0/0(任意地址),用于下载 etcd
- HTTP

安装步骤会下载软件包、etcd 发行版和 APISIX 容器镜像。请确保每个所选子网均提供受控的 Internet 出站访问。私有子网需要 NAT 网关或等效的出站路径;公有子网需要指向 Internet 网关的路由,且下载这些依赖的每个实例都必须具有公网 IP 地址。
启动 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.32'
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 控制台的“连接”选项)。安装 Docker 以运行 APISIX:
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable --now docker
创建 APISIX 配置目录:
sudo mkdir -p /etc/apisix
sudo vi /etc/apisix/config.yaml
创建 /etc/apisix/config.yaml,将此实例配置为控制面并连接到 etcd:
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 控制面,以便可以从 EC2 实例访问其 Admin API 端口:
sudo docker run -d \
--name apisix-cp \
--restart unless-stopped \
--network host \
-v /etc/apisix/config.yaml:/usr/local/apisix/conf/config.yaml:ro \
apache/apisix:3.17.0-ubuntu
创建启动模板
在本节中,将使用启动模板来定义如何创建 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 > CloudWatch monitoring: 启用详细监控,使 CPU 目标跟踪策略能够获取一分钟粒度的指标。详细监控会产生额外费用。
- Advanced details > User data: 粘贴以下脚本。
#!/bin/bash
set -e
# 请替换为 etcd 实例的私有 IP
ETCD_IP="172.31.19.201"
APISIX_IMAGE="apache/apisix:3.17.0-ubuntu"
# 安装并启动 Docker
apt-get update
apt-get install -y docker.io
systemctl enable --now docker
# 创建 APISIX 配置
mkdir -p /etc/apisix
cat >/etc/apisix/config.yaml <<EOF
deployment:
role: data_plane
role_data_plane:
config_provider: etcd
etcd:
host:
- http://${ETCD_IP}:2379
EOF
# 将 APISIX 作为数据面启动
docker run -d \
--name apisix-dp \
--restart unless-stopped \
--network host \
-v /etc/apisix/config.yaml:/usr/local/apisix/conf/config.yaml:ro \
${APISIX_IMAGE}
查看你的配置并创建模板。

创建自动扩缩容组 (ASG)
自动扩缩容组 (ASG) 根据需求自动调整部署中的 EC2 实例数量。通过使用 ASG,你可以确保 APISIX DP(网关)在高流量期间横向扩展,并在流量减少时缩减,从而保持一致的 API 性能。
导航到 EC2 > Auto Scaling Groups 并使用以下配置创建 ASG:
- Launch Template: 选择上一步中创建的 APISIX DP 实例的启动模板。
- Network Settings: 选择适当的 VPC、可用区和子网。如果使用 ALB,这里选择的每个可用区也必须在 ALB 上启用。
- 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% 以下时删除实例。
- Scaling policy name:
查看你的配置并创建 ASG。
创建 ASG 后,你应该会看到 ASG 启动一个新的 EC2 实例用于 APISIX 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。
- 选择至少两个可用区及其对应的子网。启用 ASG 可能使用的所有可用区,否则启动到其他可用区的 DP 实例虽会保持注册,但无法接收 ALB 流量。
- 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 启用 Elastic Load Balancing health checks,并设置足够长的健康检查宽限期,以便完成实例初始化、镜像拉取和 APISIX 启动。

附加后,ASG 将自动向目标组注册新的 APISIX DP 实例,并在实例终止或缩减时移除实例。
验证 ALB 路由
ALB 仅将流量路由到健康目标。为了确保你的 APISIX DP 可达,请检查 ALB 目标组中目标的健康状态:

接下来,导航到 ALB 详细信息以查找其 DNS 名称,例如:
apisix-alb-xxxxxxxxx.ap-southeast-2.elb.amazonaws.com
从本地计算机,向健康检查路由(或任何路由)发送请求,以验证流量是否正确通过 ALB 路由:
curl "http://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 命令运行时观察扩缩容:
-
导航到 CloudWatch > Metrics 并选择 APISIX DP ASG 的
CPUUtilization指标。你应该看到平均 CPU 利用率逐渐增加到 50% 以上。
-
导航到 APISIX DP ASG 并监控 Instances 和 Desired capacity 值。你应该看到所需容量增加,并启动新的 DP 实例。具体容量取决于观测到的平均 CPU 利用率,不一定会达到最大容量。

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

这确认了 APISIX DP 实例由 ASG 根据 CPU 负载自动扩缩容。
清理资源
不再需要本指南中创建的资源时,请将其删除以避免持续产生费用:
- 删除 ASG,并等待其 DP 实例终止。
- 删除 ALB 及其目标组。
- 删除 DP 启动模板。
- 终止 CP 和 etcd 实例。
- 删除所有关联资源和网络接口后,再删除安全组。
还请检查与该部署关联且仍保留的 EBS 卷、Elastic IP 地址和 CloudWatch 告警,并删除不再需要的资源。