目录
概述
创建服务
访问服务
同项目的不同 VPC 访问 PSC 服务
不同项目的 VPC 访问 PSC 服务
为 GKE Service 创建 PSC 服务
概述
谷歌云的 Private Service Connect 产品允许跨越属于不同群组、团队、项目或组织的 VPC 网络以不公开方式使用服务。您可以使用由您定义且位于您的 VPC 网络内部的 IP 地址发布和使用服务。
通过 Private Service Connect,服务提供方可以向服务使用方提供服务。服务提供方 VPC 网络可支持多个服务使用方。
有两种类型的 Private Service Connect 端点可以连接到已发布的服务:
前者提供私网地址供谷歌云 VPC 内的客户端访问。使用此端点类型时,使用方会连接到其定义的内部 IP 地址。Private Service Connect 执行网络地址转换 (NAT),以将请求路由到服务提供方。

本文档用示例说明如何发布一个自建的 TCP/HTTP 服务,然后从同项目或跨项目的另一个 VPC 访问此服务。自建的服务可以是运行在虚机,或者 GKE 容器集群上。
创建服务
本节描述如何在一台虚机上搭建一个基本的 Nginx 服务,并用内网 TCP 负载均衡发布在 default VPC,然后创建一个 Service Attachment 来将该服务发布到 Private Service Connect。
首先在项目 A 的 default VPC 的新加坡区域子网创建一台虚机,并用启动脚本安装和运行 Nginx。
gcloud compute instances create psc-vm-nginx-1 \\ --image=projects/ubuntu-os-cloud/global/images/ubuntu-1804-bionic-v20220325 \\ --machine-type=n2-standard-2 \\ --zone=asia-southeast1-b \\ --tags=http-server \\ --metadata=startup-script='#! /bin/bash apt update apt -y install nginx service nginx start' |
用下面命令创建一个 Unmanaged Instance Group,把 Nginx 所在的虚机加入该 Group,然后用其作为后端,创建一个内网 TCP 负载均衡。这些操作也可以在谷歌云控制台上手动配置。
gcloud compute instance-groups unmanaged create psc-uig-nginx-1 --project=youzhi-lab --zone=asia-southeast1-b
gcloud compute instance-groups unmanaged add-instances psc-uig-nginx-1 --project=youzhi-lab --zone=asia-southeast1-b --instances=psc-vm-nginx-1
gcloud compute health-checks create tcp psc-backend-health-check-1 --port=80 --region=asia-southeast1 --check-interval=5 --timeout=5 --unhealthy-threshold=2 --healthy-threshold=2
gcloud compute backend-services create bsvc-psc-nginx-1 \\ --load-balancing-scheme INTERNAL \\ --protocol TCP \\ --health-checks psc-backend-health-check-1 \\ --health-checks-region asia-southeast1 \\ --region asia-southeast1 \\ --network default
gcloud compute backend-services add-backend bsvc-psc-nginx-1 \\ --region=asia-southeast1 \\ --balancing-mode=CONNECTION \\ --instance-group=psc-uig-nginx-1 \\ --instance-group-zone=asia-southeast1-b
gcloud compute forwarding-rules create fwrl-psc-nginx-1 \\ --region=asia-southeast1 \\ --load-balancing-scheme=INTERNAL \\ --backend-service=bsvc-psc-nginx-1 \\ --network=default \\ --ports=80 |
注意用于 PSC 的转发规则不能开启 Global Access 即全球访问功能,否则后面的步骤会报错。
上述命令运行成功后,可以用以下命令获取刚创建的内网负载均衡的IP地址。
gcloud compute forwarding-rules list --regions=asia-southeast1 --filter="name=('fwrl-psc-nginx-1')" |
运行结果如下。

下面创建 PSC 服务子网。该子网的地址用于NAT替换来自于其它 VPC 的请求的源地址。建议使用 /22 或者 /21 地址段。本文使用 10.50.0.0/22 网段。其中有 1024 个可用地址,除掉 4 个保留地址,还有 1020 个地址可以个请求端使用。
gcloud compute networks subnets create subnet-psc-nginx-1 \\ --network=default --region=asia-southeast1 \\ --range=10.50.0.0/22 --purpose=PRIVATE_SERVICE_CONNECT |
创建 PSC 的 Service Attachment,用于在 PSC 上发布该服务。注意该服务设置为需要手动允许其它项目的访问。
gcloud compute service-attachments create psc-attachment-nginx-1 \\ --region=asia-southeast1 \\ --producer-forwarding-rule=fwrl-psc-nginx-1 \\ --connection-preference=ACCEPT_MANUAL \\ --consumer-accept-list=youzhi-lab=200 \\ --nat-subnets=subnet-psc-nginx-1 |
命令完成后,可以从输出看到这个服务的 URI。这个 URI 在后面创建 PSC 访问端点时,将用于指定这个服务。

可以看到服务的 URI 是
projects/youzhi-lab/regions/asia-southeast1/serviceAttachments/psc-attachment-nginx-1
访问服务
同项目的不同 VPC 访问 PSC 服务
下面创建 PSC 服务接入端点。首先可以在项目 A 的 VPC test-custom-vpc 的新加坡区域子网预留一个私有 IP。
gcloud compute addresses create ip-psc-endpoint-1 \\ --region=asia-southeast1 \\ --subnet=subnet-sin-1
gcloud compute addresses list --filter="ip-psc-endpoint-1" |
从输出结果可以查看该 IP 的地址。
本例地址为 172.17.1.2。
下面创建一个用于访问 PSC 服务的转发规则,即 PSC 访问端点。注意用于 PSC 的转发规则不能开启 Global Access 即全球访问功能,否则会报错。
gcloud compute forwarding-rules create fwrl-psc-endpoint-nginx-1 \\ --region=asia-southeast1 \\ --network=test-custom-vpc \\ --address=ip-psc-endpoint-1 \\ --target-service-attachment=projects/youzhi-lab/regions/asia-southeast1/serviceAttachments/psc-attachment-nginx-1 |
创建完成后,可以在 VPC test-custom-vpc 的新加坡子网的一台虚机上,用 HTTP 请求尝试访问该服务,如下所示。

查看服务的 Nginx 的访问日志,可以看到请求的源 IP 都是来自于前面指定的 10.50.0.0/22 网段。

不同项目的 VPC 访问 PSC 服务
在项目 B 的 default VPC 的新加坡区域子网预留一个私有 IP,并查看该 IP 地址。
gcloud compute addresses create ip-psc-endpoint-2 \\ --region=asia-southeast1 \\ --subnet=default
gcloud compute addresses list --filter="ip-psc-endpoint-2" |
本例预留的IP为10.148.0.2。
下面创建一个用于访问 PSC 服务的转发规则,即 PSC 访问端点。注意用于PSC的转发规则不能开启 Global Access 即全球访问功能,否则会报错。
gcloud compute forwarding-rules create fwrl-psc-endpoint-nginx-2 \\ --region=asia-southeast1 \\ --network=default \\ --address=ip-psc-endpoint-2 \\ --target-service-attachment=projects/youzhi-lab/regions/asia-southeast1/serviceAttachments/psc-attachment-nginx-1 |
创建完成后,可以在项目 B 的 default VPC 的新加坡子网的一台虚机上,用 HTTP 请求尝试访问该服务。此时访问会超时。这是因为前面发布该服务时,在 Service Attachment 里设置了需要手动允许其它项目访问。
下面回到项目 A,配置该允许从其它项目访问该 PSC 服务。在 PSC 的列表页,找到该服务,点击进入详情。

在详情页的下方,可以看到已连接的和申请连接的项目列表。刚才创建 PSC 访问端点的项目,现在在该列表里为 Pending 状态,需要手动批准。选中该项目并点击 ACCEPT 按钮。

在弹出对话框中设置该项目可以使用的最大并发连接数。

配置生效完成后,再访问 PSC 端点,可以访问成功。如下所示。

为 GKE Service 创建 PSC 服务
GKE 上部署的容器服务 Service,也可以发布为PSC服务并从其它项目和 VPC 访问。以下为示例。
首先在项目 A 的default VPC 创建 PSC 服务子网,使用 10.51.0.0/22 网段。
gcloud compute networks subnets create subnet-psc-whoami-1 \\ --network=default --region=asia-southeast1 \\ --range=10.51.0.0/22 --purpose=PRIVATE_SERVICE_CONNECT |
创建一个 Deployment,使用 wheream i镜像。该镜像实现了一个简单 HTTP 服务,输出 Pod 的环境信息。在 my-deployment.yaml 中填写以下内容。
apiVersion: apps/v1 kind: Deployment metadata: name: psc-ilb spec: replicas: 3 selector: matchLabels: app: psc-ilb template: metadata: labels: app: psc-ilb spec: containers: - name: whereami image: gcr.io/google-samples/whereami:v1.2.1 ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 5 timeoutSeconds: 1 |
部署该 Deployment。
kubectl apply -f my-deployment.yaml |
创建一个 Service,标记其用内网负载均衡实现。在 my-service.yaml 填写以下内容。
apiVersion: v1 kind: Service metadata: name: gke-l4-psc annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer selector: app: psc-ilb ports: - port: 80 targetPort: 8080 protocol: TCP |
部署该 Service。
kubectl apply -f my-service.yaml |
创建一个 Service Attachment,将该 Service 发布为 PSC 服务。在 my-psc.yaml 中填写以下内容。
apiVersion: networking.gke.io/v1beta1 kind: ServiceAttachment metadata: name: emoji-sa namespace: default spec: connectionPreference: ACCEPT_AUTOMATIC natSubnets: - subnet-psc-whoami-1 proxyProtocol: false resourceRef: kind: Service name: gke-l4-psc |
部署该 Service Attachement。
kubectl apply -f my-psc.yaml |
此时,到控制台查看 PSC 服务列表,可以看到新创建的容器服务。

在该服务的详情页,可以查看和拷贝该服务的URI,用于后面创建访问该服务的端点。

也可以用 kubectl 描述该服务,找到这个 URI。
kubectl describe ServiceAttachment emoji-sa |
输出中有如下内容。
在项目 A 的 VPC test-custom-vpc 的新加坡区域的子网中,预留一个私网 IP,作为 PSC 访问端点地址。
gcloud compute addresses create ip-psc-whoami-endpoint-1 \\ --region=asia-southeast1 \\ --subnet=subnet-sin-1
gcloud compute addresses list --filter="ip-psc-whoami-endpoint-1" |
本例预留的 IP 为172.17.1.4。
在 VPC test-custom-vpc 中创建一个 PSC 类型的转发规则,作为该服务的访问端点,并通过 URI 指向刚才发布的服务。
gcloud compute forwarding-rules create fwrl-psc-endpoint-whoami-1 \\ --region=asia-southeast1 \\ --network=test-custom-vpc \\ --address=ip-psc-whoami-endpoint-1 \\ --target-service-attachment=projects/youzhi-lab/regions/asia-southeast1/serviceAttachments/k8s1-sa-3xyy5puh-default-emoji-sa-41t1ti8l |
现在从 VPC test-custom-vpc 的新加坡区域的虚机上,可以通过地址 172.17.1.4 成功访问该服务。