Application Load Balancer:后端、TLS 与排障
本页主方案:global external ALB + Cloud Run Serverless NEG。
推荐做法#
- 先选 Global / Regional,再确认 backend 类型;Cloud Run 选 Serverless NEG,VM 选 instance group。
- 路由链:forwarding rule → target proxy → URL map → backend → NEG。
- 生产入口用 HTTPS;Cloud Run ingress 限定所需入口,IAM 或 IAP 另管访问者。
常用操作#
替换为实际资源;本段不依赖 lab.env。
PROJECT_ID='REPLACE_PROJECT_ID'
BACKEND='REPLACE_BACKEND_SERVICE'
URL_MAP='REPLACE_URL_MAP'
gcloud compute backend-services describe "$BACKEND" --project="$PROJECT_ID" --global
gcloud compute url-maps describe "$URL_MAP" --project="$PROJECT_ID" --global容易踩的坑#
- Serverless NEG 不使用 VM health check;Backend protocol 字段不决定实际回源传输。
Cloud Run 的 ALB ingress 许可不是“只允许指定一台 ALB”。 后端关联在 NEG 中配置,调用者权限仍单独控制。删除 Cloud Run 也不会自动回收 LB/IP。
Global / Regional、URL mask · Regional 配置 · 逐层排障
配置说明与完整示例(按需展开)
本页是一条 Cloud Run → 全局外部 ALB → 自有域名 HTTPS 的实验路径。所有命令在本机 gcloud 终端执行;本轮只做文档静态验证,未执行云端实验。
| 你想了解什么 | 页面 |
|---|---|
| 前后端对象、Global/Regional、NEG、URL mask、协议 | 架构与配置选择 |
| Proxy-only subnet 提示及区域型创建步骤 | 区域型 ALB 实验 |
| 403/404/502/503、日志和清理验证 | 验收与排障 |
用户 → 公网 IP/端口 → HTTP(S) 代理 → URL map
→ Backend service → Serverless NEG → Cloud RunBackend service 保存转发、安全与日志配置;Serverless NEG 引用 Cloud Run 服务;URL map 按域名和路径选择后端。Cloud Run 不固定容器 IP,所以使用 Serverless NEG,而不是 Instance group。
控制台入口:Network services → Load balancing → Create load balancer → Application Load Balancer → Public facing → Global。后端选择 Serverless network endpoint group,在 NEG 中选择服务 Region 与 lab-hello。单服务不填 URL mask,后端 Protocol 保持界面默认。若提示必须创建 Proxy-only subnet,核对是否选成 Regional。
前置:Cloud Run的 lab-hello,仅返回合成文本。先练 HTTP 链路,再加域名与 TLS;HTTP 不用于密码或真实业务数据。
本篇验证匿名 hello + ALB。若该服务做过 IAP 实验,先按 结束 IAP 实验恢复 Cloud Run IAM authentication,再继续;不要将浏览器 IAP 认证状态带入这条实验路径。
建立入口#
下面使用全局外部 Application Load Balancer(EXTERNAL_MANAGED)。Cloud Run ingress 仅接收内部及负载均衡来源,IAM 允许匿名读取这个演示服务。两项分别控制网络来源和调用授权。
1. 配置 Cloud Run 的入口与调用权限#
internal-and-cloud-load-balancing 对应控制台 Internal 下勾选“允许外部 Application Load Balancers”。纯 Internal 不允许外部 ALB;该设置也不会绑定某一台 ALB。实际绑定由下面的 NEG 建立。
source lab.env
gcloud config set project "$PROJECT_ID"
gcloud services enable compute.googleapis.com run.googleapis.com
gcloud run services update lab-hello --region="$REGION" --ingress=internal-and-cloud-load-balancing
gcloud run services add-iam-policy-binding lab-hello \
--region="$REGION" \
--member=allUsers \
--role=roles/run.invoker2. 创建 NEG 与 Backend service#
NEG 记录区域和 Cloud Run 服务名;Backend service 引用它。本例后端全局、NEG 区域型,两种资源的范围不要混淆。Serverless NEG 忽略 Backend service 的 protocol 字段,所以 CLI 的 HTTP 与界面可能显示的 HTTPS 不冲突;平台管理到 Cloud Run 的加密连接。
gcloud compute network-endpoint-groups create lab-neg \
--region="$REGION" \
--network-endpoint-type=serverless \
--cloud-run-service=lab-hello
gcloud compute backend-services create lab-backend \
--global \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTP \
--enable-logging \
--logging-sample-rate=1
gcloud compute backend-services add-backend lab-backend \
--global \
--network-endpoint-group=lab-neg \
--network-endpoint-group-region="$REGION"3. 建立请求路由与 HTTP 前端#
URL map 的默认后端接收未匹配其他规则的请求。HTTP target proxy 处理客户端 HTTP;forwarding rule 将公网 IP:80 关联到代理。保留的静态公网 IP 可继续用于后面的域名和 HTTPS。
gcloud compute url-maps create lab-map --default-service=lab-backend --global
gcloud compute target-http-proxies create lab-http --url-map=lab-map --global
gcloud compute addresses create lab-lb-ip --global
gcloud compute forwarding-rules create lab-http-rule \
--global \
--load-balancing-scheme=EXTERNAL_MANAGED \
--address=lab-lb-ip \
--target-http-proxy=lab-http \
--ports=804. 验收入口#
export LB_IP=$(gcloud compute addresses describe lab-lb-ip --global --format='value(address)')
curl --fail "http://$LB_IP"等待配置传播后返回 hello;从本机访问原 run.app URL 应被 ingress 阻止。组织若禁止 allUsers,请使用管理员批准的鉴权方案,不解除 Organization Policy。Serverless NEG 不使用 VM 式 health check。服务端无服务器负载均衡
自有域名与 HTTPS(需要域名)#
这里的 TLS 是浏览器到 ALB 的入口加密,证书绑定在 HTTPS target proxy 上;Cloud Run 容器继续按自己的 PORT 提供 HTTP。
**DNS 公共区域(public zone)**保存域名记录;NS 委派让域名使用这组权威 DNS;A 记录把主机名指向 IPv4 地址;证书则证明 HTTPS 服务器有权使用该域名。若已有可管理的 DNS 提供商,可以在那里添加所需记录,不必迁移到 Cloud DNS。
先创建公共区域并把输出的 NS 配置到域名注册商;使用专用实验域或你能委派的子域,不改现有生产域。区域名需包含末尾的点。更完整的 A/CNAME/TXT、DNSSEC 和委派操作见 DNS 专题:
export DNS_ZONE_NAME='替换为实验域名,例如 lab.example.com.'
gcloud services enable dns.googleapis.com
EXISTING_ZONE=$(gcloud dns managed-zones list --filter='name=lab-public' --format='value(dnsName)') || exit 1
if [ -z "$EXISTING_ZONE" ]; then
gcloud dns managed-zones create lab-public --dns-name="$DNS_ZONE_NAME" --description=Learning
elif [ "$EXISTING_ZONE" != "$DNS_ZONE_NAME" ]; then
echo 'lab-public already belongs to another DNS name; check the configuration.' >&2
exit 1
fi
gcloud dns managed-zones describe lab-public --format='value(nameServers)'确认 NS 委派完成后,将 A 记录指向 LB_IP,并创建证书、HTTPS 代理和 443 入口。以下使用全局 Compute SSL certificate;区域型证书流程见 区域型 ALB。
export DOMAIN='替换为尚未占用的自有主机名,例如 service.lab.example.com'
gcloud dns record-sets create "$DOMAIN." --zone=lab-public --type=A --ttl=300 --rrdatas="$LB_IP"
gcloud compute ssl-certificates create lab-cert --domains="$DOMAIN" --global
gcloud compute target-https-proxies create lab-https --url-map=lab-map --ssl-certificates=lab-cert --global
gcloud compute forwarding-rules create lab-https-rule \
--global \
--load-balancing-scheme=EXTERNAL_MANAGED \
--address=lab-lb-ip \
--target-https-proxy=lab-https \
--ports=443
gcloud compute ssl-certificates describe lab-cert --global --format='value(managed.status)'等证书 ACTIVE,再 curl --fail "https://$DOMAIN"。本篇用 Compute 管理的 Google-managed certificate;Certificate Manager 是另一套证书管理路径,不能混用两套资源命令。检查错误 AAAA 记录、NS 和 CAA 可见性。证书指南
清理#
依赖关系决定删除顺序:forwarding rule 引用代理,代理引用 URL map 和证书,URL map 引用 Backend service,后者引用 NEG。删除 NEG 不会删除 Cloud Run,删除 Cloud Run 也不会自动清理整套 ALB。
若执行了 HTTPS 段,先清理:
gcloud dns record-sets delete "$DOMAIN." --zone=lab-public --type=A
gcloud compute forwarding-rules delete lab-https-rule --global
gcloud compute target-https-proxies delete lab-https --global
gcloud compute ssl-certificates delete lab-cert --global
# 仅当所有其他实验记录也已清理且不再共用时:
# gcloud dns managed-zones delete lab-public若保留区域给 DNS、Certificate Manager 等实验,保留委派;最终删除区域前清理 DS/NS。继续清理 LB 公共部分:
gcloud compute forwarding-rules delete lab-http-rule --global
gcloud compute target-http-proxies delete lab-http --global
gcloud compute url-maps delete lab-map --global
gcloud compute backend-services delete lab-backend --global
gcloud compute network-endpoint-groups delete lab-neg --region="$REGION"
gcloud compute addresses delete lab-lb-ip --global
gcloud run services remove-iam-policy-binding lab-hello \
--region="$REGION" \
--member=allUsers \
--role=roles/run.invoker
gcloud run services update lab-hello --region="$REGION" --ingress=allLB、静态 IP 持续计费;仅删除后端应用不够。若绑定过 Certificate Manager 或 Cloud Armor,先按对应篇解除引用,再删除此处的资源。