TCP 流量轉移
此任務示範如何將 TCP 流量從一個微服務版本轉移到另一個版本。
一個常見的使用情境是將 TCP 流量從舊版本的微服務逐步遷移到新版本。在 Istio 中,您可以透過設定一系列路由規則來實現此目標,這些規則會將一部分 TCP 流量從一個目的地重新導向到另一個目的地。
在這個任務中,您將把 100% 的 TCP 流量發送到 tcp-echo:v1
。然後,您將使用 Istio 的加權路由功能,將 20% 的 TCP 流量路由到 tcp-echo:v2
。
開始之前
設定測試環境
首先,建立一個用於測試 TCP 流量轉移的命名空間。
$ kubectl create namespace istio-io-tcp-traffic-shifting
部署 curl 範例應用程式,以作為傳送請求的測試來源。
$ kubectl apply -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting
部署
tcp-echo
微服務的v1
和v2
版本。$ kubectl apply -f @samples/tcp-echo/tcp-echo-services.yaml@ -n istio-io-tcp-traffic-shifting
套用基於權重的 TCP 路由
- 將所有 TCP 流量路由到
tcp-echo
微服務的v1
版本。
$ kubectl apply -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
$ kubectl apply -f @samples/tcp-echo/gateway-api/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
- 確定 Ingress IP 和 Port
使用以下命令設定 SECURE_INGRESS_PORT
和 INGRESS_HOST
環境變數
$ kubectl wait --for=condition=programmed gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting
$ export INGRESS_HOST=$(kubectl get gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting -o jsonpath='{.status.addresses[0].value}')
$ export TCP_INGRESS_PORT=$(kubectl get gtw tcp-echo-gateway -n istio-io-tcp-traffic-shifting -o jsonpath='{.spec.listeners[?(@.name=="tcp-31400")].port}')
傳送一些 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
版本。使用以下命令將 20% 的流量從
tcp-echo:v1
轉移到tcp-echo:v2
$ kubectl apply -f @samples/tcp-echo/tcp-echo-20-v2.yaml@ -n istio-io-tcp-traffic-shifting
$ kubectl apply -f @samples/tcp-echo/gateway-api/tcp-echo-20-v2.yaml@ -n istio-io-tcp-traffic-shifting
- 等待幾秒鐘讓新規則傳播,然後確認規則已替換。
$ 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
$ kubectl get tcproute tcp-echo -o yaml -n istio-io-tcp-traffic-shifting
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
...
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: tcp-echo-gateway
sectionName: tcp-31400
rules:
- backendRefs:
- group: ""
kind: Service
name: tcp-echo-v1
port: 9000
weight: 80
- group: ""
kind: Service
name: tcp-echo-v2
port: 9000
weight: 20
...
向
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 部署。
清理
- 移除路由規則
$ kubectl delete -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
$ kubectl delete -f @samples/tcp-echo/gateway-api/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
移除
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