將 Istio ServiceEntry 遷移至 Compute Engine VM 的 GCPBackend

本頁面說明如何從 ServiceEntry 遷移至 GCPBackend,並展示 Istio 的流量管理功能如何確保順利且安全地完成遷移。

遷移至 GCPBackend 可帶來下列優點:

  1. 端點探索 - 新增或移除 VM 執行個體時,系統會自動更新後端服務中的 VM 端點。
  2. 集中式健康狀態檢查 - 系統會檢查 VM 端點的健康狀態,並自動將流量從健康狀態不佳的後端,改為導向健康狀態良好的後端。
  3. 全域負載平衡和進階負載平衡演算法 - VM 端點可部署在多個區域。使用我們的負載平衡演算法,設定這些區域的負載平衡行為。詳情請參閱 https://cloud.google.com/service-mesh/docs/service-routing/advanced-load-balancing-overview 和 https://cloud.google.com/service-mesh/docs/service-routing/advanced-load-balancing-overview。
  4. 無縫遷移:利用流量拆分和鏡像功能安全遷移流量,不會中斷應用程式。
  5. 提升管理效率:簡化設定和管理程序。

事前準備

以下各節假設您已具備下列條件:

  1. 已啟用 Cloud Service Mesh 的 GKE 叢集
  2. Istio 服務項目。
  3. Compute Engine VM 設定 GCPBackend 資源。

建立或修改現有的 VirtualService,將 ServiceEntry 和 GCPBackend 都納入目的地

您可以運用流量拆分功能,逐步將流量從 ServiceEntry 轉移至 GCPBackend。您應先將一小部分的流量導向 GCPBackend,然後在監控是否有任何問題的同時,逐步增加流量。

以下範例說明如何將 10% 的要求遷移至 GCPBackend。

cat <<EOF > virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gcpbackend-migration
  namespace: NAMESPACE
spec:
  hosts:
  - service-entry.com
  http:
  - route:
    - destination:
        host: gcpbackend.com
      weight: 10 # 10% traffic to gcp backend.
    - destination:
        host: service-entry.com
      weight: 90 # 90% traffic to service entry
EOF
kubectl apply -f virtual-service.yaml

其中:

  • NAMESPACE 是命名空間名稱。

在這個例子中:

  • VIRTUAL_SERVICEgcpbackend-migration
  • SERVICE_ENTRY_HOSTNAMEservice-entry.com
  • GCP_BACKEND_HOSTNAMEgcpbackend.com

(選用) 設定 VirtualService 以進行流量鏡像

為進一步確保順利轉換,您可以設定流量鏡像,將流量副本傳送至 GCPBackend,同時仍主要將流量導向 ServiceEntry。這樣一來,您就能測試及驗證 GCPBackend 設定,而不會影響主要流量。詳情請參閱 Istio Virtual Service API

驗證功能

請參閱應用程式記錄或 Cloud Service Mesh 指標,檢查對 $SERVICE_ENTRY_HOSTNAME 的要求錯誤率。現在應該不會再出現錯了。

如要在應用程式外部進行測試,可以部署 curl 用戶端。如果要求是透過 GCPBackend API 路由傳送,則要求不需要明確附加 IAM 權杖,因為 Cloud Service Mesh 會自動附加。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: testcurl
  namespace: default
spec:
  containers:
  - name: curl
    image: curlimages/curl
    command: ["sleep", "3000"]
EOF

kubectl exec testcurl -c curl -- curl "$SERVICE_ENTRY_HOSTNAME"

輸出內容應為有效的 HTTP 200 回應。