TCP 流量轉移

此任務示範如何將 TCP 流量從一個微服務版本轉移到另一個版本。

一個常見的使用情境是將 TCP 流量從舊版本的微服務逐步遷移到新版本。在 Istio 中,您可以透過設定一系列路由規則來實現此目標,這些規則會將一部分 TCP 流量從一個目的地重新導向到另一個目的地。

在這個任務中,您將把 100% 的 TCP 流量發送到 tcp-echo:v1。然後,您將使用 Istio 的加權路由功能,將 20% 的 TCP 流量路由到 tcp-echo:v2

開始之前

設定測試環境

  1. 首先,建立一個用於測試 TCP 流量轉移的命名空間。

    $ kubectl create namespace istio-io-tcp-traffic-shifting
    
  2. 部署 curl 範例應用程式,以作為傳送請求的測試來源。

    壓縮
    $ kubectl apply -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting
    
  3. 部署 tcp-echo 微服務的 v1v2 版本。

    壓縮
    $ kubectl apply -f @samples/tcp-echo/tcp-echo-services.yaml@ -n istio-io-tcp-traffic-shifting
    

套用基於權重的 TCP 路由

  1. 將所有 TCP 流量路由到 tcp-echo 微服務的 v1 版本。
壓縮
$ kubectl apply -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
  1. 確定 Ingress IP 和 Port
依照確定 Ingress IP 和 Port中的說明設定 TCP_INGRESS_PORTINGRESS_HOST 環境變數。
  1. 傳送一些 TCP 流量來確認 tcp-echo 服務已啟動並執行。

    $ export CURL=$(kubectl get pod -l app=curl -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})
    $ for i in {1..20}; do \
    kubectl exec "$CURL" -c curl -n istio-io-tcp-traffic-shifting -- sh -c "(date; sleep 1) | nc $INGRESS_HOST $TCP_INGRESS_PORT"; \
    done
    one Mon Nov 12 23:24:57 UTC 2022
    one Mon Nov 12 23:25:00 UTC 2022
    one Mon Nov 12 23:25:02 UTC 2022
    one Mon Nov 12 23:25:05 UTC 2022
    one Mon Nov 12 23:25:07 UTC 2022
    one Mon Nov 12 23:25:10 UTC 2022
    one Mon Nov 12 23:25:12 UTC 2022
    one Mon Nov 12 23:25:15 UTC 2022
    one Mon Nov 12 23:25:17 UTC 2022
    one Mon Nov 12 23:25:19 UTC 2022
    ...
    

    您應該注意到所有時間戳記都有 one 的前綴,這表示所有流量都已路由到 tcp-echo 服務的 v1 版本。

  2. 使用以下命令將 20% 的流量從 tcp-echo:v1 轉移到 tcp-echo:v2

壓縮
$ kubectl apply -f @samples/tcp-echo/tcp-echo-20-v2.yaml@ -n istio-io-tcp-traffic-shifting
  1. 等待幾秒鐘讓新規則傳播,然後確認規則已替換。
$ kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting
apiVersion: networking.istio.io/v1
kind: VirtualService
  ...
spec:
  ...
  tcp:
  - match:
    - port: 31400
    route:
    - destination:
        host: tcp-echo
        port:
          number: 9000
        subset: v1
      weight: 80
    - destination:
        host: tcp-echo
        port:
          number: 9000
        subset: v2
      weight: 20
  1. tcp-echo 微服務傳送更多 TCP 流量。

    $ export CURL=$(kubectl get pod -l app=curl -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})
    $ for i in {1..20}; do \
    kubectl exec "$CURL" -c curl -n istio-io-tcp-traffic-shifting -- sh -c "(date; sleep 1) | nc $INGRESS_HOST $TCP_INGRESS_PORT"; \
    done
    one Mon Nov 12 23:38:45 UTC 2022
    two Mon Nov 12 23:38:47 UTC 2022
    one Mon Nov 12 23:38:50 UTC 2022
    one Mon Nov 12 23:38:52 UTC 2022
    one Mon Nov 12 23:38:55 UTC 2022
    two Mon Nov 12 23:38:57 UTC 2022
    one Mon Nov 12 23:39:00 UTC 2022
    one Mon Nov 12 23:39:02 UTC 2022
    one Mon Nov 12 23:39:05 UTC 2022
    one Mon Nov 12 23:39:07 UTC 2022
    ...
    

    您現在應該注意到大約 20% 的時間戳記有 two 的前綴,這表示 80% 的 TCP 流量已路由到 tcp-echo 服務的 v1 版本,而 20% 已路由到 v2

了解發生了什麼

在這個任務中,您使用 Istio 的加權路由功能,將 TCP 流量從舊版本的 tcp-echo 服務部分遷移到新版本。請注意,這與使用容器編排平台的部署功能來進行版本遷移有很大的不同,後者使用實例擴展來管理流量。

使用 Istio,您可以允許 tcp-echo 服務的兩個版本獨立地擴展和縮減,而不會影響它們之間的流量分配。

如需更多有關使用自動擴展進行版本路由的資訊,請查看部落格文章使用 Istio 的 Canary 部署

清理

  1. 移除路由規則
壓縮
$ kubectl delete -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
  1. 移除 curl 範例、tcp-echo 應用程式和測試命名空間

    壓縮壓縮
    $ kubectl delete -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting
    $ kubectl delete -f @samples/tcp-echo/tcp-echo-services.yaml@ -n istio-io-tcp-traffic-shifting
    $ kubectl delete namespace istio-io-tcp-traffic-shifting
    
此資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!