借助直接 VPC 出站流量,App Engine 服务可以获得高性能的网络解决方案,以便将流量发送到虚拟私有云 (VPC) 网络。借助直接 VPC 出站流量,工作负载可以无缝访问 VPC 网络资源,而无需配置无服务器 VPC 访问通道连接器。
主要优势
- 简化管理:无需管理
连接器实例、机器类型和伸缩设置,从而降低运维开销。App Engine 直接在服务的
app.yaml文件中处理配置。 - 经济高效:使用直接 VPC 出站流量无需支付额外费用,并且 您无需为连接器虚拟机支付固定的月费。
- 提升性能和可靠性:直接 VPC 出站流量无需使用 连接器,因此可以更快、更可靠地连接 到 VPC 网络资源。它可以像 App Engine 服务一样快速扩缩,并避免在维护期间连接器可能发生的连接中断。
- 精细的安全性:您可以直接将网络标记应用于 App Engine 服务版本,从而实现精确的、特定于服务的 防火墙规则和网络政策。
限制
IP 地址消耗量:服务的 IP 地址使用量直接随 运行实例的数量而伸缩,并且伸缩能力受 所选子网中可用 IP 地址数量的限制。
维护事件:在网络基础架构维护事件期间,您的服务可能会遇到短暂的连接 中断。我们建议您使用客户端库来处理偶尔的连接重置。
冷启动:初始冷启动时间取决于区域和 具体用例。在极少数情况下,冷启动可能持续长达一分钟。
直接 VPC 入站流量:App Engine 不支持直接 VPC 入站流量。
实例数量:您只能为每个 App Engine 版本配置最多 100 个实例来使用直接 VPC 出站流量。
IP 地址分配
如需将 App Engine 服务置于 VPC 网络中,请指定 VPC 网络或子网,或同时指定两者。如果您仅指定网络,则子网会使用与网络相同的名称。 App Engine 会分配子网中的 IP 地址。
IP 地址是临时性的,因此请勿基于各个 IP 创建政策。如果您需要基于 IP 创建政策(例如防火墙规则),则必须使用整个子网的 IP 地址范围。
如需更改服务使用的网络或子网,请部署使用新网络和子网值的新版本。
扩容和缩容
为在发生流量激增时实现快速扩容,App Engine 会一次性预留 16 个 IP 地址块(28 子网掩码)。
为了确保有足够的 IPv4 地址可在 App Engine 中使用,子网的 IPv4 地址范围必须为 /26 或更大。
为了提高 IP 分配效率和易于管理,请将多个资源置于同一子网中。如果 IPv4 地址空间有限,请参阅 支持的 IPv4 范围以了解更多选项。
如需删除子网,您必须先删除或重新部署 App Engine 服务以停止使用子网,然后等待 1-2 小时。
服务的 IP 地址消耗量
在稳定状态下,App Engine 使用的 IP 地址数量是实例数量的 2 倍 (2X)。版本缩容时,App Engine 会将其 IP 地址保留最多 20 分钟。总共预留至少 2 倍的 IP 地址数量,再加上考虑到版本更新的缓冲空间。
例如,如果您升级版本,使 version 1 从 100 个实例缩减到零,而 version 2 从零扩容到 100,则 App Engine 会在缩容之后将 version 1 IP 地址保留最多 20 分钟。在 20 分钟的保留窗口内,您必须至少预留 400 个 IP 地址 ((100 + 100) * 2)。
支持的 IPv4 范围
App Engine 支持子网的以下 IPv4 范围:
准备工作
确保您的项目中有现有的 VPC 网络和子网。如果您还没有现有的 VPC,请按照 创建 VPC 网络中的说明创建一个。
启用 Compute Engine API 和 Cloud Build API:
如需使用直接 VPC 出站流量,请确保您运行的是最新版本的 Google Cloud CLI:
gcloud components update
所需的角色
通过向部署服务帐号授予以下角色,确保 App Engine 可以访问 VPC 网络:
App Engine Service Agent 角色:默认情况下, App Engine 服务代理具有 App Engine Service Agent 角色 (
roles/appengine.serviceAgent),该角色含有必要的权限。自定义权限:如需进行更精细的控制,请向 App Engine 服务代理授予对项目的以下额外权限:
compute.networks.getcompute.subnetworks.get- 项目或特定子网的
compute.subnetworks.use权限 compute.addresses.getcompute.addresses.listcompute.addresses.createcompute.addresses.deletecompute.addresses.createInternalcompute.addresses.deleteInternalcompute.regionOperations.get
Compute Network User 角色:如果您不使用默认 App Engine Service Agent 角色或自定义权限,请授予 App Engine Service Agent 服务帐号的 Compute Network User 角色 (
roles/compute.networkUser) 。具有 外部 IPv6 的子网还需要 Compute Public IP Admin 角色 (roles/compute.publicIpAdmin)。例如,如需授予 Compute Network User 角色,请运行以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
替换以下内容:
- PROJECT_ID:您的项目的 ID。
- PROJECT_NUMBER:您在其中部署 App Engine 服务的项目编号。
使用直接 VPC 出站流量配置 App Engine 服务
如需让新的或现有的 App Engine 服务直接连接到您的 VPC 网络,请按以下步骤操作:
将以下
vpc_access设置添加到app.yaml文件:vpc_access: network_interface: network: NETWORK subnet: SUBNET tags: - NETWORK_TAGS vpc_egress: EGRESS_SETTING
替换以下内容:
NETWORK:您的应用 实例连接到的现有网络的名称,例如
default。指定 VPC 网络或子网,或同时指定两者。如果您仅指定网络,则子网会使用与网络相同的名称。SUBNET:您的应用 实例连接到的现有子网的名称,例如
default。指定 VPC 网络或子网,或同时指定两者。如果您仅指定网络,则子网会使用与网络相同的名称。可选:NETWORK_TAGS:要与 App Engine 服务的实例关联的网络标记列表,用于防火墙规则和路由政策。
可选:EGRESS_SETTING:控制如何路由出站流量。此字段支持以下配置设置:
all-traffic:所有出站请求都通过 VPC 网络路由。private-ranges-only(默认):只有发送到内部 IP 地址的流量才通过 VPC 网络路由。互联网流量使用默认的 App Engine 路径。
运行以下命令以部署到 App Engine:
gcloud beta app deploy
断开服务连接
如需断开服务与 VPC 网络的连接,请执行以下操作:
从
app.yaml文件中移除vpc_access部分。重新部署服务:
gcloud beta app deploy
IP 管理的最佳实践
您必须管理 IP 地址,因为服务的每个实例都会使用子网中的一个 IP 地址。请使用以下策略来管理 IP 地址:
建议的 IP 范围:为获得最佳兼容性,我们建议从 RFC 6598 (
100.64.0.0/10) 范围开始。替代 IP 范围:如果您已在使用建议的 IP 范围
100.64.0.0/10,则可以在子网中使用非 RFC 1918 范围,例如 E 类 (240.0.0.0/4)。子网大小调整:确保子网的 IPv4 地址范围为
/26或 更大,以便为伸缩提供足够的地址。过度预配 IP:我们建议过度预配子网中可用 IP 的数量,以避免用尽。与 Cloud Run 服务类似,您通常应使用运行实例数量的四倍 IP(稳定状态下为 2 倍,部署期间额外使用 2 倍),以方便顺利伸缩和更新。
问题排查
本部分介绍了在使用直接 VPC 出站流量部署 App Engine 服务时可能遇到的常见错误。
无法删除子网
如需删除子网,您必须先删除或重新部署使用该子网的所有资源。如果 App Engine 使用子网,请将 App Engine 服务 与 VPC 网络断开连接,或将其移至其他子网,然后才能 删除子网。
删除或移动 App Engine 服务后,请等待 1-2 小时,以便 App Engine 释放 IP 地址,然后再删除子网。
部署失败
如果部署失败,Google Cloud CLI 会显示错误消息,指明根本原因。常见的问题包括:
VPC 元数据不正确,例如
app.yaml文件中的网络或子网名称拼写错误。如需修复潜在错误,请查看app.yaml文件中的 VPC 配置。IAM 权限不足。确保您 在部署服务帐号上授予所需的权限。如果在部署期间遇到权限错误,请确保向服务帐号授予以下额外角色:
- Cloud Build 服务账号 (
roles/cloudbuild.builds.builder) - Service Account Token Creator (
roles/iam.serviceAccountTokenCreator)
- Cloud Build 服务账号 (
IP 地址用尽
如果子网用尽可用的 IP 地址,App Engine 将无法 启动新实例并记录错误。 如需解决此问题,请扩大子网的 IP 范围,或将服务移至更大的子网。
IP 地址泄露
IP 地址泄露可能会导致 IP 地址用尽。在标准操作期间,IP 地址泄露不太可能发生,但可能会因以下原因而发生:
- 您的部署服务帐号仅具有预留地址的权限(
create、createInternal),而没有释放地址的权限(delete、deleteInternal)。 - 在其他 Google Cloud 地址预留处于活跃状态时,您的服务帐号被删除。
- 在无服务器地址预留处于活跃状态时,Cloud Billing 帐号被移除,然后又在项目中重新启用。
- 在无服务器地址预留仍然存在时,您的 Google Cloud 项目被删除,然后又恢复。
如需解决此问题,请按以下步骤操作:
在 Logs Explorer 中查询以下日志,以确定泄露的地址:
protoPayload.authorizationInfo.permission=~"compute.addresses.delete.*" protoPayload.authorizationInfo.resourceAttributes.type="compute.addresses" protoPayload.resourceName=~"projects/.*/regions/.*/addresses/serverless-.*" severity>=WARNING如果此查询未返回结果,则表示没有 IP 地址泄露,无需采取进一步措施。
如果查询返回了结果,请确保您的部署服务帐号包含 App Engine Service Agent 角色 (
roles/appengine.serviceAgent)。如果您无法使用此角色,请确保 您在您的 部署服务帐号上授予其他必需的角色和权限。使用 Google Cloud 控制台或 Google Cloud CLI 手动删除泄露的 IP 地址:
控制台
进入控制台中的 IP 地址 页面: Google Cloud
选择您在上一步中通过运行查询确定的泄露 IP 地址。
点击释放静态地址 以移除泄露的地址。
gcloud
运行
gcloud compute addresses delete命令:gcloud compute addresses delete ADDRESS_NAME --region=REGION
替换以下内容:
- ADDRESS_NAME:泄露的 IP 地址的名称。
- REGION:泄露的 IP 地址的区域。