1. 簡介
啟用自動 DNS 設定的 Private Service Connect 會使用 Service Directory 和 Cloud DNS,自動建立 DNS 記錄,並在其中編寫消費者 Private Service Connect 端點 IP 位址。
建構項目
在本程式碼研究室中,您將建構完整的 Private Service Connect 架構,說明自動 DNS 的使用方式,如圖 1 所示。
自動 DNS 可透過下列方式運作:
- 生產端服務連結會在建立 Private Service Connect 服務連結時,提供自有公開網域的「–domain-names」標記,藉此產生自動 DNS。
- 消費者定義端點名稱。
- 自動 DNS 會建立 DNS 區域 goog-psc-default-us-central1 和 DNS 名稱 cosmopup.net,以及包含消費者端點名稱的服務目錄項目。
自動 DNS 的優點如圖 4 所示,其中終端使用者可透過 DNS (FQDN stargazer.cosmopup.net) 與消費者端點通訊。
圖 1
課程內容
- 如何建立內部 HTTP(S) 負載平衡器
- 如何建立含有自動 DNS 的服務附件
- 如何建立 Private Service Connect 生產端服務
- 如何使用自動 DNS 存取消費者端點
軟硬體需求
- Google Cloud 專案
- 您擁有的公共領域
2. 事前準備
更新專案以支援程式碼研究室
本程式碼研究室會使用 $variables 協助在 Cloud Shell 中實作 gcloud 設定。
在 Cloud Shell 中執行下列操作:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectname=YOUR-PROJECT-NAME
echo $projectname
3. 製作人設定
建立供應商虛擬私有雲
在 Cloud Shell 中執行下列操作:
gcloud compute networks create producer-vpc --project=$projectname --subnet-mode=custom
建立生產者子網路
在 Cloud Shell 中執行下列操作:
gcloud compute networks subnets create gce-subnet --project=$projectname --range=172.16.20.0/28 --network=producer-vpc --region=us-central1
在 Cloud Shell 中執行下列操作:
gcloud compute networks subnets create load-balancer-subnet --project=$projectname --range=172.16.10.0/28 --network=producer-vpc --region=us-central1
為內部負載平衡器保留 IP 位址
在 Cloud Shell 中執行下列操作:
gcloud compute addresses create lb-ip \
--region=us-central1 \
--subnet=load-balancer-subnet \
--purpose=GCE_ENDPOINT
查看已分配的 IP 位址
使用 compute addresses describe 指令查看已分配的 IP 位址
gcloud compute addresses describe lb-ip --region=us-central1 | grep address:
建立地區 Proxy 子網路
Proxy 分配是在 VPC 網路層級,而非負載平衡器層級。您必須在使用 Envoy 型負載平衡器的虛擬網路 (VPC) 的每個地區,建立一個僅限 Proxy 的子網路 。如果您在相同地區和相同虛擬私有雲網路中部署多個負載平衡器,這些負載平衡器會共用相同的僅限 Proxy 子網路。
- 用戶端連線至負載平衡器轉送規則的 IP 位址和通訊埠。
- 每個 Proxy 都會聽取對應的負載平衡器轉送規則所指定的 IP 位址和通訊埠。其中一個 Proxy 接收並終止用戶端的網路連線。
- Proxy 會根據負載平衡器的網址對應和後端服務,建立與適當後端 VM 的連線。
無論 VPC 網路是自動模式還是自訂模式,都必須建立僅限 Proxy 的子網路。僅限 Proxy 的子網路必須提供 64 個以上的 IP 位址。對應的前置字串長度為 /26 或以下。建議的子網路大小為 /23 (512 個僅限 Proxy 的位址)。
在 Cloud Shell 中執行下列操作:
gcloud compute networks subnets create proxy-subnet-us-central \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=producer-vpc \
--range=172.16.0.0/23
建立 Private Service Connect NAT 子網路
建立一或多個專用子網路,以便與 Private Service Connect 搭配使用。如果您使用 Google Cloud 控制台發布服務,可以在該程序中建立子網路。在與服務負載平衡器相同的地區建立子網路。您無法將一般子網路轉換為 Private Service Connect 子網路。
在 Cloud Shell 中執行下列操作:
gcloud compute networks subnets create psc-nat-subnet \
--project $projectname \
--network producer-vpc \
--region us-central1 \
--range 100.100.10.0/24 \
--purpose PRIVATE_SERVICE_CONNECT
建立生產者防火牆規則
設定 防火牆規則,允許 Private Service Connect NAT 子網路與 ILB proxy 專用子網路之間的流量。
在 Cloud Shell 中執行下列操作:
gcloud compute --project=$projectname firewall-rules create allow-to-ingress-nat-subnet --direction=INGRESS --priority=1000 --network=producer-vpc --action=ALLOW --rules=all --source-ranges=100.100.10.0/24
在 Cloud Shell 中,建立 fw-allow-health-check 防火牆規則,允許 Google Cloud 健康狀態檢查透過 TCP 通訊埠 80 存取產生者服務 (後端服務)。
gcloud compute firewall-rules create fw-allow-health-check \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--rules=tcp:80
為僅限 Proxy 的子網路建立允許輸入的防火牆規則,讓負載平衡器可透過 TCP 通訊埠 80 與後端執行個體通訊。
gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=172.16.0.0/23 \
--rules=tcp:80
Cloud Router 和 NAT 設定
由於 VM 執行個體沒有外部 IP 位址,因此本程式碼研究室會使用 Cloud NAT 安裝軟體套件。
在 Cloud Shell 中建立 Cloud Router。
gcloud compute routers create cloud-router-for-nat --network producer-vpc --region us-central1
在 Cloud Shell 中建立 NAT 閘道。
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
執行個體群組設定
在下一個部分,您將建立 Compute Engine 執行個體和非代管執行個體群組。在後續步驟中,執行個體群組會用來做為負載平衡器後端服務。
在 Cloud Shell 中,建立傳遞至產生者服務的地區健康狀態檢查。
gcloud compute instances create app-server-1 \
--project=$projectname \
--machine-type=e2-micro \
--image-family debian-10 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=gce-subnet \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to App-Server-1 !!' | tee /var/www/html/index.html
EOF"
在 Cloud Shell 中建立非代管執行個體群組。
gcloud compute instance-groups unmanaged create psc-instance-group --zone=us-central1-a
gcloud compute instance-groups unmanaged set-named-ports psc-instance-group --project=$projectname --zone=us-central1-a --named-ports=http:80
gcloud compute instance-groups unmanaged add-instances psc-instance-group --zone=us-central1-a --instances=app-server-1
設定負載平衡器
在後續步驟中,您將設定內部 HTTP 負載平衡器 ,並在後續步驟中將其發布為服務附件
在 Cloud Shell 中建立地區健康狀態檢查。
gcloud compute health-checks create http http-health-check \
--region=us-central1 \
--use-serving-port
在 Cloud Shell 中建立後端服務。
gcloud compute backend-services create l7-ilb-backend-service \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--health-checks=http-health-check \
--health-checks-region=us-central1 \
--region=us-central1
在 Cloud Shell 中,將後端新增至後端服務。
gcloud compute backend-services add-backend l7-ilb-backend-service \
--balancing-mode=UTILIZATION \
--instance-group=psc-instance-group \
--instance-group-zone=us-central1-a \
--region=us-central1
在 Cloud Shell 中建立網址對應,將連入的要求轉送至後端服務。
gcloud compute url-maps create l7-ilb-map \
--default-service l7-ilb-backend-service \
--region=us-central1
建立 HTTP 目標 Proxy。
gcloud compute target-http-proxies create l7-ilb-proxy\
--url-map=l7-ilb-map \
--url-map-region=us-central1 \
--region=us-central1
建立轉送規則,將傳入要求轉送至 Proxy。請勿使用僅限 Proxy 的子網路建立轉送規則。
gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=producer-vpc \
--subnet=load-balancer-subnet \
--address=lb-ip \
--ports=80 \
--region=us-central1 \
--target-http-proxy=l7-ilb-proxy \
--target-http-proxy-region=us-central1
4. 驗證負載平衡器
在 Cloud 控制台中依序前往「網路服務」→「負載平衡」→「負載平衡器」。記下後端服務的健康狀態檢查結果
選取「l7-ilb-map」會產生前端 IP 位址,該 IP 位址應與您在先前步驟中 grep 的 IP 位址相符,並識別後端服務。
5. 建立 Private Service Connect 服務附件
建立服務附件
在 Cloud Shell 中建立服務連結。請務必在網域名稱結尾加上「.」。
gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet --domain-names=cosmopup.net.
選用:如果使用共用虛擬私有雲,請在服務專案中建立服務附件。
gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/us-central1/subnetworks/psc-nat-subnet --domain-names=cosmopup.net.
前往「Network Services」→「Private Service Connect」,查看新建立的服務附件
選取「published-service」可提供更多詳細資料,包括消費者用來建立私人服務連線的服務連結 URI 和網域名稱。
服務附件詳細資料:
projects/<project name>/regions/us-central1/serviceAttachments/published-service
6. 消費者設定
啟用消費者 API
在 Cloud Shell 中執行下列操作:
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
建立用戶虛擬私有雲網路
在 Cloud Shell 中執行下列操作:
gcloud compute networks create consumer-vpc --project=$projectname --subnet-mode=custom
建立消費者子網路
在 Cloud Shell 中,為測試執行個體建立子網路。
gcloud compute networks subnets create db1-subnet --project=$projectname --range=10.20.0.0/28 --network=consumer-vpc --region=us-central1
在 Cloud Shell 中,為消費者端點建立子網路。
gcloud compute networks subnets create consumer-ep-subnet --project=$projectname --range=10.10.0.0/28 --network=consumer-vpc --region=us-central1
建立消費者端點 (轉送規則)
在 Cloud Shell 中,建立要用於消費者端點的靜態 IP 位址。
gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=consumer-ep-subnet --addresses 10.10.0.10
我們會使用先前產生的服務附件 URI 建立消費者端點。
在 Cloud Shell 中建立消費者端點。
gcloud compute forwarding-rules create stargazer --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$projectname/regions/us-central1/serviceAttachments/published-service
7. 驗證消費者的 VPC 網路中的連線
在消費者虛擬私有雲網路中,前往「Network Services」→「Private Service Connect」→「Connected Endpoints」,即可驗證 Private Service Connect 是否連線成功。請注意已建立的 Stargazer 連線,以及我們先前建立的對應 IP 位址。
選取 psc-consumer-1 時,系統會提供詳細資料,包括服務附件 URI
8. 驗證供應商虛擬私有雲網路中的連線
在供應商的虛擬私有雲網路中,前往「Network Services」→「Private Service Connect」→「Published Service」,即可驗證私人服務連線是否成功。請注意,已發布的服務連線現在會顯示 1 個轉送規則 (連線端點)。
9. 驗證自動 DNS 設定
我們來評估 DNS 和 Service Directory 設定。
Cloud DNS 設定
前往「網路服務」→「Cloud DNS」→「區域」。系統會自動產生區域 goog-psc-default-us-central 和 DNS 名稱 cosmopup.net。
查看 DNS 和 Service Directory 設定
選取區域名稱後,我們就能查看 Service Directory 與 Cloud DNS 的整合方式。
Service Directory 設定
前往「Network Services」→「Service Directory」
您還記得消費者端點名稱「stargazer」嗎?系統會在 Service Directory 中自動編寫程式,讓我們可以使用 FQDN stargazer.goog-psc-default–us-central1 存取消費者端點
10. 驗證消費者對生產者服務的存取權
我們會在消費者的虛擬私有雲網路中建立 VM,透過存取消費者端點 stargazer.cosmopup.net 測試已發布的服務連線。
在 Cloud Shell 中,在消費者 VPC 中建立測試執行個體。
gcloud compute instances create db1 \
--zone=us-central1-a \
--image-family=debian-10 \
--image-project=debian-cloud \
--subnet=db1-subnet \
--no-address
如要允許 IAP 連線至您的 VM 執行個體,請根據以下條件建立防火牆規則:
- 套用至所有您希望能透過 IAP 存取的 VM 執行個體。
- 允許來自 IP 範圍 35.235.240.0/20 的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。
在 Cloud Shell 中建立 IAP 防火牆規則。
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
在 Cloud Shell 中使用 IAP 登入 consumer-vm,執行 curl 以驗證與產生者服務的連線。如果發生逾時情形,請重試。
gcloud compute ssh db1 --project=$projectname --zone=us-central1-a --tunnel-through-iap
執行 curl 來驗證與供應者服務的連線。驗證完成後,請從 VM 中退出,返回 Cloud Shell 提示
在 Cloud Shell 中,針對自訂網域執行 curl,例如 stargazer.[custom-domain.com].在下方輸出內容中,curl 會針對 stargazer.cosmopup.net 執行
user@db1:~$ curl -v stargazer.cosmopup.net
* Trying 10.10.0.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55d3aa8190f0)
* Connected to stargazer.cosmopup.net (10.10.0.10) port 80 (#0)
> GET / HTTP/1.1
> Host: stargazer.cosmopup.net
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Thu, 22 Dec 2022 00:16:25 GMT
< server: Apache/2.4.38 (Debian)
< last-modified: Wed, 21 Dec 2022 20:26:32 GMT
< etag: "1b-5f05c5e43a083"
< accept-ranges: bytes
< content-length: 27
< content-type: text/html
< via: 1.1 google
<
Welcome to App-Server-1 !!
退出 VM 並返回 Cloud Shell 提示,開始執行清理工作
11. 清理
在 Cloud Shell 中刪除程式碼研究室元件。
gcloud compute forwarding-rules delete stargazer --region=us-central1 --quiet
gcloud compute instances delete db1 --zone=us-central1-a --quiet
gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet
gcloud compute networks subnets delete consumer-ep-subnet db1-subnet --region=us-central1 --quiet
gcloud compute firewall-rules delete ssh-iap-consumer --quiet
gcloud compute networks delete consumer-vpc --quiet
gcloud compute service-attachments delete published-service --region=us-central1 --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule --region=us-central1 --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy --region=us-central1 --quiet
gcloud compute url-maps delete l7-ilb-map --region=us-central1 --quiet
gcloud compute backend-services delete l7-ilb-backend-service --region=us-central1 --quiet
gcloud compute instance-groups unmanaged delete psc-instance-group --zone=us-central1-a --quiet
gcloud compute instances delete app-server-1 --zone=us-central1-a --quiet
gcloud compute firewall-rules delete allow-to-ingress-nat-subnet fw-allow-health-check fw-allow-proxy-only-subnet --quiet
gcloud compute addresses delete lb-ip --region=us-central1 --quiet
gcloud compute networks subnets delete gce-subnet load-balancer-subnet psc-nat-subnet proxy-subnet-us-central --region=us-central1 --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute networks delete producer-vpc --quiet
12. 恭喜
恭喜,您已成功設定並驗證使用自動 DNS 設定的 Private Service Connect 端點。
您已建立供應商基礎架構,並新增了含有公開網域註冊的服務附件。您已瞭解如何在消費者虛擬私有雲網路中建立消費者端點,以便使用自動產生的 DNS 連線至內部部署服務。
Cosmopup 認為程式碼研究室很棒!
後續步驟
查看一些程式碼研究室…
- 使用 Private Service Connect 透過 GKE 發布及使用服務
- 使用 Private Service Connect 發布及使用服務
- 使用 Private Service Connect 和內部 TCP Proxy 負載平衡器,透過混合式網路連線至地端服務