在 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.18.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.18.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}
查看你的配置并创建模板。
