Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Private Service Connect

Возможность плана Scale

GCP PSC доступна в тарифах Scale и Enterprise. Чтобы перейти на более высокий тариф, откройте страницу тарифов в облачной консоли.

Private Service Connect (PSC) — это сетевая функция Google Cloud, которая позволяет потребителям получать частный доступ к управляемым сервисам внутри своей сети виртуального частного облака (VPC). Аналогично, она позволяет поставщикам управляемых сервисов размещать эти сервисы в собственных отдельных сетях VPC и предоставлять потребителям частное подключение.

Поставщики сервисов публикуют свои приложения для потребителей, создавая сервисы Private Service Connect. Потребители сервисов получают доступ к этим сервисам Private Service Connect напрямую через один из типов Private Service Connect.

Обзор Private Service Connect

Важные моменты при использовании Global Access для Private Service Connect:

  1. Регионы, использующие Global Access, должны принадлежать одной и той же VPC.
  2. Global Access должен быть явно включён на уровне PSC (см. снимок экрана ниже).
  3. Убедитесь, что настройки межсетевого экрана не блокируют доступ к PSC из других регионов.
  4. Имейте в виду, что может взиматься плата GCP за межрегиональную передачу данных.

Межрегиональное подключение не поддерживается. Регионы поставщика и потребителя должны совпадать. Однако вы можете подключаться из других регионов в пределах своей VPC, включив Global Access на уровне Private Service Connect (PSC).

Чтобы включить GCP PSC, выполните следующие шаги:

  1. Получите подключение сервиса GCP для Private Service Connect.
  2. Создайте конечную точку сервиса.
  3. Добавьте "Endpoint ID" в сервис ClickHouse Cloud.
  4. Добавьте "Endpoint ID" в список разрешённых для сервиса ClickHouse.

Внимание

ClickHouse старается группировать ваши сервисы, чтобы повторно использовать одну и ту же опубликованную конечную точку PSC в пределах региона GCP. Однако такое группирование не гарантируется, особенно если ваши сервисы распределены между несколькими организациями ClickHouse. Если PSC уже настроен для других сервисов в вашей организации ClickHouse, благодаря такому группированию вы часто можете пропустить большую часть шагов и сразу перейти к последнему: Добавьте "Endpoint ID" в список разрешённых для сервиса ClickHouse.

Примеры Terraform можно найти здесь.

Прежде чем начать

Вам потребуется получить информацию о вашем сервисе ClickHouse Cloud. Это можно сделать либо через консоль ClickHouse Cloud, либо через API ClickHouse. Если вы собираетесь использовать API ClickHouse, перед продолжением задайте следующие переменные окружения:

REGION=<Your region code using the GCP format, for example: us-central1>
PROVIDER=gcp
KEY_ID=<Your ClickHouse key ID>
KEY_SECRET=<Your ClickHouse key secret>
ORG_ID=<Your ClickHouse organization ID>
SERVICE_NAME=<Your ClickHouse service name>

Вы можете создать новый ключ ClickHouse Cloud API или использовать существующий.

Получите свой ClickHouse INSTANCE_ID, отфильтровав по региону, провайдеру и имени сервиса:

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:?}\" and .name==\"${SERVICE_NAME:?}\") | .id " -r)

Получите подключение сервиса GCP и DNS-имя для Private Service Connect

Вариант 1: консоль ClickHouse Cloud

В консоли ClickHouse Cloud откройте сервис, к которому нужно подключиться через Private Service Connect, затем откройте меню Settings. Нажмите кнопку Set up private endpoint. Запишите Service name (endpointServiceId) и DNS-имя (privateDnsHostname) — они понадобятся на следующих этапах.

Частные конечные точки

Вариант 2: API

Получите подключение сервиса GCP и DNS-имя для Private Service Connect:

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": "xxxxxxxxxx.us-central1.p.gcp.clickhouse.cloud"
}

Запишите endpointServiceId и privateDnsHostname. Они понадобятся вам на следующих этапах.

Создайте конечную точку сервиса

В этом разделе вы создадите конечную точку сервиса.

Добавление частного сервисного подключения

Сначала создайте частное сервисное подключение.

Вариант 1: Использование консоли Google Cloud

В консоли Google Cloud перейдите в Network services -> Private Service Connect.

Откройте Private Service Connect в консоли Google Cloud

Откройте диалог создания Private Service Connect, нажав кнопку Connect Endpoint.

  • Target: используйте Published service
  • Target service: используйте endpointServiceIdAPI или Service nameconsole из шага Получение подключения сервиса GCP для Private Service Connect.
  • Endpoint name: укажите имя PSC в поле Endpoint name.
  • Network/Subnetwork/IP address: выберите сеть, которую хотите использовать для подключения. Для конечной точки Private Service Connect потребуется создать IP-адрес или использовать существующий. В нашем примере мы заранее создали адрес с именем your-ip-address и назначили ему IP-адрес 10.128.0.2.
  • Чтобы конечная точка была доступна из любого региона, можно установить флажок Enable global access.
Включите Global Access для Private Service Connect

Чтобы создать PSC Endpoint, нажмите кнопку ADD ENDPOINT.

В столбце Status значение изменится с Pending на Accepted, как только подключение будет одобрено.

Скопируйте PSC Connection ID

Скопируйте PSC Connection ID; на следующих шагах он будет использоваться как Endpoint 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 = ""
  # подключение сервиса GCP
  target = "https://www.googleapis.com/compute/v1/$TARGET" # См. примечания ниже
}

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."
}

Задайте приватное DNS-имя для конечной точки

Вам нужно направить «DNS-имя», полученное на шаге Получение подключения сервиса GCP для Private Service Connect, на IP-адрес конечной точки GCP Private Service Connect. Это гарантирует, что сервисы/компоненты в вашей VPC/Network смогут корректно разрешать это имя.

Добавьте Endpoint ID в организацию ClickHouse Cloud

Вариант 1: консоль ClickHouse Cloud

Чтобы добавить конечную точку в организацию, перейдите к шагу Добавить "Endpoint ID" в список разрешённых для сервиса ClickHouse. Если добавить PSC Connection ID в список разрешённых для сервиса через консоль ClickHouse Cloud, он автоматически будет добавлен и в организацию.

Чтобы удалить конечную точку, откройте Organization details -> Private Endpoints и нажмите кнопку удаления.

Удаление частной конечной точки из ClickHouse Cloud

Вариант 2: API

Перед выполнением любых команд задайте следующие переменные среды:

Замените ENDPOINT_ID ниже значением Endpoint 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

Добавьте "Endpoint ID" в список разрешённых для сервиса ClickHouse

Необходимо добавить Endpoint ID в список разрешённых для каждого экземпляра, который должен быть доступен через Private Service Connect.

Вариант 1: консоль ClickHouse Cloud

В консоли ClickHouse Cloud откройте сервис, который нужно подключить через Private Service Connect, затем перейдите в раздел Настройки. Введите Endpoint ID, полученный на шаге Добавление частного сервисного подключения. Нажмите Создать конечную точку.

Фильтр частных конечных точек

Вариант 2: API

Перед выполнением любых команд задайте эти переменные окружения:

Замените ENDPOINT_ID ниже значением Endpoint 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, нужно использовать частную конечную точку, а именно privateDnsHostname из шага Получение подключения сервиса GCP и имени DNS для Private Service Connect.

Получение частного DNS-имени хоста

Вариант 1: консоль ClickHouse Cloud

В консоли ClickHouse Cloud перейдите в раздел Настройки. Нажмите кнопку Настроить частную конечную точку. В открывшейся выдвижной панели скопируйте DNS-имя.

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 — используйте privateDnsHostname из шага Получение подключения сервиса GCP для Private Service Connect и DNS-имени

nslookup $DNS_NAME
Non-authoritative answer:
...
Address: 10.128.0.2

Сброс соединения удалённой стороной

Проверка подключения

Если у вас возникают проблемы с подключением через ссылку PSC, проверьте соединение с помощью openssl. Убедитесь, что статус конечной точки Private Service Connect — Accepted:

OpenSSL должен успешно подключаться (в выводе должно отображаться CONNECTED). errno=104 — ожидаемое значение.

DNS_NAME — используйте privateDnsHostname из шага Получение подключения сервиса GCP и DNS-имени для Private Service Connect

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

Подключение к удалённой базе данных

Согласно документации GCP Private Service Connect:

Сервисно-ориентированная архитектура: сервисы-производители публикуются через балансировщики нагрузки, которые предоставляют сети VPC-потребителя один IP-адрес. Трафик потребителя, обращающийся к сервисам производителя, является однонаправленным и может получать доступ только к IP-адресу сервиса, а не ко всей VPC-сети, связанной через пиринг.

Чтобы подключить табличные функции MySQL или PostgreSQL в ClickHouse Cloud к базе данных, размещённой в вашей GCP VPC, настройте правила firewall в вашей GCP VPC так, чтобы разрешить подключения из ClickHouse Cloud. См. IP-адреса egress по умолчанию для регионов ClickHouse Cloud, а также доступные статические IP-адреса.

Дополнительная информация

Более подробную информацию см. здесь: cloud.google.com/vpc/docs/configure-private-service-connect-services.

Navigation