将 Apigee 扩展到多个区域

本页面适用于 Apigee,但不适用于 Apigee Hybrid

查看 Apigee Edge 文档。

您可以跨多个区域扩展 Apigee 组织。多区域扩展可改善以下方面:

  • 高可用性:如果某一区域发生故障,流量仍可由其余区域传送,从而提高 API 的整体可用性。
  • 高容量:其他区域提供额外的容量来传送 API 流量,并为意外的流量高峰提供空间,使单个环境不会承受太大的压力,从而提高 API 的整体容量。
  • 低延迟:其他区域可在地理上更接近的区域中响应请求,从而缩短客户端的整体事务延迟时间。

本文档介绍如何将 Apigee 添加到新区域以及如何从区域中移除 Apigee。

将 Apigee 添加到新区域

每个区域可以有一个运行时实例,因此如要添加新区域,您必须在该区域创建一个全新的实例。

添加新区域的大致过程如下:

  1. 确保您的对等互连网络中有适当的 IP 地址范围可用,如前提条件中所述。此外,请确保您的账号可以支持新的区域,如限制中所述。
  2. 定义环境变量
  3. 创建新的密钥环和密钥
  4. 预留新的地址范围
  5. 创建新实例
  6. 将环境关联到新实例
  7. 配置路由

后续几个部分将介绍其中每个步骤。

前提条件

确保您的网络有 /22 和 /28 作为可用的非重叠 IP 地址范围。此类范围会与其他区域所用的范围累加计算。

限制

默认情况下,初始组织通常使用单个区域创建。在决定是否创建第二个(或更多)区域时,请注意,只有在许可授权允许的情况下,您才能添加区域。您可以选择购买组织包。

  • 如果您使用基于订阅的价格模式,则可能需要购买额外的组织单元,以支持扩展到多个区域。请参阅订阅权益
  • 如果您使用随用随付价格模式,扩展到多个区域会产生额外费用,具体请参阅添加随用随付区域
  • 评估账号仅限一个区域,不能扩展到第二个区域。

如需了解详情,请参阅随用随付概览

任何组织最多只能有 10 个(对于 Hybrid 为 11 个)区域。

定义环境变量

我们建议您定义以下环境变量,以确保本文档中使用的命令之间的一致性。

export NEW_REGION_LOCATION="NEW_REGION_LOCATION"
export NEW_INSTANCE_NAME="NEW_INSTANCE_NAME"
export NETWORK_NAME"=NETWORK_NAME"
export DISK_KEY_RING_NAME="YOUR_DISK_KEY_RING_NAME"
export DISK_KEY_NAME="YOUR_DISK_KEY_NAME"
export PROJECT_ID=YOUR_PROJECT_ID
export AUTH="Authorization: Bearer $(gcloud auth print-access-token)"
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

其中:

  • NEW_REGION_LOCATION 是新实例的物理位置。有效值为任意 Compute Engine 区域。如需了解详情,请参阅区域和可用区。例如 us-west1
  • NEW_INSTANCE_NAME 是新区域的名称。它在您的组织中必须是唯一的。例如 my-instance-2
  • NETWORK_NAME 是您的组织的对等互连网络的名称。例如 my-network。请参阅配置服务网络
  • DISK_KEY_RING_NAME 是磁盘密钥环的名称。
  • DISK_KEY_NAME 是磁盘环的名称。
  • AUTH 使用不记名令牌定义 Authentication 标头。调用 Apigee API 时需使用此标头。请注意,令牌会在一段时间后过期,并且在令牌过期后,您可以使用同一命令重新生成令牌。如需了解详情,请参阅 print-access-token 命令参考页面。
  • PROJECT_ID 是您的 Cloud 项目 ID。
  • PROJECT_NUMBER 是您的 Cloud 项目的编号。
  • 创建新的密钥环和密钥

    每个区域都需要有用于网络的磁盘加密密钥。Google 建议您也为新区域创建单独的密钥环。您无需创建新的数据库加密密钥,因为组织中的所有实例共用同一个数据库加密密钥。

    如需了解详情,请参阅 Apigee 加密密钥简介

    如需创建新的磁盘加密密钥环和密钥,请执行以下操作

    1. 使用 gcloud 命令创建新的磁盘密钥环:
      gcloud kms keyrings create $DISK_KEY_RING_NAME \
        --location $NEW_REGION_LOCATION \
        --project $PROJECT_ID

      验证磁盘密钥环是否设置为与实例相同的位置。每个实例和密钥环都应该有自己的位置。

      gcloud kms keyrings list \
        --location $NEW_REGION_LOCATION \
        --project $PROJECT_ID
      gcloud kms keyrings describe $DISK_KEY_RING_NAME \
        --location $NEW_REGION_LOCATION \
        --project $PROJECT_ID
    2. 使用 kms keys create 命令创建新的磁盘密钥;例如:
      gcloud kms keys create $DISK_KEY_NAME --keyring $DISK_KEY_RING_NAME \
        --location $NEW_REGION_LOCATION --purpose "encryption" --project $PROJECT_ID

      密钥可由其密钥路径引用。您可以使用以下命令获取密钥路径:

      gcloud kms keys list \
        --location=$NEW_REGION_LOCATION \
        --keyring=$DISK_KEY_RING_NAME \
        --project=$PROJECT_ID

      密钥路径如下所示:

      projects/PROJECT_ID/locations/NEW_REGION_LOCATION/keyRings/my-disk-key-ring/cryptoKeys/my-disk-key
    3. 通过执行 gcloud kms keys add-iam-policy-binding 命令向 Apigee Service Agent 授予使用新密钥的权限;例如:
      gcloud kms keys add-iam-policy-binding $DISK_KEY_NAME \
        --location $NEW_REGION_LOCATION \
        --keyring $DISK_KEY_RING_NAME \
        --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-apigee.iam.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project $PROJECT_ID

      验证密钥是否绑定到 Apigee Service Agent。

      gcloud kms keys get-iam-policy $DISK_KEY_NAME \
        --keyring $DISK_KEY_RING_NAME \
        --location $NEW_REGION_LOCATION \
        --project $PROJECT_ID
      gcloud kms keys describe $DISK_KEY_NAME \
        --keyring $DISK_KEY_RING_NAME \
        --location $NEW_REGION_LOCATION \
        --project $PROJECT_ID

    预留新的地址范围

    为对等互连网络的地址范围预留 IP 地址。如需了解详情和重要注意事项,另请参阅了解对等互连范围

    1. 创建以下环境变量:
      NEW_RANGE_NAME_22=YOUR_CIDR_22_RANGE_NAME
      NEW_RANGE_NAME_28=YOUR_CIDR_28_RANGE_NAME
      NETWORK_NAME=YOUR_NETWORK_NAME
      

      其中:

      • NEW_RANGE_NAME_22 是您将创建的 CIDR 长度为 /22 的 IP 地址范围的名称。您可以随意为范围命名。例如:google-svcs-new_22
      • NEW_RANGE_NAME_28 是您将创建的 CIDR 长度为 /28 的 IP 地址范围的名称。您可以随意为范围命名。例如:google-svcs-new_28
      • NETWORK_NAME 是应在其中预留地址的网络资源的名称。

        Google 会为每个新项目创建一个默认网络(名为 default),以便您使用该网络。但是,Google 不建议将默认网络用于测试以外的其他用途。

    2. 创建 CIDR 长度为 /22 的网络 IP 地址范围:
      gcloud compute addresses create $NEW_RANGE_NAME_22 \
        --global \
        --prefix-length=22 \
        --description="Peering range for Apigee services" \
        --network=$NETWORK_NAME \
        --purpose=VPC_PEERING \
        --project=$PROJECT_ID

      成功后,gcloud 会返回以下内容:

      Created [https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/addresses/google-svcs-new].

      验证创建的计算地址:

      gcloud compute addresses list \
        --global \
        --project=$PROJECT_ID
      gcloud compute addresses describe $NEW_RANGE_NAME_22 \
        --global \
        --project=$PROJECT_ID

      创建 IP 地址范围后,地址便会与项目关联,直到您将地址释放。

    3. 创建 CIDR 长度为 /28 的网络 IP 地址范围。此范围是必需的,供 Apigee 用于问题排查,不能自定义或更改。
      gcloud compute addresses create $NEW_RANGE_NAME_28 \
        --global \
        --prefix-length=28 \
        --description="Peering range for supporting Apigee services" \
        --network=$NETWORK_NAME \
        --purpose=VPC_PEERING \
        --project=$PROJECT_ID
    4. 验证创建的计算地址:

      gcloud compute addresses list \
        --global \
        --project=$PROJECT_ID
       gcloud compute addresses describe $NEW_RANGE_NAME_28 \
        --global \
        --project=$PROJECT_ID
    5. 获取对等互连范围的名称:
      gcloud services vpc-peerings list \
        --network=$NETWORK_NAME \
        --project=$PROJECT_ID
    6. 使用以下命令将新预留的范围添加到对等互连网络,其中 $NEW_RANGE_NAME_22$NEW_RANGE_NAME_28 是新的范围名称,ORIGINAL_RANGE_NAME_1ORIGINAL_RANGE_NAME_n 是上一条命令返回的预留对等互连范围名称:
      gcloud services vpc-peerings update --service=servicenetworking.googleapis.com \
        --network=$NETWORK_NAME \
        --ranges=$NEW_RANGE_NAME_22,$NEW_RANGE_NAME_28,ORIGINAL_RANGE_NAME_1,ORIGINAL_RANGE_NAME_n \
        --project=$PROJECT_ID
    7. 验证已更新的 vpc-peering 更改:

      gcloud services vpc-peerings list \
        --network=$NETWORK_NAME \
        --project=$PROJECT_ID

    创建新实例

    使用 Instances API 为该区域创建新实例

    使用 VPC 对等互连

    如果 Apigee 已设置为使用 VPC 对等互连,请使用此 API 调用来创建实例:

    curl -X POST -H "$AUTH" \
      -H "Content-Type: application/json" \
      "https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/instances" \
      -d '{
        "name":"'"$NEW_INSTANCE_NAME"'",
        "location":"'"$NEW_REGION_LOCATION"'",
        "diskEncryptionKeyName":"KEY_PATH",
        "ipRange":"IP_ADDRESS_1/28, IP_ADDRESS_2/22"  # OPTIONAL
      }'

    其中:

    • KEY_PATH 是您在创建新的密钥环和密钥中创建的磁盘加密密钥路径。
    • IP_ADDRESS_* 是用于创建 Apigee 实例的 /22 和 /28 CIDR 范围的 CIDR IP 地址。请注意,ipRange 是可选的。如果您未提供此字段,Apigee 会自动从 Service Networking 请求可用的 /22 和 /28 CIDR 地址块。另请参阅 Apigee 实例 API
    • 此请求最多可能需要 20 分钟才能完成,因为 Apigee 必须创建并启动新的 Kubernetes 集群,在该集群上安装 Apigee 资源,并设置负载均衡。

    不使用 VPC 对等互连

    如果 Apigee 未设置为使用 VPC 对等互连,请使用此 API 调用来创建实例:

    curl -X POST -H "$AUTH" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/instances" \
      -d '{
        "name":"'"$INSTANCE_NAME"'",
        "location":"'"$RUNTIME_LOCATION"'",
        "diskEncryptionKeyName":"'"KEY_PATH"'",
        "consumerAcceptList":[ARRAY_OF_PROJECT_IDS]
      }'

    其中:

    • KEY_PATH 是您在创建新的密钥环和密钥中创建的磁盘加密密钥路径。 另请参阅 Apigee 实例 API
    • consumerAcceptList(可选)指定能够以私密方式连接到 Apigee VPC 的服务连接的 Google Cloud 项目 ID 列表。服务连接是一种与 Google Cloud Private Service Connect 结合使用的实体,允许服务提供方(在本例中为 Apigee)向使用方(在本例中为您拥有的一个或多个 Cloud 项目)公开服务。默认情况下,我们使用已与您的 Apigee 组织关联的 Cloud 项目。例如:"consumerAcceptList": ["project1", "project2", "project3"]

    此请求最多可能需要 20 分钟才能完成,因为 Apigee 必须创建并启动新的 Kubernetes 集群,在该集群上安装 Apigee 资源,并设置负载均衡。

    timer 完成创建实例操作大约需要 30 分钟。

    要检查运行时实例创建请求的状态,请执行以下命令。当状态为 ACTIVE 时,您可以继续执行下一步。

    curl -i -X GET -H "$AUTH" \
      "https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/instances/$NEW_INSTANCE_NAME"

    如需详细了解如何创建运行时实例(包括其他上下文和问题排查信息),请参阅第 5 步:创建 Apigee 运行时实例

    将环境关联到新实例

    创建实例后,您必须将环境关联到该实例,否则该实例无法响应 API 请求。

    在实例间共享环境;因此,您应将现有环境附加到新区域。您不会为新区域定义新环境。如果您为新区域定义了一个新环境,该环境为与原始环境相同的主机提供相同的基本路径,则运行时调用可能会返回 HTTP 503 错误。

    使用环境填充新区域时,无需将环境关联到环境组:它们已关联到其组。您只需将环境关联到新实例即可。

    如需将环境附加到新区域,请使用 Instances attach API,如以下示例所示:

    curl -X POST -H "$AUTH" \
      -H "Content-Type: application/json" \
      https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/instances/$NEW_INSTANCE_NAME/attachments \
      -d '{
        "environment":"ENVIRONMENT_NAME"
      }'

    如需获取您的环境列表,请运行以下命令:

    curl -i -X GET -H "$AUTH" \
      "https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/environments"

    您必须通过单独的 Instance Attachment API 调用来关联每个环境。不能在一个调用中关联多个环境。

    配置路由

    您可以使用基于代管式实例组 (MIG) 或 Private Service Connect (PSC) 的配置在新区域中配置网络路由。

    配置 PSC 路由

    以下步骤介绍了如何使用 PSC 在新区域中配置路由。

    概览

    下图展示了多区域 PSC 的概括性北向架构:

    多区域 PSC 路由图。

    图 1:使用 PSC 的北向多区域架构

    如图 1 所示,您将在项目中创建一个网络端点组 (NEG),以便与新的 Apigee 实例所在的区域中的服务连接进行通信。所有区域的 Apigee NEG 都会连接到 Apigee 生产全球外部负载均衡器的后端服务。

    为新区域创建网络端点组

    请按照以下步骤使用新区域的网络端点组 (NEG) 创建和配置负载均衡器:

    1. 创建新的 NEG:
      1. 从先前创建的实例获取服务连接:
        curl -i -X GET -H "$AUTH" \
          "https://apigee.googleapis.com/v1/organizations/$PROJECT_ID/instances"

        在以下示例输出中,serviceAttachment 值以粗体显示:

        {
          "instances": [
            {
              "name": "us-west1",
              "location": "us-west1",
              "host": "10.82.192.2",
              "port": "443",
              "createdAt": "1645731488019",
              "lastModifiedAt": "1646504754219",
              "diskEncryptionKeyName": "projects/my-project/locations/us-west1/keyRings/us-west1/cryptoKeys/dek",
              "state": "ACTIVE",
              "peeringCidrRange": "SLASH_22",
              "runtimeVersion": "1-7-0-20220228-190814",
              "ipRange": "10.82.192.0/22,10.82.196.0/28",
              "consumerAcceptList": [
                "875609189304"
              ],
              "serviceAttachment": "projects/bfac7497a40c32a12p-tp/regions/us-west1/serviceAttachments/apigee-us-west1-crw7"
            }
          ]
        }
      2. 创建一个指向您在上一步中从实例响应正文获取的服务连接的 NEG。

        gcloud compute network-endpoint-groups create NEG_NAME \
          --network-endpoint-type=private-service-connect \
          --psc-target-service=TARGET_SERVICE \
          --region=$NEW_REGION_LOCATION \
          --network=NETWORK_NAME \
          --subnet=SUBNET_NAME \
          --project=PROJECT_ID
        

        请替换以下内容:

        • NEG_NAME:网络端点组的名称。
        • TARGET_SERVICE:要建立的服务连接。例如 projects/bfac7497a40c32a12p-tp/regions/us-west1/serviceAttachments/apigee-us-west1-crw7
        • NETWORK_NAME:(可选)在其中创建 NEG 的网络的名称。如果您省略此参数,则会使用 default 项目网络。
        • SUBNET_NAME:用于与提供方建立专用连接的子网的名称。子网不必很大:PSC NEG 只需要子网中的一个 IP。对于 Apigee,每个区域只需要一个 PSC NEG。子网可以由虚拟机或其他实体共享和使用。如果未指定子网,网络端点可能属于创建网络端点组的区域中的任何子网。
        • PROJECT_ID:已与您的 Apigee 组织关联的 Cloud 项目,或创建 Apigee 运行时实例时包含在 consumerAcceptlist 中的 Cloud 项目。
    2. 获取生产 Apigee 负载均衡器的后端服务的名称:
      gcloud compute backend-services list --project=$PROJECT_ID
    3. 将 NEG 作为后端添加到后端服务:
      gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-region=$NEW_REGION_LOCATION \
        --global --project=$PROJECT_ID

      请替换以下内容:

      • BACKEND_SERVICE_NAME:后端服务的名称。
      • NEG_NAME:网络端点组的名称。
    4. (可选)您可以在后端服务上设置离群值检测政策,以自动处理故障切换场景。请参阅以下内容了解详细信息:

    测试最终设置

    调用 API 代理。请参阅部署示例代理

    配置 MIG 路由

    以下步骤介绍了如何使用代管式实例组 (MIG) 在新区域中配置路由。

    概览

    下图展示了使用代管式实例组 (MIG) 的多区域高级向北架构:

    多区域 PSC 的北向架构图。

    图 2:使用 MIG 的北向多区域架构

    如图 2 所示,您将在项目中创建一个 MIG,以与新 Apigee 实例所在区域部署的负载均衡器进行通信。所有区域的 MIG 代理都会连接到您的 Apigee 生产全球外部负载均衡器的后端。

    为新区域创建代管式实例组 (MIG)

    请按照以下步骤为新区域创建和配置 MIG:

    1. 为您的 VPC 网络的子网启用专用 Google 访问通道。

      如需为您的 VPC 网络的子网启用专用 Google 访问通道,请按照启用专用 Google 访问通道中列出的步骤操作。

    2. 设置环境变量:

      本部分中的说明使用环境变量来引用重复使用的字符串。我们建议您先进行以下设置,然后再继续:

      MIG_NAME=YOUR_MIG_NAME
      VPC_NAME=YOUR_VPC_NAME       # If you are using a shared VPC, use the shared VPC name
      VPC_SUBNET=YOUR_SUBNET_NAME     # Private Google Access must be enabled for this subnet
      NEW_REGION_LOCATION=YOUR_NEW_REGION      # The same region as your new Apigee runtime instance
      APIGEE_ENDPOINT=APIGEE_INSTANCE_IP        # See the tip below for details on getting this IP address value
    3. 创建代管式实例组。在此步骤中,您将创建并配置代管式实例组 (MIG)。
      1. 通过执行以下命令来创建实例模板
        gcloud compute instance-templates create $MIG_NAME \
          --project $PROJECT_ID \
          --region $NEW_REGION_LOCATION \
          --network $VPC_NAME \
          --subnet $VPC_SUBNET \
          --tags=https-server,apigee-mig-proxy,gke-apigee-proxy \
          --machine-type e2-medium --image-family debian-10 \
          --image-project debian-cloud --boot-disk-size 20GB \
          --no-address \
          --metadata ENDPOINT=$APIGEE_ENDPOINT,startup-script-url=gs://apigee-5g-saas/apigee-envoy-proxy-release/latest/conf/startup-script.sh

        正如您在此命令中看到的那样,机器的类型为 e2-medium。它们运行 Debian 10 并具有 20GB 磁盘。startup-script.sh 脚本会将 MIG 配置为将来自负载均衡器的入站流量路由到 Apigee 实例。

      2. 通过执行以下命令来创建代管式实例组
        gcloud compute instance-groups managed create $MIG_NAME \
          --project $PROJECT_ID --base-instance-name apigee-mig \
          --size 2 --template $MIG_NAME --region $NEW_REGION_LOCATION
      3. 通过执行以下命令为实例组配置自动扩缩
        gcloud compute instance-groups managed set-autoscaling $MIG_NAME \
          --project $PROJECT_ID --region $NEW_REGION_LOCATION --max-num-replicas 3 \
          --target-cpu-utilization 0.75 --cool-down-period 90
      4. 通过执行以下命令来定义已命名端口:
        gcloud compute instance-groups managed set-named-ports $MIG_NAME \
          --project $PROJECT_ID --region $NEW_REGION_LOCATION --named-ports https:443
    4. 获取生产 Apigee 负载均衡器的后端服务的名称:
      gcloud compute backend-services list --project=$PROJECT_ID
    5. 使用以下命令将 MIG 添加到您的后端服务:
      gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --project $PROJECT_ID --instance-group $MIG_NAME \
        --instance-group-region $NEW_REGION_LOCATION \
        --balancing-mode UTILIZATION --max-utilization 0.8 --global

      BACKEND_SERVICE_NAME 替换为后端服务的名称。

    测试最终设置

    调用 API 代理。请参阅部署示例代理

    添加区域

    向 Apigee 环境添加多个区域可为您的 API 提供高可用性、更高的容量和更低的延迟。多区域部署支持高可用性,由于 XLB 将对每个区域进行健康检查,因为不需要手动故障切换。当多个区域同时响应相同的 API 请求,则可提供更高的容量。此外,如果您的 API 客户端位于多个区域,则从更靠近客户端的区域响应 API 请求将有助于缩短延迟时间并提升性能。

    示例:多区域部署可改善可用性、容量和延迟时间

    在双活多区域部署中,流量同时从两个区域传送出去。您需要将每个区域的 MIG 的后端服务添加到同一个外部 HTTPS 负载均衡器 (XLB),具体请参阅第 8 步:配置路由部分的外部路由 (MIG) 标签页下的第 8e(3) 步。如需了解详情,另请参阅为新区域创建代管式实例组 (MIG)

    对于每个请求,XLB 将选择最靠近客户端的区域,除非请求数量超过为特定后端设置的限制。如需详细了解外部负载均衡器如何路由流量,请参阅通过全球负载均衡优化应用容量

    添加随用随付区域

    随用随付价格模式可让您设置环境的最小 Apigee 网关节点数。这可确保在发生区域故障时,区域始终有额外的容量来立即支持故障切换流量。

    设置最小 Apigee 网关节点数

    如果您能够从 2 个活跃区域传送所有正常 API 流量,并且每个区域有 4 个 Apigee 网关节点,则每个区域至少应该有 8 个节点。这是为了能够在其中一个区域服务中断时立即提供支持。如需详细了解如何确定处理 API 流量所需的节点数,请参阅 Apigee 节点简介。请注意,最小节点数按环境设置,但按区域实施。在此示例中,如果您将最小值设置为 8,则每个区域将至少有 8 个节点。

    费用

    在上面的示例中,您将产生至少运行 16 个 Apigee 网关节点(8 个节点 x 2 个区域)的费用。随着节点数量自动增加(最多可达到最大节点数)以处理更多流量,费用可能会增加。

    从区域中移除 Apigee

    如需停用某个 Apigee 实例使其不再传送 API 流量,请按照以下步骤操作,以确保服务不中断(API 不停用):

    1. 在后端服务上启用连接排空。连接排空过程旨在确保在从后端服务中移除后端时,为进行中的现有请求留出一定的时间,让这些请求可以完成。
    2. 如果 Cloud DNS 已配置为通过加权轮循路由政策将流量路由到此 Apigee 区域,请移除该 DNS 配置,具体请参阅管理 DNS 路由政策和健康检查
    3. 将 MIG 后端与后端服务分离。此操作加上连接排空将确保该 Apigee 实例不会收到任何新流量,但允许任何进行中的请求完成。
    4. 删除 Apigee 实例及其相应的 MIG。请参阅删除实例