ネットワークトポロジの最適化、アプリケーションサーバーのスケールアウト、またはユーザートラフィックの調整を行う場合は、サービスメッシュ(ASM)コンソールのトラフィック管理センターを使用して、TCP トラフィックをスムーズに移行できます。これにより、ビジネスの継続性とサービスの高可用性を確保できます。このトピックでは、Istio の TCP トラフィックシフトの例に基づいて、アプリケーションのあるバージョンから別のバージョンに TCP トラフィックを移行する方法について説明します。この例では、tcp-echo という名前のアプリケーションには、v1 と v2 の 2 つのバージョンがあります。バージョン v1 では、アプリケーションはレスポンスを返す前に、レスポンスのタイムスタンプにプレフィックス「one」を追加します。バージョン v2 では、アプリケーションはレスポンスを返す前に、レスポンスのタイムスタンプにプレフィックス「two」を追加します。このようにして、トラフィック移行の結果に基づいてトラフィック分割ポリシーを調整し、特定のビジネス要件とパフォーマンス目標を満たすことができます。
前提条件
以下のサービスがアクティブ化されていること。
ACK クラスタが作成されていること。詳細については、「ACK 専用クラスタを作成する」および「ACK マネージドクラスタを作成する」をご参照ください。
ACK クラスタが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスを作成する」および「ASM インスタンスにクラスタを追加する」をご参照ください。
手順 1:サンプルアプリケーションの 2 つのバージョンをデプロイする
tcp-echo アプリケーションの 2 つのバージョンをデプロイします。
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[デプロイメント] ページの上部にある [名前空間] ドロップダウンリストから、tcp-echo アプリケーションの 2 つのバージョンをデプロイする名前空間を選択し、右上隅にある [YAML から作成] をクリックします。
カスタム[サンプルテンプレート] ドロップダウンリストから テンプレート作成 を選択し、次の YAML コードを コードエディターにコピーして、 をクリックします。
[デプロイメント] ページに戻ります。これで、tcp-echo アプリケーションの 2 つのバージョンが表示されます。
tcp-echo という名前のサービスを作成し、サービスを公開します。
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[サービス] ページの上部にある [名前空間] ドロップダウンリストから、サービスを作成する名前空間を選択し、右上隅にある [作成] をクリックします。
[サービスの作成] ダイアログボックスで、次のパラメータを設定し、[OK] をクリックします。
パラメータ
説明
[名前]
サービスの名前。この例では、名前は tcp-echo に設定されています。
[サービスの種類]
サービスを公開する方法を指定するサービスの種類。有効な値:[クラスタ IP]、[ノードポート]、[サーバーロードバランサー]。
説明[ヘッドレスサービス] チェックボックスは、[サービスの種類] パラメータを [クラスタ IP] に設定した場合にのみ表示されます。このチェックボックスをオンにすると、Kubernetes のサービスディスカバリの実装に縛られることなく、ヘッドレスサービスを使用して他のサービスディスカバリメカニズムと連携できます。
[バックエンド]
サービスに関連付けるデプロイメント。この例では、[名前] パラメータは app に設定され、[値] パラメータは tcp-echo-v1 に設定されています。
説明サービスは、関連付けられたデプロイメントの
appラベルをセレクタとして使用して、トラフィックをルーティングするデプロイメントを決定します。 tcp-echo-v1 デプロイメントと tcp-echo-v2 デプロイメントは、同じ app ラベル(app:tcp-echo)を共有します。したがって、サービスは 2 つのデプロイメントのいずれか一方に関連付けることができます。[外部トラフィックポリシー]
[ローカル] または [クラスタ] を選択できます。
説明[外部トラフィックポリシー] パラメータは、サービスの種類を [ノードポート] または [サーバーロードバランサー] に設定した場合にのみ表示されます。
[ポートマッピング]
この例では、[名前] パラメータは tcp に設定され、[サービスポート] と [コンテナポート] パラメータは 9000 に設定され、[プロトコル] パラメータは [TCP] に設定されています。
[アノテーション]
サービスにアノテーションを追加して、ロードバランシングを設定できます。たとえば、
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20アノテーションは、サービスの最大帯域幅を 20 Mbit/s に指定します。これは、サービスを通過するトラフィック量を制限します。このパラメータの詳細については、「アノテーションを使用して CLB インスタンスを設定する」をご参照ください。[ラベル]
サービスを識別するために、サービスに 1 つ以上のラベルを追加できます。
tcp-echo サービスが作成されると、[サービス] ページにサービスが表示されます。
手順 2:ルーティングルールを設定する
ASM インスタンスの Istio ゲートウェイ、仮想サービス、および宛先ルールを作成して、すべてのトラフィックを tcp-echo アプリケーションのバージョン v1 にルーティングできます。
ASM コンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
Istio ゲートウェイを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、既定[名前空間] ドロップダウンリストから テンプレート作成 を選択し、 ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、 をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tcp-echo-gateway spec: selector: istio: ingressgateway servers: - port: number: 31400 name: tcp protocol: TCP hosts: - "*"
仮想サービスを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、既定[名前空間] ドロップダウンリストから テンプレート作成 を選択し、 ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、 をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 // ポート 31400 に一致 route: - destination: host: tcp-echo port: number: 9000 subset: v1 // v1 サブセットにルーティング
宛先ルールを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、[名前空間] ドロップダウンリストから [default] を選択し、[テンプレート] ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、[作成] をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: tcp-echo-destination spec: host: tcp-echo subsets: - name: v1 // v1 サブセットを定義 labels: version: v1 - name: v2 // v2 サブセットを定義 labels: version: v2
手順 3:イングレスゲートウェイをデプロイする
イングレスゲートウェイにポート 31400 を追加し、ポートを Istio ゲートウェイのポート 31400 にマップします。
ASM コンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、[作成] をクリックします。作成ページで、パラメータを設定し、[作成] をクリックします。
次の表に、いくつかのパラメータについて説明します。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
パラメータ
説明
[クラスタ]
イングレスゲートウェイをデプロイするクラスタ。
[CLB インスタンスタイプ]
CLB インスタンスのアクセスタイプ。この例では、[インターネットアクセス] が選択されています。
CLB インスタンスを作成するか、既存の CLB インスタンスを使用する
[既存の CLB インスタンスを使用する]:ドロップダウンリストから既存の CLB インスタンスを選択します。
[CLB インスタンスを作成する]:[CLB インスタンスを作成] をクリックし、ドロップダウンリストから必要な CLB インスタンスの仕様を選択します。
説明Kubernetes サービスごとに CLB インスタンスを選択することをお勧めします。複数の Kubernetes サービスが同じ CLB インスタンスを共有する場合、次のリスクと制限があります。
別の Kubernetes サービスですでに使用されている CLB インスタンスを使用するように Kubernetes サービスを設定すると、CLB インスタンスの既存のリスナーが強制的に上書きされます。これは、元の Kubernetes サービスを中断する可能性があります。
Kubernetes サービスを作成するときに CLB インスタンスを作成する場合、CLB インスタンスを Kubernetes サービス間で共有することはできません。CLB コンソールで、または API オペレーションを呼び出すことによって作成した CLB インスタンスのみを共有できます。
同じ CLB インスタンスを共有する Kubernetes サービスは、異なるフロントエンドリスニングポートを使用する必要があります。そうしないと、ポートの競合が発生する可能性があります。
複数の Kubernetes サービスが同じ CLB インスタンスを共有する場合、リスナー名と vServer グループ名は Kubernetes で一意の識別子として使用されます。リスナーまたは vServer グループの名前を変更しないでください。
クラスタ間で CLB インスタンスを共有することはできません。
[ポートマッピング]
[ポートを追加] をクリックし、表示される行にプロトコルとサービスポートを指定できます。この例では、プロトコルは TCP に設定され、サービスポートは 31400 に設定されています。
手順 4:結果を確認する
kubectl クライアントを使用して、すべての TCP トラフィックが tcp-echo アプリケーションの v1 バージョンにルーティングされているかどうかを確認します。
kubectl クライアントを使用して ACK クラスタに接続します。詳細については、「手順 2:クラスタ認証情報の種類を選択する」をご参照ください。
次のコマンドを実行して、tcp-echo サービスの IP アドレスとポート番号をクエリします。
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')telnetコマンドを実行して、tcp-echo サービスに接続します。$ telnet $INGRESS_HOST $INGRESS_PORT Trying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]'文字列を入力して、Enter キーを押します。
返された文字列の先頭に「one」が付いている場合、tcp-echo アプリケーションはデプロイされており、すべてのサービストラフィックは tcp-echo アプリケーションの v1 バージョンにルーティングされています。
手順 5:トラフィックの一部を tcp-echo-v2 バージョンに移行する
この例では、トラフィックの 20% が tcp-echo-v2 バージョンにルーティングされ、残りの 80% が tcp-echo-v1 バージョンにルーティングされます。
ASM インスタンスの仮想サービスの構成を変更します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。
[virtualservice] ページで、tcp-echo サービスを見つけ、YAML[アクション] 列の をクリックします。
[編集] ダイアログボックスで、次の YAML コンテンツをコードエディターにコピーし、[OK] をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 route: - destination: host: tcp-echo port: number: 9000 subset: v1 // v1 サブセット weight: 80 // 重み 80 - destination: host: tcp-echo port: number: 9000 subset: v2 // v2 サブセット weight: 20 // 重み 20
次のコマンドを実行して、tcp-echo サービスに 10 個のリクエストを送信します。
$ for i in {1..10}; do \ docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $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% が tcp-echo-v2 バージョンにルーティングされていることを示しています。
説明テストで 10 個のリクエストを送信した場合、トラフィックが常に指定された比率で tcp-echo-v1 バージョンと tcp-echo-v2 バージョンにルーティングされるとは限りません。ただし、サンプルサイズが大きくなると、実際の比率は 80:20 に近づきます。