跳到主要内容
版本:3.10.x

数据面弹性

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。该节点与普通数据面节点一样连接控制面,但只将配置写入外部存储,不处理流量。

将备份节点部署为独立的 Helm Release,或在现有 Release 中创建专用 Deployment。

使用服务账户 IAM 角色(IRSA)

backup-node-values.yaml
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 访问密钥

backup-node-values.yaml
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"

配置流量节点使用备用模式

必须为流量节点配置外部存储,以便控制面不可访问时切换到备用模式。在该模式下,网关以独立模式运行,并从备份节点使用的相同存储桶中读取配置。

在流量节点的 Helm values 中添加 fallback_cp 块,但不要设置 modeinterval

traffic-node-values.yaml
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 块。

警告

流量节点以备用模式运行时,在控制面恢复前无法应用配置变更。所有节点都会使用备份节点最后一次导出的配置处理流量。

控制面侧配置

除了使用专用备份网关节点,还可以在控制面控制台上配置备用控制面推送。控制台会按 Cron 计划定期将配置推送到外部存储。

在控制台配置中添加以下内容:

dashboard-config.yaml
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 配置相同的字段。

后续步骤