数据面弹性
API7 网关数据面节点会将配置缓存在内存中,因此在控制面(CP)短暂中断时仍可继续处理流量。但是,如果中断持续时间较长,例如发生数据库故障、控制面升级或灾难恢复,无法连接 CP 的节点在重启后将无法加载配置。
在你已经规划好流量服务节点的扩展和高可用性之后,请使用本指南:
**备用控制 面(Fallback CP)**通过定期将全部网关配置导出到外部存储(AWS S3、S3 兼容存储或 Azure Blob 存储)来解决此问题。控制面不可访问时,数据面节点会从外部存储获取配置,从而能够启动并独立运行。
它是如何工作的
备用控制面架构使用一个备份网关节点。该节点与流量节点同时运行,但不处理 API 流量,只负责从控制面接收配置,并按定时计划将配置导出到外部存储。
正常运行
正常运行时,每个数据面节点(包括备份节点)都会通过 mTLS 端口 7943 监听控制面的 etcd 兼容 API,以接收配置。有关详情,请参见架构中的拉取/监听模型。备份节点还会按定时计划将收到的配置写入外部存储。
备用模式
当控制面不可用时,流量节点会回退到从外部存储加载配置,而不是从控制面加载配置。
导出什么
备份节点按网关组导出两类数据:
| 类别 | 内容 |
|---|---|
| 资源数据 | 路由、服务、上游、消费者、凭证、SSL 证书、全局规则、插件元数据、插件配置、四层路由、密钥、自定义插件和 Protobuf 定义。 |
| 配置数据 | 数据面配置,包括密钥环和服务发现设置。 |
每个网关组的数据会存储为独立对象,并以网关组的短 ID 作为键。
备份节点不为 API 流量公开 HTTP/HTTPS 端口,并且不计入你的许可证配额。
前置条件
- 正在运行的 API7 网关部署,至少有一个网关组。
- 外部存储后端:
- AWS S3 或 S3 兼容存储:两个具有适当访问权限的存储桶(一个用于资源数据,一个用于配置数据)。对于 MinIO、Ceph 或阿里云 OSS 等 S3 兼容存储,请准备自定义端点 URL。
- Azure Blob 存储:两个 Blob 容器(一个用于资源数据,一个用于配置数据),具有适当的访问凭证。
AWS S3 权限
备份节点的 IAM 策略必须包括:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject"],
"Resource": [
"arn:aws:s3:::fallback-cp-data/*",
"arn:aws:s3:::fallback-cp-config/*"
]
}
]
}
以备用模式运行的流量节点需要对相同存储桶拥有 s3:GetObject 权限。
对于 S3 兼容存储,请在存储提供程序中授予等效的对象读/写权限。
Azure Blob 存储权限
使用的身份或访问密钥必须在两个容器上都具有 Storage Blob Data Contributor 角色,或者使用存储账户访问密钥。
配置备份节点
备份节点是一种网关实例,其 fallback_cp 配置中包含 mode: write。该节点与普通数据面节点一样连接控制面,但只将配置写入外部存储,不处理流量。
- Kubernetes(Helm)
- Docker
将备份节点部署为独立的 Helm Release,或在现有 Release 中创建专用 Deployment。
- AWS S3
- Azure Blob Storage
使用服务账户 IAM 角色(IRSA):
replicaCount: 1
gateway_conf:
deployment:
fallback_cp:
interval: 60
mode: write
aws_s3:
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/fallback-cp-role"
❶ 配置导出之间的时间间隔(以秒为单位)。
❷ write 模式表示该节点只向存储导出配置,不处理流量。
❸ 指定 S3 存储桶所在的 AWS 区域。
❹ ❺ 分别指定存储资源数据和配置数据的存储桶。
使用 IAM 访问密钥:
replicaCount: 1
gateway_conf:
deployment:
fallback_cp:
interval: 60
mode: write
aws_s3:
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
对于 S3 兼容存储,请使用存储服务商提供的访问密钥和秘密密钥,并在 aws_s3 块中添加 endpoint:
gateway_conf:
deployment:
fallback_cp:
aws_s3:
endpoint: "https://s3-compatible.example.com"
使用工作负载身份:
replicaCount: 1
apisix:
podLabels:
azure.workload.identity/use: "true"
extraEnvVarsSecret: "sc-azurite-secret"
nginx:
envs:
- name: AZURE_STORAGEBLOB_RESOURCEENDPOINT
value: "https://youraccount.blob.core.windows.net"
- name: AZURE_CLIENT_ID
value: "<your-managed-identity-client-id>"
gateway_conf:
deployment:
fallback_cp:
interval: 60
mode: write
azure_blob:
account_name: "youraccount"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
使用存储账户访问密钥:
replicaCount: 1
gateway_conf:
deployment:
fallback_cp:
interval: 60
mode: write
azure_blob:
account_name: "youraccount"
account_key: "${AZURE_STORAGE_ACCOUNT_KEY}"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
- AWS S3
- Azure Blob Storage
deployment:
role: data_plane
role_data_plane:
control_plane: "https://<cp-host>:7943"
fallback_cp:
interval: 60
mode: write
aws_s3:
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
对于 S3 兼容存储,请使用存储服务商提供的访问密钥和秘密密钥,并在 aws_s3 块中添加 endpoint:
deployment:
fallback_cp:
aws_s3:
endpoint: "https://s3-compatible.example.com"
docker run -d --name api7-backup-node \
-v $(pwd)/config.yaml:/usr/local/apisix/conf/config.yaml \
api7/api7-ee-3-gateway:latest
deployment:
role: data_plane
role_data_plane:
control_plane: "https://<cp-host>:7943"
fallback_cp:
interval: 60
mode: write
azure_blob:
account_name: "youraccount"
account_key: "${AZURE_STORAGE_ACCOUNT_KEY}"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
docker run -d --name api7-backup-node \
-v $(pwd)/config.yaml:/usr/local/apisix/conf/config.yaml \
api7/api7-ee-3-gateway:latest
配置流量节点使用备用模式
必须为流量节点配置外部存储,以便控制面不可访问时切换到备用模式。在该模式下,网关以独立模式运行,并从备份节点使用的相同存储桶中读取配置。
- Kubernetes(Helm)
- Docker
在流量节点的 Helm values 中添加 fallback_cp 块,但不要设置 mode 或 interval:
- AWS S3
- Azure Blob Storage
gateway_conf:
deployment:
fallback_cp:
aws_s3:
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
对于 S3 兼容存储,请将 endpoint 添加到 aws_s3 块。
gateway_conf:
deployment:
fallback_cp:
azure_blob:
account_name: "youraccount"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
当 CP 发生故障,且流量节点需要以独立备用模式重启时:
- AWS S3
- Azure Blob Storage
deployment:
role: data_plane
role_data_plane:
config_provider: json
fallback_cp:
aws_s3:
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
❶ 设置 config_provider: json,使网关切换到独立模式并从外部存储读取配置,而不再连接控制面。
deployment:
role: data_plane
role_data_plane:
config_provider: json
fallback_cp:
azure_blob:
account_name: "youraccount"
account_key: "${AZURE_STORAGE_ACCOUNT_KEY}"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
流量节点以备用模式运行时,在控制面恢复前无法应用配置变更。所有节点都会使用备份节点最后一次导出的配置处理流量。
控制面侧配置
除了使用专用备份网关节点,还可以在控制面控制台上配置备用控制面推送。控制台会按 Cron 计划定期将配置推送到外部存储 。
在控制台配置中添加以下内容:
fallback_cp:
cron_spec: "@every 1m"
aws_s3:
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"
region: "us-east-1"
resource_bucket: "fallback-cp-data"
config_bucket: "fallback-cp-config"
azure_blob:
account_name: "youraccount"
account_key: "${AZURE_STORAGE_ACCOUNT_KEY}"
resource_container: "fallback-cp-data"
config_container: "fallback-cp-config"
❶ 使用 Cron 表达式控制控制台推送配置的频率。常用值包括 @every 1m 和 @every 5m。
❷ ❸ 可以配置其中一个或同时配置两个存储后端。控制台会将配置推送到所有已配置的后端。
对于 S3 兼容存储,请将 custom_endpoint 添加到控制台端 aws_s3 块:
fallback_cp:
aws_s3:
custom_endpoint: "https://s3-compatible.example.com"
当多个控制台实例运行时,分布式锁可确保在任何给定时间只有一个实例执行推送。
配置参考
备份节点/流量节点(config.yaml)
| 字段 | 类型 | 描述 |
|---|---|---|
deployment.fallback_cp.mode | 字符串 | 备份节点设置为 write;流量节点不设置该字段,以备用读取模式运行。 |
deployment.fallback_cp.interval | 整数 | 配置导出间隔,单位为秒,仅用于备份节点。 |
deployment.fallback_cp.aws_s3.access_key | 字符串 | AWS 访问密钥 ID。使用 IRSA 时无需设置。 |
deployment.fallback_cp.aws_s3.secret_key | 字符串 | AWS 秘密访问密钥。使用 IRSA 时无需设置。 |
deployment.fallback_cp.aws_s3.region | 字符串 | S3 存储桶所在的 AWS 区域。 |
deployment.fallback_cp.aws_s3.resource_bucket | 字符串 | 存储资源数据的 S3 存储桶。 |
deployment.fallback_cp.aws_s3.config_bucket | 字符串 | 存储配置数据的 S3 存储桶。 |
deployment.fallback_cp.aws_s3.endpoint | 字符串 | S3 兼容存储使用的自定义端点。 |
deployment.fallback_cp.azure_blob.account_name | 字符串 | Azure 存储账户名称。 |
deployment.fallback_cp.azure_blob.account_key | 字符串 | Azure 存储账户密钥。使用 Workload Identity 时无需设置。 |
deployment.fallback_cp.azure_blob.resource_container | 字符串 | 存储资源数据的 Blob 容器。 |
deployment.fallback_cp.azure_blob.config_container | 字符串 | 存储配置数据的 Blob 容器。 |
deployment.fallback_cp.azure_blob.endpoint | 字符串 | 自定义 Azure Blob 端点。默认值为 https://<account_name>.blob.core.windows.net。 |
控制台(dashboard-config.yaml)
| 字段 | 类型 | 描述 |
|---|---|---|
fallback_cp.cron_spec | 字符串 | 推送计划使用的 Cron 表达式,例如 @every 1m。 |
fallback_cp.aws_s3.access_key | 字符串 | AWS 访问密钥 ID。 |
fallback_cp.aws_s3.secret_key | 字 符串 | AWS 秘密访问密钥。 |
fallback_cp.aws_s3.region | 字符串 | S3 存储桶所在的 AWS 区域。 |
fallback_cp.aws_s3.resource_bucket | 字符串 | 存储资源数据的 S3 存储桶。 |
fallback_cp.aws_s3.config_bucket | 字符串 | 存储配置数据的 S3 存储桶。 |
fallback_cp.aws_s3.custom_endpoint | 字符串 | S3 兼容存储使用的自定义端点。在 API7 Helm Chart 中配置为 fallback_cp.aws_s3.custom_endpoint。 |
fallback_cp.azure_blob.* | — | 与网关侧 azure_blob 配置相同的字段。 |