GCP Private Service Connect
Private Service Connect
Private Service Connect (PSC) 是一项 Google Cloud 网络功能,允许消费者在其虚拟私有云 (VPC) 网络内部私密地访问托管服务。 同样,它允许托管服务生产者在其自己独立的 VPC 网络中托管这些服务,并为其消费者提供私有连接。
服务生产者通过创建 Private Service Connect 服务将其应用程序发布给消费者。 服务消费者通过以下 Private Service Connect 类型之一直接访问这些 Private Service Connect 服务。
默认情况下,即使 PSC 连接已批准并建立,ClickHouse 服务也无法通过 Private Service 连接使用; 您需要通过完成以下步骤,在实例级别显式地将 PSC ID 添加到允许列表中。
GCP Private Service Connect 只能在 ClickHouse Cloud 生产服务上启用
不支持跨区域连接。 生产者和消费者区域必须相同。 但是,您可以通过在 Private Service Connect (PSC) 级别启用全局访问,从 VPC 内的其他区域进行连接。
使用 Private Service Connect 全局访问的重要注意事项
- 利用全局访问的区域必须属于同一个 VPC。
- 必须在 PSC 级别显式启用全局访问(请参阅下面的屏幕截图)。
- 确保您的防火墙设置不会阻止从其他区域访问 PSC。
- 请注意,您可能会产生 GCP 区域间数据传输费用。
该过程分为四个步骤
- 获取 Private Service Connect 的 GCP 服务附件。
- 创建服务端点。
- 将端点 ID 添加到 ClickHouse Cloud 组织。
- 将端点 ID 添加到服务允许列表。
在下面的示例中,我们将使用
- GCP 区域:
us-central1
- GCP 项目(客户 GCP 项目):
my-gcp-project
- 客户 GCP 项目中的 GCP 私有 IP 地址:
10.128.0.2
- 客户 GCP 项目中的 GCP VPC:
default
下面提供了代码示例,展示如何在 ClickHouse Cloud 服务中设置 Private Service Connect。
开始之前
您需要检索有关您的 ClickHouse Cloud 服务的信息。 您可以通过 ClickHouse Cloud 控制台或 ClickHouse API 执行此操作。 如果您要使用 ClickHouse API,请在继续之前设置以下环境变量
export REGION=us-central1
export PROVIDER=gcp
export KEY_ID=<Key ID>
export KEY_SECRET=<Key secret>
export ORG_ID=<ClickHouse organization ID>
export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services" | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1)
- 您可以从 ClickHouse 控制台检索您的组织 ID(组织 -> 组织详情)。
- 您可以创建新密钥或使用现有密钥。
获取 Private Service Connect 的 GCP 服务附件和 DNS 名称
选项 1:ClickHouse Cloud 控制台
在 ClickHouse Cloud 控制台中,打开您想要通过 Private Service Connect 连接的服务,然后打开设置菜单。 点击设置私有端点按钮。 记下服务名称(endpointServiceId
)和 DNS 名称(privateDnsHostname
)。 您将在后续步骤中使用它们。
选项 2:API
您需要在区域中至少部署一个实例才能执行此步骤。
获取 Private Service Connect 的 GCP 服务附件和 DNS 名称
curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | jq .result
{
"endpointServiceId": "projects/.../regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud",
"privateDnsHostname": "xb164akwxw.us-central1.p.gcp.clickhouse.cloud"
}
记下 endpointServiceId
和 privateDnsHostname
。 您将在后续步骤中使用它们。
创建服务端点
在本节中,我们将创建一个服务端点。
添加私有服务连接
首先,我们将创建一个私有服务连接。
选项 1:使用 Google Cloud 控制台
在 Google Cloud 控制台中,导航到网络服务 -> Private Service Connect。
点击连接端点按钮,打开 Private Service Connect 创建对话框。
- 目标:使用已发布服务
- 目标服务:使用来自获取 Private Service Connect 的 GCP 服务附件步骤的
endpointServiceId
。 - 端点名称:为 PSC 端点名称设置一个名称。
- 网络/子网/IP 地址:选择您想要用于连接的网络。 您将需要创建一个 IP 地址或使用现有的 IP 地址用于 Private Service Connect 端点。 在我们的示例中,我们预先创建了一个名为 your-ip-address 的地址,并分配了 IP 地址
10.128.0.2
- 要使端点可从任何区域访问,您可以启用启用全局访问复选框。
要创建 PSC 端点,请使用添加端点按钮。
一旦连接获得批准,状态列将从待定更改为已接受。
复制PSC 连接 ID,我们将在后续步骤中将其用作端点 ID。
选项 2:使用 Terraform
provider "google" {
project = "my-gcp-project"
region = "us-central1"
}
variable "region" {
type = string
default = "us-central1"
}
variable "subnetwork" {
type = string
default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/regions/us-central1/subnetworks/default"
}
variable "network" {
type = string
default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default"
}
resource "google_compute_address" "psc_endpoint_ip" {
address = "10.128.0.2"
address_type = "INTERNAL"
name = "your-ip-address"
purpose = "GCE_ENDPOINT"
region = var.region
subnetwork = var.subnetwork
}
resource "google_compute_forwarding_rule" "clickhouse_cloud_psc" {
ip_address = google_compute_address.psc_endpoint_ip.self_link
name = "ch-cloud-${var.region}"
network = var.network
region = var.region
load_balancing_scheme = ""
# service attachment
target = "https://www.googleapis.com/compute/v1/$TARGET" # See below in notes
}
output "psc_connection_id" {
value = google_compute_forwarding_rule.clickhouse_cloud_psc.psc_connection_id
description = "Add GCP PSC Connection ID to allow list on instance level."
}
TARGET - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 endpointServiceId
设置 DNS
提供了两个选项,使用 Google Cloud 控制台和使用 gcloud
CLI。
选项 1:使用 Google Cloud 控制台
- 从支持的区域创建私有 DNS 区域。
- 打开 网络服务 -> Cloud DNS。
- 选择创建区域
在区域类型对话框中,设置
- 区域类型:私有
- 区域名称:输入适当的区域名称。
- DNS 名称:为您的区域使用支持的区域表中的私有 DNS 域列。
- 网络:将 DNS 区域附加到您计划用于使用 PSC 连接到 ClickHouse Cloud 的网络。
在私有 DNS 区域中创建 DNS 记录
将其指向在添加私有服务连接步骤中创建的 IP 地址
选项 2:使用 gcloud
CLI
创建 DNS 区域
gcloud dns \
--project=my-gcp-project \
managed-zones create ch-cloud-us-central1 \
--description="Private DNS zone for PSC" \
--dns-name="us-central1.p.gcp.clickhouse.cloud." \
--visibility="private" \
--networks="https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default"
创建 DNS 记录
gcloud dns \
--project=my-gcp-project \
record-sets create $DNS_RECORD \
--zone="ch-cloud-us-central1" \
--type="A" \
--ttl="300" \
--rrdatas="10.128.0.2"
DNS_RECORD - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 privateDnsHostname
选项 3:使用 Terraform
variable "ch_dns_record" {
type = string
default = "$DNS_NAME" # See below in notes
}
resource "google_dns_managed_zone" "clickhouse_cloud_private_service_connect" {
description = "Private DNS zone for accessing ClickHouse Cloud using Private Service Connect"
dns_name = "${var.region}.p.gcp.clickhouse.cloud."
force_destroy = false
name = "clickhouse-cloud-private-service-connect-${var.region}"
visibility = "private"
}
resource "google_dns_record_set" "psc_dns_record" {
managed_zone = google_dns_managed_zone.clickhouse_cloud_private_service_connect.name
name = "${var.ch_dns_record}"
type = "A"
rrdatas = [google_compute_address.psc_endpoint_ip.address]
}
DNS_NAME - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 privateDnsHostname
验证 DNS 设置
DNS_RECORD - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 privateDnsHostname
ping $DNS_RECORD
将端点 ID 添加到 ClickHouse Cloud 组织
选项 1:ClickHouse Cloud 控制台
要将端点添加到您的组织,请继续执行将端点 ID 添加到服务允许列表步骤。 使用 ClickHouse Cloud 控制台将 PSC 连接 ID
添加到服务允许列表会自动将其添加到组织。
要删除端点,请打开组织详情 -> 私有端点,然后单击删除按钮以删除端点。
选项 2:API
在运行任何命令之前,设置这些环境变量
将下面的 ENDPOINT_ID
替换为来自添加私有服务连接步骤的端点 ID 值
要添加端点,请运行
cat <<EOF | tee pl_config_org.json
{
"privateEndpoints": {
"add": [
{
"cloudProvider": "gcp",
"id": "${ENDPOINT_ID:?}",
"description": "A GCP private endpoint",
"region": "${REGION:?}"
}
]
}
}
EOF
要删除端点,请运行
cat <<EOF | tee pl_config_org.json
{
"privateEndpoints": {
"remove": [
{
"cloudProvider": "gcp",
"id": "${ENDPOINT_ID:?}",
"region": "${REGION:?}"
}
]
}
}
EOF
向组织添加/删除私有端点
curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X PATCH -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?} -d @pl_config_org.json
将端点 ID 添加到服务允许列表
您需要将端点 ID 添加到允许列表中,以便每个实例都可以使用 Private Service Connect。
此步骤不能为开发服务完成。
选项 1:ClickHouse Cloud 控制台
在 ClickHouse Cloud 控制台中,打开您想要通过 Private Service Connect 连接的服务,然后导航到设置。 输入从添加私有服务连接步骤检索到的 Endpoint ID
。 点击创建端点。
如果您想允许从现有 Private Service Connect 连接进行访问,请使用现有的端点下拉菜单。
选项 2:API
在运行任何命令之前,设置这些环境变量
将下面的 ENDPOINT_ID 替换为来自添加私有服务连接步骤的端点 ID 值
对每个应该使用 Private Service Connect 的服务执行此操作。
添加
cat <<EOF | tee pl_config.json
{
"privateEndpointIds": {
"add": [
"${ENDPOINT_ID}"
]
}
}
EOF
删除
cat <<EOF | tee pl_config.json
{
"privateEndpointIds": {
"remove": [
"${ENDPOINT_ID}"
]
}
}
EOF
curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X PATCH -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} -d @pl_config.json | jq
使用 Private Service Connect 访问实例
每个配置了 Private Service Connect 过滤器的实例都有两个端点:公共端点和私有端点。 为了使用 Private Service Connect 进行连接,您需要使用私有端点,请参阅来自获取 Private Service Connect 的 GCP 服务附件步骤的 endpointServiceId
私有 DNS 主机名仅在您的 GCP VPC 中可用。 请勿尝试从位于 GCP VPC 外部的机器解析 DNS 主机。
获取私有 DNS 主机名
选项 1:ClickHouse Cloud 控制台
在 ClickHouse Cloud 控制台中,导航到设置。 点击设置私有端点按钮。 在打开的弹出窗口中,复制 DNS 名称。
选项 2:API
curl --silent --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services/$INSTANCE_ID/privateEndpointConfig | jq .result
{
...
"privateDnsHostname": "xxxxxxx.<region code>.p.gcp.clickhouse.cloud"
}
在此示例中,到 xxxxxxx.yy-xxxxN.p.gcp.clickhouse.cloud
主机名的连接将路由到 Private Service Connect。 同时,xxxxxxx.yy-xxxxN.gcp.clickhouse.cloud
将通过互联网路由。
故障排除
测试 DNS 设置
DNS_NAME - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 privateDnsHostname
nslookup $DNS_NAME
Non-authoritative answer:
...
Address: 10.128.0.2
连接被对端重置
- 最有可能的是,端点 ID 未添加到服务允许列表中。 重新访问将端点 ID 添加到服务允许列表 步骤。
测试连接性
如果您在使用 PSC 链接连接时遇到问题,请使用 openssl
检查您的连接性。 确保 Private Service Connect 端点状态为 Accepted
OpenSSL 应该能够连接(请参阅输出中的 CONNECTED)。 errno=104
是预期的。
DNS_NAME - 使用来自获取 Private Service Connect 的 GCP 服务附件步骤的 privateDnsHostname
openssl s_client -connect ${DNS_NAME}:9440
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 335 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
检查端点过滤器
REST API
curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}" | jq .result.privateEndpointIds
[
"102600141743718403"
]
连接到远程数据库
假设您尝试在 ClickHouse Cloud 中使用 MySQL 或 PostgreSQL 表函数,并连接到托管在 GCP 中的数据库。 GCP PSC 不能用于安全地启用此连接。 PSC 是单向的、单向连接。 它允许您的内部网络或 GCP VPC 安全地连接到 ClickHouse Cloud,但不允许 ClickHouse Cloud 连接到您的内部网络。
根据GCP Private Service Connect 文档
面向服务的设计:生产者服务通过负载均衡器发布,负载均衡器向消费者 VPC 网络公开单个 IP 地址。 访问生产者服务的消费者流量是单向的,并且只能访问服务 IP 地址,而不能访问整个对等 VPC 网络。
为此,请配置您的 GCP VPC 防火墙规则,以允许从 ClickHouse Cloud 连接到您的内部/私有数据库服务。 检查 ClickHouse Cloud 区域的默认出口 IP 地址,以及可用的静态 IP 地址。
更多信息
有关更多详细信息,请访问 cloud.google.com/vpc/docs/configure-private-service-connect-services。