TCPトラフィックシフト

このタスクでは、マイクロサービスの1つのバージョンから別のバージョンにTCPトラフィックをシフトする方法を示します。

一般的なユースケースは、マイクロサービスの古いバージョンから新しいバージョンにTCPトラフィックを段階的に移行することです。Istioでは、ある宛先から別の宛先へのTCPトラフィックの割合をリダイレクトするルーティングルールのシーケンスを構成することで、この目標を達成します。

このタスクでは、TCPトラフィックの100%をtcp-echo:v1に送信します。次に、Istioの重み付きルーティング機能を使用して、TCPトラフィックの20%をtcp-echo:v2にルーティングします。

始める前に

テスト環境のセットアップ

  1. まず、TCPトラフィックのシフトをテストするための名前空間を作成します。

    $ kubectl create namespace istio-io-tcp-traffic-shifting
    
  2. リクエストを送信するためのテストソースとして、curlサンプルアプリをデプロイします。

    Zip
    $ kubectl apply -f @samples/curl/curl.yaml@ -n istio-io-tcp-traffic-shifting
    
  3. tcp-echoマイクロサービスのv1およびv2バージョンをデプロイします。

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

重みベースのTCPルーティングの適用

  1. すべてのTCPトラフィックをtcp-echoマイクロサービスのv1バージョンにルーティングします。
Zip
$ kubectl apply -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
  1. IngressのIPアドレスとポートを決定する
IngressのIPアドレスとポートの決定の手順に従って、TCP_INGRESS_PORTおよびINGRESS_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. 次のコマンドを使用して、tcp-echo:v1からtcp-echo:v2にトラフィックの20%を転送します。

Zip
$ 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になっていることに気づくはずです。これは、TCPトラフィックの80%がtcp-echoサービスのv1バージョンにルーティングされ、20%がv2にルーティングされたことを意味します。

何が起こったかの理解

このタスクでは、Istioの重み付けルーティング機能を使用して、tcp-echoサービスの古いバージョンから新しいバージョンにTCPトラフィックを部分的に移行しました。これは、コンテナオーケストレーションプラットフォームのデプロイ機能を使用したバージョン移行とは大きく異なり、インスタンスのスケーリングを使用してトラフィックを管理していることに注意してください。

Istioを使用すると、tcp-echoサービスの2つのバージョンを、それらの間のトラフィック分散に影響を与えることなく、独立してスケールアップおよびスケールダウンさせることができます。

オートスケーリングを使用したバージョンルーティングの詳細については、ブログ記事Istioを使用したカナリアデプロイを参照してください。

クリーンアップ

  1. ルーティングルールを削除する
Zip
$ kubectl delete -f @samples/tcp-echo/tcp-echo-all-v1.yaml@ -n istio-io-tcp-traffic-shifting
  1. curlサンプル、tcp-echoアプリケーション、およびテスト名前空間を削除します。

    ZipZip
    $ 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
    
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!