Build full link grayscale capability based on Ingress
背景
クラウドネイティブ技術の普及に伴い、ますます多くのビジネスアプリケーションがクラウドネイティブアーキテクチャへ移行しています。コンテナ管理プラットフォームである Kubernetes のイミュータブルインフラストラクチャ、弾力スケーリング、高いスケーラビリティを活用することで、ビジネスのデジタルトランスフォーメーションを迅速に推進できます。その中でも、クラスターの入口トラフィック管理方式は、クラウドネイティブ技術の進化に伴い徐々に汎用化・標準化されています。ユーザーは Kubernetes で定義された Ingress リソースを通じて、クラスター内部サービスへの外部アクセスを管理します。
マイクロサービスアーキテクチャでは、マイクロサービス呼び出しチェーン上の複数のマイクロサービスを同時に変更する必要のある要件があります。通常、各マイクロサービスにはカナリアトラフィックを受け付けるためのカナリア環境またはグループが用意されています。上流のカナリア環境に入ったトラフィックが下流のカナリア環境にも確実に流入し、リクエストが常にカナリア環境内で伝送されることを望みます。呼び出しチェーン上にカナリア環境を持たないマイクロサービスがあっても、下流へのリクエスト時にカナリア環境に戻れる必要があります。MSE が提供するフルリンクカナリア機能を使えば、ビジネスコードを一切変更せずにこれらの機能を簡単に実現できます。
Kubernetes ゲートウェイの概要
Kubernetes クラスターは、NodePort、LoadBalancer、Ingress の 3 つの方法でトラフィックを外部に公開します。
NodePort は、ポートとバックエンド Pod のシンプルな 1 対 1 の対応を実現しますが、単一障害点の問題とポート範囲の制限があります。バックエンドサービスが増加すると、利用可能なポートが不足します。LoadBalancer は、NodePort の単一障害点とポート数の問題を解決しますが、純粋なトラフィック転送リソースであり、ルーティング構成機能を持たず、多数のバックエンドサービスアプリケーションを管理することもできません。そのため、Ingress の登場は必然的な結果でした。Ingress は、ルーティングリソースを定義する機能を持つだけでなく、多数のバックエンドサービスの管理役割も担います。ただし、よく知られた Ingress リソースはあくまでルーティングリソースの定義に過ぎず、実際の実装者・実行主体は Nginx Ingress Controller などの具体的な Ingress 標準実装である点に注意が必要です。
Alibaba Cloud ACK プラットフォームでは、Nginx Ingress、ALB イングレス、そして最近リリースされた MSE Ingress など、複数の Ingress 実装方式があります。本記事では、MSE マイクロサービスガバナンスに基づく汎用的な統一ソリューションで、Ingress ゲートウェイ上でフルリンクカナリアトラフィックを実現する方法を説明します。
Ingress でのフルリンクカナリアトラフィックの実現方法
まず、フルリンクカナリアの実現に必要な要素を理解する必要があります。その後、これらの要素を Ingress 環境に実装することで、Ingress ゲートウェイ配下でのフルリンクカナリアトラフィックを実現できます。これまでの経験から、主に 3 つの要素に依存します。ラベルルーティング、ノードマーキング、トラフィックカラーリングです。
ラベルルーティングは、タグ名とタグ値に基づいてサービス配下の全ノードをグループ化し、サービスノードの情報をサブスクライブしたサービス利用者が、必要に応じて特定のノードグループ、つまり全ノードのサブセットにアクセスできるようにします。サービス利用者は、サービスプロバイダーノード上の任意のラベル情報を使用でき、選択したラベルの実際の意味に基づいて、より多くのビジネスシナリオにラベルルーティングを適用できます。
ノードマーキングについて説明します。Kubernetes Service をサービス検出の業務システムとして使用する場合、サービスプロバイダーはサービスリソースを ApiServer に送信してサービスの公開を完了します。サービス利用者は、サービスリソースに関連付けられた Endpoint リソースをリッスンし、Endpoint リソースから関連するビジネス Pod リソースを取得し、その Labels データを読み取ってノードのメタデータ情報として使用します。したがって、業務アプリケーションのリソースを記述する Deployment の Pod テンプレート内のノードにラベルを追加するだけで済みます。
トラフィックカラーリングとは、リクエストの発生源でトラフィックにタグを付与することを意味します。フロントエンドがリクエストを発行する際に、ユーザー情報やプラットフォーム情報に基づいてトラフィックをマークします。フロントエンドで対応できない場合は、マイクロサービスゲートウェイで特定ルーティングルールに一致するリクエストにトラフィック識別子を動的に追加することもできます。また、トラフィックがチェーン上のカナリアノードを通過する際、リクエスト情報にカナリア識別子が含まれていない場合は自動的にカラーリングを行い、後続のフローでカナリアバージョンのサービスに優先的にアクセスできるようにします。
上記のフルリンクカナリアの 3 要素を実現するため、MSE マイクロサービスガバナンスではスイムレーンとスイムレーングループの概念を提唱しています。たとえば、Nginx Ingress とバックエンドのマイクロサービスアーキテクチャ (Spring Cloud) で構成されるアプリケーションアーキテクチャを想定します。バックエンドの呼び出しチェーンは 3 ホップで、トランザクションセンター、商品センター、在庫センターです。クライアントはクライアントアプリまたは H5 ページを通じてバックエンドサービスにアクセスし、Nacos レジストリを通じてサービス検出を行います。
1) トラフィックルールを設定して必要なトラフィックにタグを付与すると、そのトラフィックはカナリアマシンにルーティングされます。
2) カナリアトラフィックはカナリア識別子を携行して下流に伝播し、カナリア専用環境のスイムレーンを形成します。カナリア環境を持たないアプリケーションは、デフォルトで未マークのベースライン環境にルーティングされます。
MSE コンソールのスイムレーン定義インターフェイスでは、フルリンクカナリア実装の 3 要素に対応していることが確認できます。
Ingress フルリンクカナリアのクイック体験
ACK Nginx Ingress を例に、MSE マイクロサービスガバナンスを使用して Ingress のフルリンクカナリアトラフィックを実現する方法を手早く体験できます。全体の手順は以下の通りです。
主に、ACK Ingress Controller を MSE マイクロサービスガバナンスに接続する方法を説明します。Nginx Ingress Controller の ConfigMap に以下の 2 つの構成項目を追加するだけです。
- use-mse: true
- mse-app-name: ingress-canary-test
mse-app-name はユーザー定義の名前です。この時点で、MSE コンソール上で指定したアプリケーション名の Alibaba Cloud Ingress ゲートウェイを確認できます。
以降の手順は Java アプリケーションのフルリンクカナリア手順と同じです。詳しくは以下の記事をご参照ください。
https://help.aliyun.com/document_detail/460275.html
スイムレーンルールを設定すると、対応する特徴を持つトラフィックが対応するスイムレーンに流入します。MSE コンソールでカナリアリリースの状況を確認し、フルリンクカナリア機能が有効かどうかを検証できます。
MSE Ingress は MSE チームが独自に開発した Ingress 実装です。MSE クラウドネイティブゲートウェイをベースに Nginx を置き換えてトラフィックをホスティングしており (Ingress と Istio の両方と互換)、より強力なパフォーマンスを発揮するだけでなく、自然なトラフィックガバナンスと制御の特性を備えています。フルリンクカナリアの使用方法は ACK Nginx Ingress と基本的に同じです。具体的な手順は以下の記事をご参照ください。
クラウドネイティブ技術の普及に伴い、ますます多くのビジネスアプリケーションがクラウドネイティブアーキテクチャへ移行しています。コンテナ管理プラットフォームである Kubernetes のイミュータブルインフラストラクチャ、弾力スケーリング、高いスケーラビリティを活用することで、ビジネスのデジタルトランスフォーメーションを迅速に推進できます。その中でも、クラスターの入口トラフィック管理方式は、クラウドネイティブ技術の進化に伴い徐々に汎用化・標準化されています。ユーザーは Kubernetes で定義された Ingress リソースを通じて、クラスター内部サービスへの外部アクセスを管理します。
マイクロサービスアーキテクチャでは、マイクロサービス呼び出しチェーン上の複数のマイクロサービスを同時に変更する必要のある要件があります。通常、各マイクロサービスにはカナリアトラフィックを受け付けるためのカナリア環境またはグループが用意されています。上流のカナリア環境に入ったトラフィックが下流のカナリア環境にも確実に流入し、リクエストが常にカナリア環境内で伝送されることを望みます。呼び出しチェーン上にカナリア環境を持たないマイクロサービスがあっても、下流へのリクエスト時にカナリア環境に戻れる必要があります。MSE が提供するフルリンクカナリア機能を使えば、ビジネスコードを一切変更せずにこれらの機能を簡単に実現できます。
Kubernetes ゲートウェイの概要
Kubernetes クラスターは、NodePort、LoadBalancer、Ingress の 3 つの方法でトラフィックを外部に公開します。
NodePort は、ポートとバックエンド Pod のシンプルな 1 対 1 の対応を実現しますが、単一障害点の問題とポート範囲の制限があります。バックエンドサービスが増加すると、利用可能なポートが不足します。LoadBalancer は、NodePort の単一障害点とポート数の問題を解決しますが、純粋なトラフィック転送リソースであり、ルーティング構成機能を持たず、多数のバックエンドサービスアプリケーションを管理することもできません。そのため、Ingress の登場は必然的な結果でした。Ingress は、ルーティングリソースを定義する機能を持つだけでなく、多数のバックエンドサービスの管理役割も担います。ただし、よく知られた Ingress リソースはあくまでルーティングリソースの定義に過ぎず、実際の実装者・実行主体は Nginx Ingress Controller などの具体的な Ingress 標準実装である点に注意が必要です。
Alibaba Cloud ACK プラットフォームでは、Nginx Ingress、ALB イングレス、そして最近リリースされた MSE Ingress など、複数の Ingress 実装方式があります。本記事では、MSE マイクロサービスガバナンスに基づく汎用的な統一ソリューションで、Ingress ゲートウェイ上でフルリンクカナリアトラフィックを実現する方法を説明します。
Ingress でのフルリンクカナリアトラフィックの実現方法
まず、フルリンクカナリアの実現に必要な要素を理解する必要があります。その後、これらの要素を Ingress 環境に実装することで、Ingress ゲートウェイ配下でのフルリンクカナリアトラフィックを実現できます。これまでの経験から、主に 3 つの要素に依存します。ラベルルーティング、ノードマーキング、トラフィックカラーリングです。
ラベルルーティングは、タグ名とタグ値に基づいてサービス配下の全ノードをグループ化し、サービスノードの情報をサブスクライブしたサービス利用者が、必要に応じて特定のノードグループ、つまり全ノードのサブセットにアクセスできるようにします。サービス利用者は、サービスプロバイダーノード上の任意のラベル情報を使用でき、選択したラベルの実際の意味に基づいて、より多くのビジネスシナリオにラベルルーティングを適用できます。
ノードマーキングについて説明します。Kubernetes Service をサービス検出の業務システムとして使用する場合、サービスプロバイダーはサービスリソースを ApiServer に送信してサービスの公開を完了します。サービス利用者は、サービスリソースに関連付けられた Endpoint リソースをリッスンし、Endpoint リソースから関連するビジネス Pod リソースを取得し、その Labels データを読み取ってノードのメタデータ情報として使用します。したがって、業務アプリケーションのリソースを記述する Deployment の Pod テンプレート内のノードにラベルを追加するだけで済みます。
トラフィックカラーリングとは、リクエストの発生源でトラフィックにタグを付与することを意味します。フロントエンドがリクエストを発行する際に、ユーザー情報やプラットフォーム情報に基づいてトラフィックをマークします。フロントエンドで対応できない場合は、マイクロサービスゲートウェイで特定ルーティングルールに一致するリクエストにトラフィック識別子を動的に追加することもできます。また、トラフィックがチェーン上のカナリアノードを通過する際、リクエスト情報にカナリア識別子が含まれていない場合は自動的にカラーリングを行い、後続のフローでカナリアバージョンのサービスに優先的にアクセスできるようにします。
上記のフルリンクカナリアの 3 要素を実現するため、MSE マイクロサービスガバナンスではスイムレーンとスイムレーングループの概念を提唱しています。たとえば、Nginx Ingress とバックエンドのマイクロサービスアーキテクチャ (Spring Cloud) で構成されるアプリケーションアーキテクチャを想定します。バックエンドの呼び出しチェーンは 3 ホップで、トランザクションセンター、商品センター、在庫センターです。クライアントはクライアントアプリまたは H5 ページを通じてバックエンドサービスにアクセスし、Nacos レジストリを通じてサービス検出を行います。
1) トラフィックルールを設定して必要なトラフィックにタグを付与すると、そのトラフィックはカナリアマシンにルーティングされます。
2) カナリアトラフィックはカナリア識別子を携行して下流に伝播し、カナリア専用環境のスイムレーンを形成します。カナリア環境を持たないアプリケーションは、デフォルトで未マークのベースライン環境にルーティングされます。
MSE コンソールのスイムレーン定義インターフェイスでは、フルリンクカナリア実装の 3 要素に対応していることが確認できます。
Ingress フルリンクカナリアのクイック体験
ACK Nginx Ingress を例に、MSE マイクロサービスガバナンスを使用して Ingress のフルリンクカナリアトラフィックを実現する方法を手早く体験できます。全体の手順は以下の通りです。
主に、ACK Ingress Controller を MSE マイクロサービスガバナンスに接続する方法を説明します。Nginx Ingress Controller の ConfigMap に以下の 2 つの構成項目を追加するだけです。
- use-mse: true
- mse-app-name: ingress-canary-test
mse-app-name はユーザー定義の名前です。この時点で、MSE コンソール上で指定したアプリケーション名の Alibaba Cloud Ingress ゲートウェイを確認できます。
以降の手順は Java アプリケーションのフルリンクカナリア手順と同じです。詳しくは以下の記事をご参照ください。
https://help.aliyun.com/document_detail/460275.html
スイムレーンルールを設定すると、対応する特徴を持つトラフィックが対応するスイムレーンに流入します。MSE コンソールでカナリアリリースの状況を確認し、フルリンクカナリア機能が有効かどうかを検証できます。
MSE Ingress は MSE チームが独自に開発した Ingress 実装です。MSE クラウドネイティブゲートウェイをベースに Nginx を置き換えてトラフィックをホスティングしており (Ingress と Istio の両方と互換)、より強力なパフォーマンスを発揮するだけでなく、自然なトラフィックガバナンスと制御の特性を備えています。フルリンクカナリアの使用方法は ACK Nginx Ingress と基本的に同じです。具体的な手順は以下の記事をご参照ください。
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
