使用網際網路網路端點群組設定外部後端

本文說明如何使用網際網路網路端點群組 (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.10010.0.0.10110.0.0.102。存在可確保 Envoy Proxy 與這些遠端端點連線的路徑。

產生的部署作業類似如下。

使用網際網路 NEG 的設定範例。
使用網際網路 NEG 的設定範例 (按一下可放大)

使用網際網路 NEG 進行流量路由,並透過 SNI 使用 TLS

使用 FQDN 和 TLS 設定 Cloud Service Mesh,以處理輸出流量後,範例部署作業的行為會如下圖和流量說明所示。

範例中的流量轉送方式。
範例中的流量路徑 (按一下可放大)

下表中的步驟對應至上一個圖表中的編號。

步驟 說明
0 Envoy 會透過 xDS 從 Cloud Service Mesh 接收 FQDN 後端設定。
0 在 VM 中執行的 Envoy 會持續查詢 DNS,以取得已設定的 FQDN。
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 會將要求 Proxy 至遠端端點。

圖表中未顯示,但如果已設定健康狀態檢查,Envoy 會持續檢查遠端端點的健康狀態,並只將要求轉送至健康狀態良好的端點。

設定混合式連線

本文也假設您已建立混合式連線:

  • 透過 Cloud VPN 或 Cloud Interconnect,在虛擬私有雲網路與地端部署服務或第三方公有雲之間建立混合式連線。
  • 虛擬私有雲防火牆規則和路由已正確設定,可建立從 Envoy 到私人服務端點的雙向可連線性,以及 (選用) 到地端部署 DNS 伺服器的連線。
  • 如要成功執行區域 HA 容錯移轉情境,請啟用全域動態轉送。詳情請參閱動態轉送模式

設定 Cloud DNS

請使用下列指令,為網域 (FQDN) example.com 設定 Cloud DNS 私人區域,該網域的 A 記錄指向端點 10.0.0.10010.0.0.10110.0.0.10210.0.0.103

gcloud

  1. 建立 DNS 代管私人區域,並附加至預設網路:
    gcloud dns managed-zones create example-zone \
        --description=test \
        --dns-name=example.com \
        --networks=default \
        --visibility=private
    
  1. 將 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 NEG 設定 Cloud Service Mesh

在本節中,您將設定 Cloud Service Mesh,並使用網際網路 FQDN NEG。

建立 NEG、健康狀態檢查和後端服務

gcloud

  1. 建立網際網路 NEG:
    gcloud compute network-endpoint-groups create on-prem-service-a-neg \
        --global \
        --network-endpoint-type INTERNET_FQDN_PORT
    
  1. FQDN:Port 端點新增至網際網路 NEG:
    gcloud compute network-endpoint-groups update on-prem-service-a-neg \
        --global \
        --add-endpoint=fqdn=example.com,port=443
    
  1. 建立全域健康狀態檢查:
    gcloud compute health-checks create http service-a-http-health-check \
        --global
    
  1. 建立名為 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
    
  1. 將名為 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

  1. 建立網址對應:
    gcloud compute url-maps create td-url-map \
        --default-service on-prem-service-a
    
  1. 建立目標 HTTP Proxy,並將網址對應與目標 Proxy 建立關聯:
    gcloud compute target-http-proxies create td-proxy \
        --url-map td-url-map
    
  1. 使用 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 政策會指定用戶端身分和驗證機制,供用戶端傳送外送要求給特定服務時使用。用戶端 TLS 政策會透過 securitySettings 欄位附加至後端服務資源。

gcloud

  1. 建立及匯入用戶端 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
    
  1. 如果您在上一節中,為後端服務設定 HTTP 健康狀態檢查,請從後端服務中分離健康狀態檢查:
    gcloud compute backend-services update on-prem-service-a \
        --global \
        --no-health-checks
    
  1. 建立 HTTPS 健康狀態檢查:
    gcloud compute health-checks create https service-a-https-health-check \
        --global
    
  1. 將用戶端 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:

  1. 為 FQDN 設定 DNS 記錄。
  2. 使用 FQDN 建立新的網際網路 NEG。
  3. 建立新的後端服務,並將您在步驟 2 建立的網際網路 NEG 設為後端。將您用於混合式連線 NEG 後端服務的相同健康狀態檢查,與新的後端服務建立關聯。確認新的遠端端點是否正常運作。
  4. 更新轉送規則對應關係,方法是取代包含混合式連線能力 NEG 的舊後端,藉此參照新的後端服務。
  5. 如果您想在實際工作環境部署期間進行即時遷移,且不希望發生任何停機時間,可以使用以權重為準的流量。一開始,請將新後端服務設為只接收一小部分的流量,例如 5%。請按照設定流量分配的操作說明進行操作。
    1. 確認新的遠端端點是否正確提供流量。
  6. 如果使用加權流量拆分,請將新後端服務設為接收 100% 的流量。這個步驟會排空舊的後端服務。
  7. 確認新的後端服務可正常提供流量後,請刪除舊的後端服務。

疑難排解

如要解決部署問題,請按照本節中的指示操作。如果這些資訊無法解決問題,請參閱「排解使用 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。

如果這個衝突導致要求抵達地端部署端點時,處理或轉送要求發生問題,您可以將 Host 標頭重新寫入為 altostrat.com (Host: altostrat.com),做為解決方法。您可以在 Cloud Service Mesh 中使用 URL 重新寫入,或在具備標頭重新寫入功能的遠端端點上執行這項操作。

另一個較不複雜的解決方法是將 Host 標頭設為 altostrat.com (Host: altostrat.com),並使用特殊地址 0.0.0.0 做為轉送規則的 IP 位址。

Envoy 傳回許多 5xx 錯誤

如果 Envy 傳回的 5xx 錯誤過多,請採取下列行動:

  • 檢查 Envoy 記錄,判斷回應是否來自後端 (地端部署後端),以及 5xx 錯誤的原因。
  • 確認 DNS 查詢成功,且沒有 SERVFAILNXDOMAIN 錯誤。
  • 確認所有遠端端點都通過健康狀態檢查。
  • 如果未設定健康狀態檢查,請確認所有端點都能從 Envoy 存取。檢查Google Cloud 端和地端部署端的防火牆規則和路徑。

無法透過公開網際網路從服務網格連線至外部服務

您可以在 Cloud Service Mesh 中使用 FQDN 後端,將流量傳送至公開網際網路上的服務。您必須先在 Envoy 用戶端與外部服務之間建立網際網路連線。如果在連線至外部服務時發生 502 錯誤,請按照下列步驟操作:

  • 請確認您已設定正確的路徑,尤其是預設路徑 0.0.0.0/0 和防火牆規則。
  • 確認 DNS 查詢成功,且沒有 SERVFAILNXDOMAIN 錯誤。
  • 如果 Envoy Proxy 是在沒有外部 IP 位址的 Compute Engine VM 上執行,或是在私有 GKE 叢集中執行,您需要設定 Cloud NAT 或其他方式,建立輸出網際網路連線。

如果錯誤仍未解決,或您收到其他 5xx 錯誤,請檢查 Envoy 記錄,縮小錯誤來源範圍。

無法從服務網格連線至無伺服器服務

您可以在 Cloud Service Mesh 中使用 FQDN 後端,將流量傳送至無伺服器 (Cloud Run、Cloud Run functions 和 App Engine) 服務。如果 Envoy Proxy 是在沒有外部 IP 位址的 Compute Engine VM 上執行,或是在私有 GKE 叢集中執行,您必須在子網路上設定 Private Google Access,才能存取 Google API 和服務。

後續步驟