使用網際網路端點群組設定外部後端
本文件提供使用網際網路網路端點群組 (NEG) 設定 Cloud Service Mesh 外部後端的操作說明,這項操作需要完整網域名稱。本文件適用於對下列項目具備中級至進階程度熟悉度的使用者:
本設定指南提供下列基本操作說明:
- 設定 Cloud Service Mesh 使用網際網路 NEG 和未經驗證的 TLS 處理傳出流量
- 將流量從服務網格轉送至 Cloud Run 服務
事前準備
詳閱「Cloud Service Mesh 搭配網際網路網路端點群組」總覽。
為了方便說明,本指南的範例設定假設如下:
- 所有相關的 Compute Engine 資源 (例如中介 Proxy、Cloud Service Mesh 資源、Cloud DNS 區域和混合連線) 都會連結至預設的虛擬私有雲 (VPC) 網路。
- 服務
example.com:443
會在您的內部部署基礎架構中執行。網域example.com
由三個端點10.0.0.100
、10.0.0.101
和10.0.0.102
提供服務。路徑可確保 Envoy 代理程式與這些遠端端點的連線。
產生的部署作業會類似下列內容。
使用網際網路 NEG 和 TLS 搭配 SNI 的流量路由
使用 FQDN 和 TLS 處理傳出流量,為 Cloud Service Mesh 設定網路 NEG 後,範例部署作業的行為會如以下圖表和流量說明所示。
下方圖例中的步驟與前述圖表中的編號相對應。
步驟 | 說明 |
---|---|
0 | Envoy 會透過 xDS 從 Cloud Service Mesh 接收 FQDN 後端設定。 |
0 | 在 VM 中執行的 Envoy 會持續查詢已設定 FQDN 的 DNS。 |
1 | 使用者應用程式發出要求。 |
2 | 要求的參數。 |
3 | Envoy Proxy 會攔截要求。這個範例假設您使用 0.0.0.0 做為轉送規則的虛擬 IP 位址 (VIP)。當 0.0.0.0 是 VIP 時,Envoy 會攔截所有要求。無論應用程式產生的原始要求中是否有目的地 IP 位址,要求轉送作業都只會依據第 7 層參數。 |
4 | Envoy 會選取健康的遠端端點,並使用從用戶端 TLS 政策取得的 SNI 執行 TLS 握手。 |
5 | Envoy 會將要求轉送至遠端端點。 |
雖然圖表中未顯示,但如果已設定健康狀態檢查,Envoy 就會持續檢查遠端端點的健康狀態,並將要求只導向健康的端點。
設定混合式連線
本文也假設您已建立混合式連線:
- 使用 Cloud VPN 或 Cloud Interconnect,在 VPC 網路與內部部署服務或第三方公用雲端之間建立混合式連線。
- 正確設定 VPC 防火牆規則和路徑,以便建立從 Envoy 到私人服務端點的雙向可及性,並視需要連線至內部部署 DNS 伺服器。
- 在成功的區域 HA 備援情況下,系統會啟用全域動態轉送。詳情請參閱動態轉送模式。
設定 Cloud DNS
請使用下列指令,為網域 (FQDN) example.com
設定 Cloud DNS 私人區域,該網域的 A
記錄會指向端點 10.0.0.100
、10.0.0.101
、10.0.0.102
和 10.0.0.103
。
gcloud
- 建立 DNS 代管私人區域,並將其附加至預設網路:
gcloud dns managed-zones create example-zone \ --description=test \ --dns-name=example.com \ --networks=default \ --visibility=private
- 將 DNS 記錄新增至私人區域:
gcloud dns record-sets transaction start \ --zone=example-zone gcloud dns record-sets transaction add 10.0.0.100 10.0.0.101 10.0.0.102 10.0.0.103 \ --name=example.com \ --ttl=300 \ --type=A \ --zone=example-zone gcloud dns record-sets transaction execute \ --zone=example-zone
使用網際網路 FQDN 網路端點群組設定 Cloud Service Mesh
在本節中,您將使用網際網路 FQDN NEG 設定 Cloud Service Mesh。
建立 NEG、健康狀態檢查和後端服務
gcloud
- 建立網際網路 NEG:
gcloud compute network-endpoint-groups create on-prem-service-a-neg \ --global \ --network-endpoint-type INTERNET_FQDN_PORT
- 將
FQDN:Port
端點新增至網際網路 NEG:
gcloud compute network-endpoint-groups update on-prem-service-a-neg \ --global \ --add-endpoint=fqdn=example.com,port=443
- 建立全域健康狀態檢查:
gcloud compute health-checks create http service-a-http-health-check \ --global
- 建立名為
on-prem-service-a
的全域後端服務,並將健康狀態檢查與其建立關聯:
gcloud compute backend-services create on-prem-service-a \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --health-checks service-a-http-health-check
- 將名為
on-prem-service-a-neg
的 NEG 新增為後端服務的後端:
gcloud compute backend-services add-backend on-prem-service-a \ --global \ --global-network-endpoint-group \ --network-endpoint-group on-prem-service-a-neg
建立轉送規則對應關係
網址對應、目標 HTTP Proxy 和轉送規則組成轉送規則對應關係,可為網格中的流量提供轉送資訊。
這個網址對應包含一項規則,可將所有 HTTP 流量轉送至 on-prem-service-a
。
gcloud
- 建立網址對應:
gcloud compute url-maps create td-url-map \ --default-service on-prem-service-a
- 建立目標 HTTP Proxy,並將網址對應與目標 Proxy 建立關聯:
gcloud compute target-http-proxies create td-proxy \ --url-map td-url-map
- 使用 IP 位址
0.0.0.0
建立通用轉送規則。這是特殊的 IP 位址,會導致資料層忽略目的地 IP 位址,並只根據要求的 HTTP 參數轉送要求。
gcloud compute forwarding-rules create td-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 \ --target-http-proxy=td-proxy \ --ports=443 \ --network=default
設定未經認證的 TLS 和 HTTPS
您可以視需要在 Envoy Proxy 和內部服務之間設定未經驗證的 HTTPS。這些操作說明也說明如何在 TLS 握手中設定 SNI。
當用戶端向特定服務傳送傳出要求時,用戶端 TLS 政策會指定用戶端身分和驗證機制。使用 securitySettings
欄位,將用戶端 TLS 政策附加至後端服務資源。
gcloud
- 建立及匯入用戶端 TLS 政策,並將 SNI 設為在 NEG 中設定的 FQDN:
cat << EOF > client_unauthenticated_tls_policy.yaml name: "client_unauthenticated_tls_policy" sni: "example.com" EOF gcloud beta network-security client-tls-policies import client_unauthenticated_tls_policy \ --source=client_unauthenticated_tls_policy.yaml \ --location=global
- 如果您在上一節中已為後端服務設定
HTTP
健康狀態檢查,請將健康狀態檢查與後端服務分離:
gcloud compute backend-services update on-prem-service-a \ --global \ --no-health-checks
- 建立
HTTPS
健康狀態檢查:
gcloud compute health-checks create https service-a-https-health-check \ --global
- 將用戶端 TLS 政策附加至先前建立的後端服務,這樣一來,系統就會針對從用戶端傳送至此後端服務的所有連出要求,強制執行未經驗證的 HTTPS:
gcloud compute backend-services export on-prem-service-a \ --global \ --destination=on-prem-service-a.yaml cat << EOF >> on-prem-service-a.yaml securitySettings: clientTlsPolicy: projects/${PROJECT_ID}/locations/global/clientTlsPolicies/client_unauthenticated_tls_policy healthChecks: - projects/${PROJECT_ID}/global/healthChecks/service-a-https-health-check EOF gcloud compute backend-services import on-prem-service-a \ --global \ --source=on-prem-service-a.yaml
您可以使用網際網路 FQDN NEG,將流量路由至可透過 FQDN 存取的任何服務,例如可透過 DNS 解析的外部和內部服務,或是 Cloud Run 服務。
從 IP:Port
NEG 遷移至 FQDN:Port
NEG
NON_GCP_PRIVATE_IP_PORT
NEG 要求您將服務端點程式設計為 NEG 的靜態 IP:PORT
組,而 INTERNET_FQDN_NEG
則可讓端點透過 DNS 動態解析。您可以為內部部署服務端點設定 DNS 記錄,並按照下列步驟設定 Cloud Service Mesh,即可遷移至網際網路 NEG:
- 設定 FQDN 的 DNS 記錄。
- 使用 FQDN 建立新的網際網路 NEG。
- 使用您在步驟 2 中建立的網路 NEG 建立新的後端服務,做為後端。將與混合連結 NEG 後端服務搭配使用的相同健康狀態檢查,與新後端服務建立關聯。確認新的遠端端點是否正常運作。
- 更新轉送規則對應關係,以便參照新的後端服務,方法是取代包含混合連線 NEG 的舊後端。
- 如果您希望在實際部署環境中,直播遷移作業期間不中斷服務,可以使用以權重為準的流量。一開始,請將新的後端服務設為只接收少量流量,例如 5%。請參閱這篇文章,瞭解如何設定流量分配。
- 確認新的遠端端點是否正確提供流量。
- 如果您使用以權重為依據的流量拆分功能,請將新的後端服務設為接收 100% 的流量。這個步驟會耗盡舊的後端服務。
- 確認新後端可順利提供流量,且沒有任何問題後,請刪除舊的後端服務。
疑難排解
如要解決部署問題,請按照本節中的操作說明進行。如果這項資訊無法解決您的問題,請參閱「排解使用 Envoy 的部署問題」。
內部端點未接收流量
如果端點未收到流量,請確認端點通過健康狀態檢查,且 Envoy 用戶端的 DNS 查詢會一致地傳回其 IP 位址。
Envoy 會使用 strict_dns
模式管理連線。它會在所有已解析且處於健康狀態的端點之間平衡流量。在 strict_dns
模式中,端點的解析順序不受限制,但 Envoy 會將流量引導至已從傳回 IP 位址清單中移除的任何端點。
要求到達內部伺服器時,HTTP 主機標頭與 FQDN 不相符
舉例來說,假設網域 example.com
會解析為 10.0.0.1
(即轉送規則的 IP 位址),而網域 altostrat.com
會解析為 10.0.0.100
(即內部服務端點)。您想將流量傳送至 NEG 中設定的網域 altostrat.com
。
Compute Engine 或 GKE 中的應用程式可能會將 HTTP Host
標頭設為 example.com
(Host:
example.com
),並將其帶入內部端點。如果您使用 HTTPS,Envoy 會在 TLS 握手期間將 SNI 設為 altostrat.com
。Envoy 會從用戶端 TLS 政策資源取得 SNI。
如果這項衝突導致在處理或路由要求時發生問題,且該問題發生在內部端點,您可以使用 URL 重寫功能在 Cloud Service Mesh 中進行重寫,或是在遠端端點中進行重寫 (如果該端點具備標頭重寫功能)。Host
altostrat.com
Host: altostrat.com
另一種較不複雜的解決方法是將 Host
標頭設為 altostrat.com
(Host: altostrat.com
),並使用特殊位址 0.0.0.0
做為轉送規則的 IP 位址。
Envoy 傳回許多 5xx 錯誤
如果 Envy 傳回的 5xx 錯誤數量過多,請執行下列操作:
- 查看 Envoy 記錄,判斷回應是否來自後端 (內部部署的後端),以及 5xx 錯誤的原因。
- 請確認 DNS 查詢成功,且沒有
SERVFAIL
或NXDOMAIN
錯誤。 - 確認所有遠端端點都通過健康狀態檢查。
- 如果未設定健康狀態檢查,請確認所有端點都能從 Envoy 存取。請檢查Google Cloud 端和內部部署端的防火牆規則和路徑。
無法透過服務網格透過公開網際網路存取外部服務
您可以使用 Cloud Service Mesh 中的 FQDN 後端,將流量傳送至位於公開網際網路上的服務。您必須先在 Envoy 用戶端和外部服務之間建立網際網路連線。如果在連線至外部服務時收到 502
錯誤,請執行下列操作:
- 請確認您已設定正確的路徑,尤其是預設路徑
0.0.0.0/0
,以及防火牆規則。 - 請確認 DNS 查詢成功,且沒有
SERVFAIL
或NXDOMAIN
錯誤。 - 如果 Envoy 代理程式是在沒有外部 IP 位址的 Compute Engine VM 執行個體上或私人 GKE 叢集中執行,您就需要設定 Cloud NAT 或其他方式,以建立外出網際網路連線。
如果錯誤持續發生,或您收到其他 5xx 錯誤,請查看 Envoy 記錄,縮小錯誤來源範圍。
無法從服務網格存取無伺服器服務
您可以使用 Cloud Service Mesh 中的 FQDN 後端,將流量傳送至無伺服器 (Cloud Run、Cloud Run 函式和 App Engine) 服務。如果 Envoy 代理程式是在沒有外部 IP 位址的 Compute Engine VM 執行個體上,或在私人 GKE 叢集中執行,則您需要在子網路上設定私人 Google 存取權,才能存取 Google API 和服務。
後續步驟
- 如要進一步瞭解用戶端 TLS 政策,請參閱 Cloud Service Mesh 服務安全性和 Network Security API。