Private Service Connect — использование потребительских элементов управления службами HTTP(S) для глобального XLB для управляемых служб

1. Введение

Private Service Connect позволяет производителю услуг предлагать услуги потребителю услуг. Сеть VPC производителя услуг может поддерживать несколько потребителей услуг.

Существует два типа конечных точек Private Service Connect, которые могут подключаться к опубликованной службе:

  • Конечная точка Private Service Connect (на основе правила переадресации)

При использовании этого типа конечной точки потребители подключаются к определенному ими внутреннему IP-адресу. Private Service Connect выполняет преобразование сетевых адресов (NAT) для маршрутизации запроса производителю службы.

  • Конечная точка Private Service Connect с пользовательскими элементами управления службами HTTP(S) (на основе глобального внешнего балансировщика нагрузки HTTP(S))

При использовании этого типа конечной точки потребители подключаются к внешнему IP-адресу. Private Service Connect использует группу конечных точек сети для маршрутизации запроса производителю службы.

Использование глобального внешнего балансировщика нагрузки HTTP(S) в качестве точки применения политики имеет следующие преимущества:

  • Вы можете переименовывать службы и сопоставлять их с URL-адресами по вашему выбору.
  • Вы можете настроить балансировщик нагрузки для регистрации всех запросов в Cloud Logging.
  • Вы можете использовать сертификаты TLS, управляемые клиентом. или сертификаты, управляемые Google.

В этой лабораторной работе вы узнаете, как создать элементы управления службами HTTP(S) конечной точки Private Service Connect с использованием глобального XLB для частного доступа к службе в другой сети. Этот шаблон PSC можно реализовать с использованием одного проекта или отдельных проектов. Для целей этой лабораторной работы мы будем использовать один проект с двумя отдельными VPC.

Что вы узнаете

  • Создайте конечную точку Private Service Connect с элементами управления потребительскими службами HTTP(S) с помощью глобального XLB.
  • Настройте управляемую службу, которая будет предоставляться через вложение службы для приема подключений L7 XLB.
  • Создайте сертификат SSL и настройте веб-сервер Apache для завершения TLS и приема трафика через порт 443.
  • Создайте PSC NEG.

Что вам понадобится

  • Проект Google Cloud
  • Знание развертывания экземпляров и настройки сетевых компонентов.

2. Тестовая среда

Среда, которую вы создадите, будет состоять из внешнего балансировщика нагрузки HTTP(S) и PSC NEG в потребительском VPC. В VPC-производителе будет размещен простой веб-сервис Apache, настроенный с использованием HTTPS. Вы создадите серверную службу на основе веб-службы Apache и подключите эту серверную службу к внутреннему балансировщику нагрузки TCP, настроенному с помощью вложения службы PSC.

bbca972cf488ece.png

3. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта.
  • Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Далее вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

В Google Cloud Console щелкните значок Cloud Shell на верхней правой панели инструментов:

55efc1aaa7a4d3ad.png

Подготовка и подключение к среде займет всего несколько минут. Когда все будет готово, вы должны увидеть что-то вроде этого:

7ffe5cbb04455448.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лабораторной работе можно выполнять с помощью простого браузера.

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

Включить API

В Cloud Shell убедитесь, что идентификатор вашего проекта настроен.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
echo $project
echo $region

Включите все необходимые сервисы

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com

5. Производитель VPC, подсеть, настройка правил брандмауэра.

Сеть VPC

Из Cloud Shell

gcloud compute networks create producer-vpc --subnet-mode custom

Создание подсетей

Подсеть необходима на стороне производителя для выполнения трансляции сетевых адресов (NAT) для PSC. Обратите внимание, что цель — PRIVATE_SERVICE_CONNECT. Это означает, что эту подсеть нельзя использовать для развертывания рабочих нагрузок.

Из Cloud Shell

gcloud compute networks subnets create producer-nat-subnet \
--network=producer-vpc \
--region=$region \
--range=10.100.100.0/24 \
--purpose=PRIVATE_SERVICE_CONNECT

Мы развернем две подсети в VPC-производителе. Первым развернул службу производителя, а еще один в другом регионе развернул клиентскую виртуальную машину для проверки подключения к службе через глобальный доступ на внутреннем балансировщике нагрузки TCP.

Из Cloud Shell

gcloud compute networks subnets create service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/24 \
    --region=$region

Из Cloud Shell

gcloud compute networks subnets create client-subnet \
    --network=producer-vpc \
    --range=10.0.1.0/24 \
    --region=us-east4

Создать облачный NAT

Облачный NAT необходим для установки соответствующих пакетов для наших сервисов производителя.

Из Cloud Shell

gcloud compute routers create service-cr \
--region=$region --network=producer-vpc \
--asn=65501

Из Cloud Shell

gcloud compute routers nats create service-nat-gw \
--router=service-cr \
--router-region=$region \
--nat-custom-subnet-ip-ranges=service-subnet \
--auto-allocate-nat-external-ips

Создать правила брандмауэра

В ходе этой лабораторной работы вы будете использовать IAP для подключения к созданным вами экземплярам. Следующее правило брандмауэра позволит вам подключаться к экземплярам через IAP. Если вы предпочитаете не использовать IAP, вы можете пропустить этот шаг и вместо этого добавить общедоступные IP-адреса в экземпляре и создать правило брандмауэра, которое разрешает доступ к TCP-порту 22 с адреса 0.0.0.0/0.

Чтобы разрешить IAP подключаться к вашим экземплярам виртуальных машин, создайте правило брандмауэра, которое:

  • Применяется ко всем экземплярам виртуальных машин, доступ к которым вы хотите сделать с помощью IAP.
  • Разрешает входящий трафик из диапазона IP 35.235.240.0/20. Этот диапазон содержит все IP-адреса, которые IAP использует для пересылки TCP.

Из Cloud Shell

gcloud compute firewall-rules create allow-ssh-iap \
    --network producer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

Клиентский трафик будет исходить от глобального внешнего балансировщика нагрузки HTTP(S), поэтому необходимо создать правило брандмауэра, чтобы разрешить этот трафик к помеченным целевым серверам, на которых будет размещаться наша веб-служба. Мы также откроем правило брандмауэра из нашей клиентской подсети в целях тестирования.

Из Cloud Shell

gcloud compute firewall-rules create allow-xlb-client \
  --network=producer-vpc \
  --direction=ingress \
  --allow=tcp:443 \
  --target-tags=psc-service \
  --source-ranges=130.211.0.0/22,35.191.0.0/16,10.0.1.0/24

Создать веб-службу Apache

Мы создадим простую веб-службу Apache, которая отображает «Службу PSC».

Создать шаблон экземпляра

Из Cloud Shell

gcloud compute instance-templates create producer-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=psc-service \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Создать проверку работоспособности для MIG

Из Cloud Shell

gcloud compute health-checks create https psc-service-mig-healthcheck \
    --port=443 \
    --global

Создать группу управляемых экземпляров

Из Cloud Shell

gcloud compute instance-groups managed create psc-service-mig \
    --region $region \
    --size=2 \
    --template=producer-service-template \
    --health-check=psc-service-mig-healthcheck

Настройка SSL на веб-серверах Apache

Далее нам нужно настроить SSL на каждом веб-сервере Apache. Мы сделаем это, создав сертификат и добавив этот сертификат в конфигурацию Apache.

Завершение SSL должно быть настроено на серверных службах, поскольку для этого конкретного шаблона PSC служба должна управляться внутренним балансировщиком нагрузки TCP/UDP (L4). Внутренний балансировщик нагрузки TCP/UDP не завершает SSL на уровне балансировщика нагрузки.

Начните с подключения по SSH к первой виртуальной машине вашего MIG. Зона виртуальной машины и имя виртуальной машины будут динамически распределяться для каждой среды. В консоли выберите Compute Engine > Экземпляры виртуальных машин, чтобы найти имя и зону ваших экземпляров.

Из Cloud Shell

gcloud compute ssh --zone "<YOUR_VM_ZONE>" "<YOUR_MIG_VM_1>"  --tunnel-through-iap --project $project

Далее мы создадим сертификат через OpenSSL. Вам будет предложено заполнить информацию о вашей стране, штате, населенном пункте, организации, названии организационного подразделения, общем имени и адресе электронной почты. Единственная информация, которую вам нужно заполнить, — это общее имя , которое должно быть внутренним полным доменным именем по вашему выбору. Для целей этой лабораторной работы вам следует выбрать example.com .

Из Cloud Shell

sudo openssl genrsa -out private-key-file.pem 2048

Из Cloud Shell

cat <<'EOF' >config.txt
[req]
default_bits              = 2048
req_extensions            = extension_requirements
distinguished_name        = dn_requirements

[extension_requirements]
basicConstraints          = CA:FALSE
keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName            = @sans_list

[dn_requirements]
countryName               = Country Name (2 letter code)
stateOrProvinceName       = State or Province Name (full name)
localityName              = Locality Name (eg, city)
0.organizationName        = Organization Name (eg, company)
organizationalUnitName    = Organizational Unit Name (eg, section)
commonName                = Common Name (e.g. server FQDN or YOUR name)
emailAddress              = Email Address

[sans_list]
DNS.1                     = example.com

EOF

Из Cloud Shell

sudo openssl req -new -key private-key-file.pem \
    -out csr.pem \
    -config config.txt

Из Cloud Shell

sudo openssl x509 -req \
    -signkey private-key-file.pem \
    -in csr.pem \
    -out cert.cert \
    -extfile config.txt \
    -extensions extension_requirements \
    -days 10

Теперь давайте обновим информацию о конфигурации Apache, добавив в нее новые данные сертификата.

sudo vi /etc/apache2/sites-enabled/default-ssl.conf

Добавьте строку в ServerAdmin, которая гласит:

ServerName example.com

Обновите SSLCertificateFile и SSLCertificateKeyFile расположение файла cert.cert и местоположений секретного ключа-file.pem на вашей виртуальной машине. Пример показан ниже. Обязательно обновите <profile>, указав имя вашего каталога.

SSLCertificateFile  /home/<profile>/cert.cert

SSLCertificateKeyFile /home/<profile>/private-key-file.pem

Закройте редактор и перезапустите Apache.

sudo a2enmod ssl
sudo systemctl restart apache2

Выйдите из экземпляра и повторите те же действия на другом экземпляре в группе управляемых экземпляров.

6. Создайте службу продюсера

Далее мы создадим компоненты балансировщика нагрузки для службы.

Создайте проверку работоспособности балансировщика нагрузки.

Из Cloud Shell

gcloud compute health-checks create https service-lb-healthcheck \
    --port=443 \
    --region=$region

Создайте серверную службу.

Из Cloud Shell

 gcloud compute backend-services create psc-backend-service \
    --load-balancing-scheme=internal \
    --protocol=TCP \
    --region=$region \
    --health-checks=service-lb-healthcheck \
    --health-checks-region=$region

gcloud compute backend-services add-backend psc-backend-service \
--region=$region \
--instance-group=psc-service-mig

Создайте правило переадресации. Обратите внимание, что правило переадресации должно быть настроено на порту 443 и с глобальным доступом. Это необходимо для работы шаблона PSC.

Из Cloud Shell

 gcloud compute forwarding-rules create producer-fr \
    --region=$region \
    --load-balancing-scheme=internal \
    --network=producer-vpc \
    --subnet=service-subnet \
    --address=10.0.0.100 \
    --ip-protocol=TCP \
    --ports=443 \
    --backend-service=psc-backend-service \
    --backend-service-region=$region \
    --allow-global-access

7. Проверьте сервис

Прежде чем создавать вложение службы, мы создадим клиент в другом регионе для тестирования балансировщика нагрузки, настроенного с глобальным доступом, а также службы Apache, настроенной для завершения TLS.

Из Cloud Shell

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=client-subnet \
    --no-address

SSH в экземпляр.

Из Cloud Shell

gcloud compute ssh \
    --zone "us-east4-a" "vm-client" \
    --tunnel-through-iap \
    --project $project

Протестируйте службу Apache, подключившись через 443 через балансировщик нагрузки.

curl https://example.com:443 -k --connect-to example.com:443:10.0.0.100:443

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

PSC Service

8. Создайте служебное приложение.

Из Cloud Shell

gcloud compute service-attachments create pscservice \
    --region=$region \
    --producer-forwarding-rule=producer-fr \
    --connection-preference=ACCEPT-AUTOMATIC \
    --nat-subnets=producer-nat-subnet

Вам следует записать URI вложения службы, так как он понадобится вам на следующем этапе настройки конечной точки. Вы можете получить его, выполнив следующую команду в Cloud Shell:

Из Cloud Shell

gcloud compute service-attachments describe pscservice --region $region

Скопируйте URI, начиная с /projects.

Пример: /projects/<ВАШ_PROJECT_ID>/regions/us-central1/serviceAttachments/pscservice

9. Настройка потребительского VPC и подсети

Сеть VPC

Из Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

Создать подсеть

На стороне потребителя необходима подсеть, где будет развернута группа конечных точек сети Private Service Connect (NEG).

Из Cloud Shell

gcloud compute networks subnets create psc-neg-subnet \
--network=consumer-vpc \
--region=$region \
--range=10.100.200.0/24 \
--purpose=private

10. Создайте конечную точку Private Service Connect и проверьте соединение.

Мы проследим процесс создания PSC NEG, который будет связан с только что созданным приложением службы, подключим PSC NEG к внутренней службе и свяжем внутреннюю службу с правилом пересылки.

Имейте под рукой URI вложения службы, который мы отметили на последнем шаге. Замените URL-адрес ниже своим URI.

Из Cloud Shell

gcloud beta compute network-endpoint-groups create xlb-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/<PROJECT-ID>/regions/us-central1/serviceAttachments/pscservice \
--region=$region \
--network=consumer-vpc \
--subnet=psc-neg-subnet

Создайте общедоступный IP-адрес XLB и получите назначенный фактический IP-адрес для последующего тестирования.

Из Cloud Shell

gcloud compute addresses create xlb-psc-address \
--ip-version=IPv4 --global

gcloud compute addresses describe xlb-psc-address --format="get(address)" --global

Далее мы создадим конечную точку PSC, в данном случае во внешнем балансировщике нагрузки.

Из Cloud Shell

gcloud beta compute backend-services create pscneg-backend-service \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTPS \
--global

Из Cloud Shell

gcloud beta compute backend-services add-backend pscneg-backend-service \
--network-endpoint-group=xlb-psc-neg \
--network-endpoint-group-region=$region \
--global

Из Cloud Shell

gcloud beta compute url-maps create xlb-psc-map \
--default-service=pscneg-backend-service \
--global

Из Cloud Shell

gcloud beta compute target-http-proxies create psc-http-proxy \
--url-map=xlb-psc-map

Из Cloud Shell

gcloud beta compute forwarding-rules create xlb-psc-fr \
--load-balancing-scheme=EXTERNAL_MANAGED \
--network-tier=PREMIUM \
--address=xlb-psc-address \
--target-http-proxy=psc-http-proxy \
--ports=80 \
--global

Подождите 5–7 минут, а затем введите IP-адрес, связанный с xlb-psc-адресом, в адресную строку вашего браузера.

Если отображается «PSC Service», вы правильно настроили решение.

11. Этапы очистки

Удаление компонентов лаборатории из одного терминала Cloud Shell

gcloud beta compute forwarding-rules delete xlb-psc-fr --global --quiet

gcloud beta compute target-http-proxies delete psc-http-proxy --quiet

gcloud beta compute url-maps delete xlb-psc-map --global --quiet

gcloud beta compute backend-services delete pscneg-backend-service --global --quiet

gcloud compute addresses delete xlb-psc-address --global --quiet

gcloud beta compute network-endpoint-groups delete xlb-psc-neg --region $region --quiet

gcloud compute networks subnets delete psc-neg-subnet --region $region --quiet

gcloud compute networks delete consumer-vpc --quiet

gcloud compute service-attachments delete pscservice --region $region --quiet

gcloud compute instances delete vm-client --zone=us-east4-a --quiet

gcloud compute forwarding-rules delete producer-fr --region $region --quiet

gcloud compute backend-services delete psc-backend-service --region $region --quiet

gcloud compute health-checks delete service-lb-healthcheck --region $region --quiet

gcloud compute instance-groups managed delete psc-service-mig --region $region --quiet

gcloud compute health-checks delete psc-service-mig-healthcheck --region $region --quiet

gcloud compute instance-templates delete producer-service-template --quiet

gcloud compute firewall-rules delete allow-xlb-client --quiet

gcloud compute firewall-rules delete allow-ssh-iap --quiet

gcloud compute routers nats delete service-nat-gw –router service-cr --region $region --quiet

gcloud compute routers delete service-cr --region $region --quiet

gcloud compute networks subnets delete client-subnet --quiet

gcloud compute networks subnets delete service-subnet --quiet

gcloud compute networks subnets delete producer-nat-subnet --quiet

gcloud compute networks delete producer-vpc --quiet

12. Поздравляем!

Поздравляем с завершением работы над кодом.

Что мы рассмотрели

  • Создайте конечную точку Private Service Connect с элементами управления потребительскими службами HTTP(S) с помощью глобального XLB.
  • Настройте управляемую службу, которая будет предоставляться через вложение службы для приема подключений L7 XLB.
  • Создайте сертификат SSL и настройте веб-сервер Apache для завершения TLS и приема трафика через порт 443.
  • Создайте PSC NEG.