数据面弹性
API7 网关数据面节点将配置缓存在内存中,并且可以在短暂的控制面(CP) 中断期间继续处理流量。但是,对于长时间中断,例如数据库故障、控制面升级或灾难恢复场景,在没有 CP 连接的情况下重新启动的节点无法加载配置。
在你已经规划好流量服务节点的扩展和高可用性之后,请使用本指南:
后备 CP 通过定期将所有网关配置导出到外部存储(AWS S3、S3 兼容存储或 Azure Blob 存储)来解决此问题。当控制面无法访问时,数据面节点会从此存储中获取其配置,使它们能够启动并继续独立运行。
它是如何工作的
Fallback CP 架构使用备份网关节点,该节点与流量处理节点一起运行,但不服务 API 流量。其唯一目的是从控制面接收配置并按 cron 计划将其导出到外部存储。
正常运行
在正常操作期间,每个数据面节点(包括备份节点)都会在 mTLS 端口 7943 上监视来自控制面的 etcd 兼容 API 的配置(有关详细信息,请参阅架构拉取/监听模型)。备份节点还按照 cron 计划将其收到的配置写入外部存储。
后备操作
当控制面不可用时,流量节点会回退到从外部存储加载配置,而不是从控制面加载配置。
导出什么
备份节点按网关组导出两类数据:
| 类别 | 内容 |
|---|---|
| 资源数据 | 路由、服务、上游、消费者、凭证、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 版本或现有版本中的专用部署。
- 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兼容的存储,使用提供者的访问密钥和秘密密钥,并将endpoint添加到aws_s3块:
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 兼容存储,使用 提供者的访问密钥和秘密密钥,并将 endpoint 添加到 aws_s3 块:
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
将 fallback_cp 块添加到流量节点 Helm 值(不 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"
当流量节点在回退模式下运行时,在控制面恢复之前无法应用配置更改。所有节点都将服务于备份节点导出的最后配置。
控制面-侧配置
或者,可以在 控制面控制台上配置后备 CP 推送,而不是使用专用的备份网关节点。控制台按照 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端点(用于 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端点用于 S3 兼容存储。在 API7 Helm 图表中,将其配置为 fallback_cp.aws_s3.custom_endpoint。 |
fallback_cp.azure_blob.* | — | 与网关侧azure_blob配置相同的字段。 |