天天看點

istio的tcp流量轉移

本任務展示了如何将 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

服務的兩個版本進行獨立擴容和縮容,這個過程不會影響兩個服務版本之間的流量配置設定。