目录

概述

创建服务

访问服务

同项目的不同 VPC 访问 PSC 服务

不同项目的 VPC 访问 PSC 服务

为 GKE Service 创建 PSC 服务


概述

谷歌云的 Private Service Connect 产品允许跨越属于不同群组、团队、项目或组织的 VPC 网络以不公开方式使用服务。您可以使用由您定义且位于您的 VPC 网络内部的 IP 地址发布和使用服务。

通过 Private Service Connect,服务提供方可以向服务使用方提供服务。服务提供方 VPC 网络可支持多个服务使用方。

有两种类型的 Private Service Connect 端点可以连接到已发布的服务:

  • Private Service Connect 端点(基于转发规则)

  • 带有使用方 HTTP(S) 服务控制的 Private Service Connect 端点(基于全球外部 HTTP(S) 负载均衡器)

前者提供私网地址供谷歌云 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 成功访问该服务。

相关推荐