本任務展示了如何将 TCP 流量從微服務的一個版本逐漸遷移到另一個版本。例如,将 TCP 流量從舊版本遷移到新版本。
一個常見的用例是将 TCP 流量從微服務的一個版本遷移到另一個版本。在 Istio 中,您可以通過配置一系列規則來實作此目标,這些規則将一定比例的 TCP 流量路由到不同的服務。在此任務中,将會把 100% 的 TCP 流量配置設定到
tcp-echo:v1
,接着,再通過配置 Istio 路由權重把 20% 的 TCP 流量配置設定到 tcp-echo:v2
。 開始之前
- 按照安裝指南中的說明安裝 Istio。
- 檢視流量管理概念文檔。
設定測試環境
1、首先,建立一個容器空間用于測試 TCP 流量遷移,并将其标記為使用自動注入 Sidecar 方式。
$ kubectl create namespace istio-io-tcp-traffic-shifting
$ kubectl label namespace istio-io-tcp-traffic-shifting istio-injection=enabled
2、部署 sleep 應用程式,作為發送請求的測試源。
$ kubectl apply -f samples/sleep/sleep.yaml -n istio-io-tcp-traffic-shifting
3、部署
tcp-echo
微服務的
v1
和
v2
版本。
$ kubectl apply -f samples/tcp-echo/tcp-echo-services.yaml -n istio-io-tcp-traffic-shifting
4、根據确定 Ingress IP 和端口 中的說明,定義
TCP_INGRESS_PORT
and
INGRESS_HOST
環境變量.
應用基于權重的 TCP 路由
1、将所有 TCP 流量路由到微服務
tcp-echo
的
v1
kubectl apply -f samples/tcp-echo/tcp-echo-all-v1.yaml -n istio-io-tcp-traffic-shifting
2、通過從
sleep
用戶端發送一些 TCP 流量,确認
tcp-echo
Service 已經啟動并運作。
for i in {1..20}; do \
kubectl exec "$(kubectl get pod -l app=sleep -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})" \
-c sleep -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 2018
one Mon Nov 12 23:25:00 UTC 2018
one Mon Nov 12 23:25:02 UTC 2018
one Mon Nov 12 23:25:05 UTC 2018
one Mon Nov 12 23:25:07 UTC 2018
one Mon Nov 12 23:25:10 UTC 2018
one Mon Nov 12 23:25:12 UTC 2018
one Mon Nov 12 23:25:15 UTC 2018
one Mon Nov 12 23:25:17 UTC 2018
one Mon Nov 12 23:25:19 UTC 2018
...
請注意,所有時間戳都有一個字首 “_one_”,說明所有流量都被路由到
tcp-echo
Service 的
v1
3、通過以下指令,将 20% 流量從
tcp-echo:v1
遷移到
tcp-echo:v2
:
$ kubectl apply -f samples/tcp-echo/tcp-echo-20-v2.yaml -n istio-io-tcp-traffic-shifting
等待幾秒鐘,等到新規則在叢集中生效。
4、确認規則已經被替換:
kubectl get virtualservice tcp-echo -o yaml -n istio-io-tcp-traffic-shifting
apiVersion: networking.istio.io/v1beta1
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
發送更多 TCP 流量到微服務
tcp-echo
for i in {1..20}; do \
kubectl exec "$(kubectl get pod -l app=sleep -n istio-io-tcp-traffic-shifting -o jsonpath={.items..metadata.name})" \
-c sleep -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 2018
two Mon Nov 12 23:38:47 UTC 2018
one Mon Nov 12 23:38:50 UTC 2018
one Mon Nov 12 23:38:52 UTC 2018
one Mon Nov 12 23:38:55 UTC 2018
two Mon Nov 12 23:38:57 UTC 2018
one Mon Nov 12 23:39:00 UTC 2018
one Mon Nov 12 23:39:02 UTC 2018
one Mon Nov 12 23:39:05 UTC 2018
one Mon Nov 12 23:39:07 UTC 2018
...
請注意,大約 20% 的時間戳帶有字首 “_two_”,說明 80% 的 TCP 流量被路由到
tcp-echo
v1
版本,而 20% 的流量被路由到
v2
了解原理
這個任務中,使用 Istio 路由權重特性将
tcp-echo
服務的 TCP 流量從舊版本遷移到了新版本。請注意,這與使用容器編排平台的部署功能進行版本遷移完全不同,後者(容器編排平台)使用了執行個體擴容來管理流量。
在 Istio 中,可以對
tcp-echo
服務的兩個版本進行獨立擴容和縮容,這個過程不會影響兩個服務版本之間的流量配置設定。