跳至主要内容

Azure 专用链接

注意

Azure 专用链接只能在 ClickHouse Cloud **生产**服务上启用。**开发**服务不支持。

本指南介绍了如何使用 Azure 专用链接通过 Azure(包括客户自有和 Microsoft 合作伙伴服务)和 ClickHouse Cloud 之间的虚拟网络提供私有连接。Azure 专用链接简化了网络架构并通过消除数据对公用互联网的暴露来保护 Azure 中端点之间的连接。

Overview of PrivateLink

与 AWS 和 GCP 不同,Azure 支持通过专用链接进行跨区域连接。这使您能够在部署了 ClickHouse 服务的不同区域建立 VNET 之间的连接。

注意

跨区域流量可能会产生额外费用。请查看最新的 Azure 文档。

请完成以下步骤以启用 Azure 专用链接

  1. 获取 Azure 专用链接连接别名
  2. 在 Azure 中创建专用端点
  3. 将专用端点 GUID 添加到您的 ClickHouse Cloud 组织
  4. 将专用端点 GUID 添加到您的服务允许列表
  5. 使用专用链接访问您的 ClickHouse Cloud 服务

在此处找到 Azure 专用链接的完整 Terraform 示例 此处

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,打开您希望通过 PrivateLink 连接的服务,然后打开**设置**菜单。单击**设置专用端点**按钮。复制将用于设置专用链接的**服务名称**。

Private Endpoints

选项 2:API

在开始之前,您需要一个 ClickHouse Cloud API 密钥。您可以创建一个新密钥或使用现有密钥。请注意,您需要一个**管理员**密钥来管理专用链接配置。

获得 API 密钥后,在运行任何命令之前设置以下环境变量

REGION=<region code, use Azure format>
PROVIDER=azure
KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<set ClickHouse organization ID>

从您的区域获取实例 ID

您需要在指定的区域中部署至少一个 ClickHouse Cloud 服务才能执行此步骤。

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 | tee instance_id

使用您在上一步中收到的 ID 创建一个INSTANCE_ID环境变量

INSTANCE_ID=$(cat instance_id)

获取您的 Azure 专用链接连接别名和专用 DNS 主机名

curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | jq  .result 
{
"endpointServiceId": "production-westus3-0-0.63c890a9-4d32-48cc-a08c-8cd92dfb1ad3.westus3.azure.privatelinkservice",
...
}

记下endpointServiceId。您将在下一步中使用它。

在 Azure 中创建专用端点

在本节中,我们将创建 Azure 中的专用端点。您可以使用 Azure 门户或 Terraform。

选项 1:使用 Azure 门户在 Azure 中创建专用端点

在 Azure 门户中,打开**专用链接中心→专用端点**。

Open Azure Private Center

通过单击**创建**按钮打开专用端点创建对话框。

Create PE


在以下屏幕中,指定以下选项

  • **订阅** / **资源组**:请选择专用端点的 Azure 订阅和资源组。
  • **名称**:为**专用端点**设置一个名称。
  • **区域**:选择将通过专用链接连接到 ClickHouse Cloud 的已部署 VNET 所在的区域。

完成上述步骤后,单击**下一步:资源**按钮。

Create PE


选择选项**通过资源 ID 或别名连接到 Azure 资源**。

对于**资源 ID 或别名**,使用您从获取 Azure 专用链接连接别名步骤中获得的endpointServiceId

单击**下一步:虚拟网络**按钮。

PE resource


  • **虚拟网络**:选择要使用专用链接连接到 ClickHouse Cloud 的 VNET
  • **子网**:选择将在其中创建专用端点的子网

可选

  • **应用程序安全组**:您可以将 ASG 附加到专用端点,并在网络安全组中使用它来过滤进出专用端点的网络流量。

单击**下一步:DNS**按钮。

PE network

单击**下一步:标签**按钮。


PE DNS

可以选择将标签附加到您的专用端点。

单击**下一步:查看 + 创建**按钮。


PE tags

最后,单击**创建**按钮。

PE review

已创建的专用端点的**连接状态**将处于**挂起**状态。一旦您将此专用端点添加到服务允许列表,它将更改为**已批准**状态。

打开与专用端点关联的网络接口并复制**私有 IPv4 地址**(在此示例中为 10.0.0.4),您将在后续步骤中需要此信息。

PE IP address

选项 2:使用 Terraform 在 Azure 中创建专用端点

使用以下模板使用 Terrafrom 创建专用端点

resource "azurerm_private_endpoint" "example_clickhouse_cloud" {
name = var.pe_name
location = var.pe_location
resource_group_name = var.pe_resource_group_name
subnet_id = var.pe_subnet_id

private_service_connection {
name = "test-pl"
private_connection_resource_alias = "<data from 'Obtain Azure connection alias for Private Link' step>"
is_manual_connection = true
}
}

获取专用端点 resourceGuid

为了使用专用链接,您需要将专用端点连接 GUID 添加到您的服务允许列表。

专用端点资源 GUID 仅在 Azure 门户中公开。打开上一步中创建的专用端点,然后单击**JSON 视图**

PE GUID

在属性下,找到resourceGuid字段并复制此值

PE GUID

您需要创建专用 DNS 区域(${location_code}.privatelink.azure.clickhouse.cloud)并将其附加到您的 VNET 以通过专用链接访问资源。

创建专用 DNS 区域

选项 1:使用 Azure 门户

请按照以下指南使用 Azure 门户创建 Azure 私有 DNS 区域

选项 2:使用 Terraform

使用以下 Terraform 模板创建专用 DNS 区域

resource "azurerm_private_dns_zone" "clickhouse_cloud_private_link_zone" {
name = "${var.location}.privatelink.azure.clickhouse.cloud"
resource_group_name = var.resource_group_name
}

创建通配符 DNS 记录

创建一个通配符记录并指向您的专用端点

选项 1:使用 Azure 门户

  1. 打开 MyAzureResourceGroup 资源组并选择${region_code}.privatelink.azure.clickhouse.cloud私有区域。
  2. 选择 + 记录集。
  3. 对于名称,键入*
  4. 对于 IP 地址,键入您在专用端点中看到的 IP 地址。
  5. 选择**确定**。

PE review

选项 2:使用 Terraform

使用以下 Terraform 模板创建通配符 DNS 记录

resource "azurerm_private_dns_a_record" "example" {
name = "*"
zone_name = var.zone_name
resource_group_name = var.resource_group_name
ttl = 300
records = ["10.0.0.4"]
}

要将私有 DNS 区域链接到虚拟网络,您需要创建一个虚拟网络链接。

选项 1:使用 Azure 门户

请按照以下指南将虚拟网络链接到您的私有 DNS 区域

选项 2:使用 Terraform

使用以下 Terraform 模板将虚拟网络链接到您的私有 DNS 区域

resource "azurerm_private_dns_zone_virtual_network_link" "example" {
name = "test"
resource_group_name = var.resource_group_name
private_dns_zone_name = var.zone_name
virtual_network_id = var.virtual_network_id
}

验证 DNS 设置

westus3.privatelink.azure.clickhouse.cloud 域名下的任何记录都应指向私有终结点 IP。(本例中为 10.0.0.4)。

nslookup instance-id.westus3.privatelink.azure.clickhouse.cloud.
Server: 127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: instance-id.westus3.privatelink.azure.clickhouse.cloud
Address: 10.0.0.4

将私有终结点 GUID 添加到您的 ClickHouse Cloud 组织

选项 1:ClickHouse Cloud 控制台

要将终结点添加到组织,请继续执行将私有终结点 GUID 添加到您的服务允许列表步骤。使用 ClickHouse Cloud 控制台将私有终结点 GUID添加到服务允许列表会自动将其添加到组织。

要删除终结点,请打开**组织详细信息 -> 私有终结点**,然后单击删除按钮以删除终结点。

endpoints

选项 2:API

在运行任何命令之前,请设置以下环境变量

PROVIDER=azure
KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<set ClickHouse organization ID>
ENDPOINT_ID=<Private Endpoint resourceGuid>
REGION=<region code, use Azure format>

使用获取私有终结点 resourceGuid步骤中的数据设置VPC_ENDPOINT环境变量。

运行以下命令以添加私有终结点

cat <<EOF | tee pl_config_org.json
{
"privateEndpoints": {
"add": [
{
"cloudProvider": "azure",
"id": "${ENDPOINT_ID:?}",
"description": "Azure private endpoint",
"region": "${REGION:?}"
}
]
}
}
EOF

您还可以运行以下命令来删除私有终结点

cat <<EOF | tee pl_config_org.json
{
"privateEndpoints": {
"remove": [
{
"cloudProvider": "azure",
"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

将私有终结点 GUID 添加到您的服务允许列表

默认情况下,即使私有链接连接已获批准并建立,ClickHouse Cloud 服务也无法通过私有链接连接使用。您需要为应使用私有链接提供的每个服务显式添加私有终结点 GUID。

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,打开您想通过 PrivateLink 连接的服务,然后导航到**设置**。输入从上一步获取的终结点 ID

注意

如果您想允许来自现有 PrivateLink 连接的访问,请使用现有的终结点下拉菜单。

Private Endpoints

选项 2:API

在运行任何命令之前,请设置这些环境变量

PROVIDER=azure
KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<set ClickHouse organization ID>
ENDPOINT_ID=<Private Endpoint resourceGuid>
INSTANCE_ID=<Instance ID>

对于应使用私有链接提供的每个服务执行此操作。

运行以下命令将私有终结点添加到服务允许列表

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

每个启用了私有链接的服务都具有一个公共终结点和一个私有终结点。为了使用私有链接连接,您需要使用私有终结点,该终结点将为privateDnsHostname

注意

私有 DNS 主机名仅在您的 Azure VNET 中可用。请勿尝试从 Azure VNET 外部的机器解析 DNS 主机。

获取私有 DNS 主机名

选项 1:ClickHouse Cloud 控制台

在 ClickHouse Cloud 控制台中,导航到**设置**。单击**设置私有终结点**按钮。在打开的浮出窗口中,复制**DNS 名称**。

Private Endpoints

选项 2:API

在运行任何命令之前,请设置以下环境变量

KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<set ClickHouse organization ID>
INSTANCE_ID=<Instance ID>

运行以下命令

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>.privatelink.azure.clickhouse.cloud"
}

在本例中,到xxxxxxx.region_code.privatelink.azure.clickhouse.cloud主机名的连接将路由到私有链接。同时,xxxxxxx.region_code.azure.clickhouse.cloud将通过互联网路由。

使用privateDnsHostname通过私有链接连接到您的 ClickHouse Cloud 服务。

故障排除

测试 DNS 设置

来自${region_code}.privatelink.azure.clickhouse.cloud.区域的所有 DNS 记录都应指向在 Azure 中创建私有终结点步骤中的内部 IP 地址。在本例中,区域为westus3

运行以下命令

nslookup abcd.westus3.privatelink.azure.clickhouse.cloud.

您应该会收到以下响应

Non-authoritative answer:
Name: abcd.westus3.privatelink.azure.clickhouse.cloud
Address: 10.0.0.4

连接被对等方重置

很可能,私有终结点 GUID 未添加到服务允许列表中。请重新访问将私有终结点 GUID 添加到您的服务允许列表步骤

私有终结点处于挂起状态

很可能,私有终结点 GUID 未添加到服务允许列表中。请重新访问将私有终结点 GUID 添加到您的服务允许列表步骤

测试连接性

如果您在使用私有链接连接时遇到问题,请使用openssl检查您的连接性。确保私有链接终结点状态为已接受

OpenSSL 应该能够连接(请参阅输出中的 CONNECTED)。errno=104 是预期的。

openssl s_client -connect abcd.westus3.privatelink.azure.clickhouse.cloud.cloud: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)

检查私有终结点筛选器

在运行任何命令之前,请设置以下环境变量

KEY_ID=<Key ID>
KEY_SECRET=<Key secret>
ORG_ID=<please set ClickHouse organization ID>
INSTANCE_ID=<Instance ID>

运行以下命令以检查私有终结点筛选器

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
[]

更多信息

有关 Azure 私有链接的更多信息,请访问azure.microsoft.com/en-us/products/private-link