TCPトラフィックシフト
このタスクでは、マイクロサービスの1つのバージョンから別のバージョンにTCPトラフィックをシフトする方法を示します。
一般的なユースケースは、マイクロサービスの古いバージョンから新しいバージョンにTCPトラフィックを段階的に移行することです。Istioでは、ある宛先から別の宛先へのTCPトラフィックの割合をリダイレクトするルーティングルールのシーケンスを構成することで、この目標を達成します。
このタスクでは、TCPトラフィックの100%をtcp-echo:v1
に送信します。次に、Istioの重み付きルーティング機能を使用して、TCPトラフィックの20%を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アドレスとポートを決定する
次のコマンドを使用して、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
バージョンにルーティングされたことを意味します。次のコマンドを使用して、
tcp-echo:v1
からtcp-echo:v2
にトラフィックの20%を転送します。
$ 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になっていることに気づくはずです。これは、TCPトラフィックの80%が
tcp-echo
サービスのv1
バージョンにルーティングされ、20%がv2
にルーティングされたことを意味します。
何が起こったかの理解
このタスクでは、Istioの重み付けルーティング機能を使用して、tcp-echo
サービスの古いバージョンから新しいバージョンにTCPトラフィックを部分的に移行しました。これは、コンテナオーケストレーションプラットフォームのデプロイ機能を使用したバージョン移行とは大きく異なり、インスタンスのスケーリングを使用してトラフィックを管理していることに注意してください。
Istioを使用すると、tcp-echo
サービスの2つのバージョンを、それらの間のトラフィック分散に影響を与えることなく、独立してスケールアップおよびスケールダウンさせることができます。
オートスケーリングを使用したバージョンルーティングの詳細については、ブログ記事Istioを使用したカナリアデプロイを参照してください。
クリーンアップ
- ルーティングルールを削除する
$ 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