示例:MySQL 实例的专用连接
本页面通过示例说明了如何使用 Private Service Connect (PSC) 在专用网络上的 MySQL 后端系统与 Integration Connectors 运行时之间建立连接。
注意事项
创建 PSC 服务连接时,请考虑以下要点:
- PSC 服务连接和负载均衡器应位于同一 VPC 内的不同子网中。具体来说,服务连接应位于 NAT 子网中。
- 在后端虚拟机上运行的软件必须同时响应发送到每个转发规则的 IP 地址的负载均衡流量和健康检查探测(该软件必须监听
0.0.0.0:<port>
,而不是分配给网络接口的特定 IP 地址)。 如需了解详情,请参阅健康检查。 - 配置防火墙规则以便流量通过。
入站流量规则
- 来自 PSC 服务连接子网的流量应到达 ILB 的子网。
- 在 ILB 的子网内,ILB 应该能够将流量发送到您的后端系统。
- 健康检查探测应该能够访问您的后端系统。Google Cloud 健康检查探测具有固定的 IP 范围 (
35.191.0.0/16, 130.211.0.0/22
)。因此,系统允许这些 IP 向您的后端服务器发送流量。
出站规则
除非配置了特定的拒绝规则,否则在 Google Cloud 项目中,出站流量默认处于启用状态。
- 所有 Google Cloud 组件(如 PSC 服务连接和负载均衡器)都应位于同一区域。
- 您的后端系统不应对公共网络开放,因为这可能会给您带来安全问题。不过,在以下情况下,请确保您的后端系统能接受流量:
- 直通式负载平衡器 (L4 TCP/UDP ILB) :来自 PSC 服务连接的 NAT IP 的请求应该能够到达您的后端。这些 NAT IP 是自动生成的。因此,您必须允许服务连接所在的整个 NAT 子网 IP 范围。如需了解详情,请参阅 Private Service Connect 子网。
- 基于代理/HTTP(s) 的负载均衡器(L4 代理 ILB、L7 ILB): 所有新请求均来自负载均衡器。因此,您的后端应接受来自您的 VPC 网络的代理子网的请求。如需了解详情,请参阅基于 Envoy 的负载平衡器的代理专用子网。
示例
假设您有一个托管在 Google Cloud 的专用 VPC 网络中的 MySQL 实例,并希望向 Integration Connectors 运行时公开该 MySQL 实例。
下图显示了配置 PSC 服务连接后示例 Google Cloud 项目将如何变化。
准备工作
在为示例场景创建 PSC 服务连接之前,请执行以下任务:
- 安装 gcloud CLI。
- 为您的 Google Cloud 项目启用 Compute Engine API。
- 为简化 CLI 命令,您可以使用以下命令设置 PROJECT_ID、REGION 和 ZONE 的值:
gcloud config set project PROJECT_ID gcloud config set compute/region REGION gcloud config set compute/zone ZONE
- 对于本教程中的命令,请将 BACKEND_SERVER_PORT 替换为 3306,这是运行 MySQL 服务器的默认端口。
- 建议创建新的 VPC 网络,并在尝试此示例场景时使用。测试场景后,您可以删除 VPC 网络和其他资源。
- 您已至少创建了一个连接。连接可以是任何类型。建立现有连接后,您就可以从 Integration Connectors 运行时中提取服务目录的项目 ID。创建 PSC 服务连接时必须提供此项目 ID。
创建 PSC 服务连接
如需为示例场景创建 PSC 服务连接,请执行以下操作:
- 创建 VPC 网络和所需的子网。
- 创建 VPC 网络。
gcloud compute networks create VPC_NETWORK --project=PROJECT_NAME --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional
- 添加 subnet-1。
gcloud compute networks subnets create SUBNET_NAME_1 --network=VPC_NETWORK --range=SUBNET_RANGE_1 --purpose=PRIVATE_SERVICE_CONNECT
此命令会创建
Subnet-1
作为 NAT 子网,该子网将专门用于托管 PSC 服务连接。您无法在此 NAT 子网中托管任何其他服务。 - 添加 subnet-2。
gcloud compute networks subnets create SUBNET_NAME_2 --network=VPC_NETWORK --range=SUBNET_RANGE_2
- 创建 VPC 网络。
- 创建虚拟机实例。
如需在新创建的 VPC 中创建虚拟机实例,请运行以下命令:
gcloud compute instances create \ --image-family debian-10 \ --image-project debian-cloud \ --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address \ mysql-test
此命令将创建一个名为
mysql-test
的虚拟机实例。 - 配置 Cloud NAT。
- 创建一个简单的路由器。
gcloud compute routers create NAT_ROUTER_NAME \ --network=VPC_NETWORK
- 配置网络地址转换。
gcloud compute routers nats create NAT_GATEWAY_NAME \ --router=NAT_ROUTER_NAME \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges
- 创建一个简单的路由器。
- 通过 SSH 连接到您的虚拟机实例。
- 创建防火墙规则以允许 SSH。
gcloud compute firewall-rules create VPC_NETWORK-allow-ssh --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
- 通过 SSH 连接到您的虚拟机实例。
gcloud compute ssh \ --tunnel-through-iap \ mysql-test
- 创建防火墙规则以允许 SSH。
- 安装 MySQL 服务器。如需了解详细说明,请参阅安装 MySQL。
- 连接到 MySQL 实例并创建示例数据。
- 使用 MySQL 客户端连接到 MySQL。
sudo mysql -u root -p
- 创建新用户并授予从任何主机地址进行连接的权限。
CREATE USER 'test-user'@'%' IDENTIFIED BY 'test-pass'; GRANT ALL PRIVILEGES ON * . * TO 'test-user'@'%'; FLUSH PRIVILEGES;
此命令会创建一个用户名为
test-user
且密码为test-pass
的用户。 - 创建数据库以及示例数据。
CREATE DATABASE test-db; USE test-db; CREATE TABLE Singers (SingerId int, FirstName varchar(255), LastName varchar(255)); INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards');
- 退出 MySQL 客户端。
mysql> exit
- 退出虚拟机实例。
exit
- 使用 MySQL 客户端连接到 MySQL。
- 设置非代管式实例组。
- 创建非代管式实例组。
gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
- 将第 2 步中创建的虚拟机实例添加到组中。
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances=mysql-test
- 创建非代管式实例组。
- 创建健康检查探测并允许来自该探测的流量。
- 创建健康检查探测。
gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port BACKEND_SERVER_PORT --region=REGION
在此命令中,将 BACKEND_SERVER_PORT 设置为 3306,这是运行 MySQL 服务器的默认端口。
- 创建防火墙规则以允许来自探测的流量。
gcloud compute firewall-rules create VPC_NETWORK-allow-health-check --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT --source-ranges=35.191.0.0/16,130.211.0.0/22
- 创建健康检查探测。
- 创建 L4 内部负载均衡器,并允许来自负载均衡器的流量。
- 创建后端服务。
gcloud compute backend-services create BACKEND_SERVICE --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME --health-checks-region=REGION
- 将实例组添加到后端服务。
gcloud compute backend-services add-backend BACKEND_SERVICE --instance-group=INSTANCE_GROUP_NAME --instance-group-zone=ZONE
- 创建转发规则。
gcloud compute forwarding-rules create FORWARDING_RULE_NAME --load-balancing-scheme=internal --network=VPC_NETWORK --subnet=SUBNET_NAME_2 --ip-protocol=TCP --ports=BACKEND_SERVER_PORT --backend-service=BACKEND_SERVICE --backend-service-region=REGION
-
创建防火墙规则以允许内部流量从负载平衡器流向实例组。
gcloud compute firewall-rules create VPC_NETWORK-allow-internal --direction=INGRESS --priority=1000 --network=VPC_NETWORK --action=ALLOW --rules=all --source-ranges=SUBNET_RANGE_2
- 创建后端服务。
- 创建 PSC 服务连接。
- 创建防火墙规则,以允许流量从 PSC 服务连接流向上一步中创建的内部负载均衡器。
gcloud compute firewall-rules create VPC_NETWORK-allow-sa --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT --source-ranges=SUBNET_RANGE_1
- 创建具有明确批准的服务连接。
gcloud compute service-attachments create SERVICE_ATTACHMENT_NAME --producer-forwarding-rule=FORWARDING_RULE_NAME --connection-preference=ACCEPT_MANUAL --consumer-accept-list=SERVICE_DIRECTORY_PROJECT_ID=LIMIT --nat-subnets=SUBNET_NAME_1
在此命令中,LIMIT 是项目的连接限制。连接限制是可以连接到此服务的使用方 Private Service Connect 端点的数量。如需了解如何获取 SERVICE_DIRECTORY_PROJECT_ID,请参阅获取服务目录的项目 ID。
- 创建防火墙规则,以允许流量从 PSC 服务连接流向上一步中创建的内部负载均衡器。
- 创建端点连接。
您可以将端点连接视为 PSC 服务连接的接口。您不能直接使用 PSC 服务连接来配置专用连接。PSC 服务连接只能通过端点连接访问。您可以创建 IP 地址或主机名作为端点连接。创建端点连接后,您可以在为专用连接配置连接器时使用它。如需了解详情,请参阅创建端点连接。
- 验证 PSC 设置。您可以创建一个与您为本教程创建的
test-db
数据库之间的 MySQL 连接来验证 PSC 服务连接连接。如需了解创建 MySQL 连接的详细步骤,请参阅创建 MySQL 连接。 创建连接时,在Destinations
部分(请参阅创建 MySQL 连接中的第 5 步),选择Destination type
作为Hostname
,然后输入相应的端点 IP 地址或主机名。如果连接创建成功,在 Cloud 控制台的“连接”页面中,新创建的连接的状态将为Active
。
获取服务目录的项目 ID
最佳实践是,您可以创建 PSC 服务连接,使其仅接受来自指定 Google Cloud 项目的请求。但是,要执行此操作,您需要与 Google Cloud 项目关联的服务目录的项目 ID。如需获取服务目录的项目 ID,您可以使用 List Connections API,如以下示例所示。
语法
curl -X GET \ -H "authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://connectors.googleapis.com/v1/projects/CONNECTORS_PROJECT_ID/locations/-/connections"
请替换以下内容:
- CONNECTORS_PROJECT_ID:您在其中创建了连接的 Google Cloud 项目的 ID。
示例
此示例会获取 connectors-test
Google Cloud 项目的服务目录的项目 ID。
curl -X GET \ -H "authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://connectors.googleapis.com/v1/projects/connectors-test/locations/-/connections"
在终端上运行此命令会显示类似于以下内容的输出:
..... { "connections": [ { "name": "projects/connectors-test/locations/asia-northeast1/connections/big-query-iam-invalid-sa", "createTime": "2022-10-07T09:02:31.905048520Z", "updateTime": "2022-10-07T09:22:39.993778690Z", "connectorVersion": "projects/connectors-test/locations/global/providers/gcp/connectors/bigquery/versions/1", "status": { "state": "ACTIVE" }, "configVariables": [ { "key": "project_id", "stringValue": "connectors-test" }, { "key": "dataset_id", "stringValue": "testDataset" } ], "authConfig": {}, "serviceAccount": "564332356444-compute@developer.gserviceaccount.com", "serviceDirectory": "projects/abcdefghijk-tp/locations/asia-northeast1/namespaces/connectors/services/runtime", "nodeConfig": { "minNodeCount": 2, "maxNodeCount": 50 } }, ....
在示例输出中,对于 connectors-test
Google Cloud 项目,服务目录的项目 ID 为 abcdefghijk-tp
。
其他后端系统的 PSC 服务连接
您可以按照上一示例中的步骤,为其他后端系统设置 PSC 服务连接。 但是,您必须修改第 5 步和第 6 步,以适应您所需的后端系统。在虚拟机实例中安装后端系统后,将后端系统添加到实例组中,并按原样执行其余步骤。