Microservices Engine (MSE) はカナリアリリースをサポートしています。これにより、全体へのロールアウトの前に、インスタンスの小規模なサブセットに設定変更をデプロイして検証できます。この手法により、不備のある設定をプッシュするリスクを最小限に抑えることができます。このトピックでは、MSE の Nacos インスタンスでカナリアリリースを設定する方法について説明します。
前提条件
-
Nacos クライアントのバージョン 2.x 以降の使用を推奨します。
背景情報
クラスターの設定を一元管理する場合、設定を変更すると通常、古い設定が上書きされ、更新がクラスター内のすべてのインスタンスにプッシュされます。この全体プッシュ方式は、1 つの設定エラーがクラスター全体の障害を引き起こす可能性があるため、リスクが伴います。
そのため、設定を編集する際には、まずカナリアリリースを実行することを推奨します。これにより、新しい設定が一部のマシンにプッシュされ、初期検証が行われます。変更が検証された場合、すべてのインスタンスをカバーするまでリリースを段階的に拡大でき、設定変更に伴うリスクを低減できます。
設定の変更中、カナリアリリース用に特定のノードを選択します。MSE Nacos は、カナリアリリース用に 2 つの方法をサポートしています:IP アドレスベースのカナリアリリースとタグベースのカナリアリリースです。
IP アドレスベースのカナリアリリース
小規模なシステムでは、この方法で十分な場合が多く、設定エラーによるデプロイ失敗のリスクを大幅に低減できます。
カナリア設定の作成
[MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、マイクロサービスの登録 > インスタンス を選択します。
インスタンス ページで、インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで設定管理> 設定を選択します。
-
対象の設定のActions 列で、Edit をクリックします。Edit Configuration パネルで、Release Type を IP-based Canary Release に設定します。
-
Application Node IP Address 入力ボックスをクリックし、リストからカナリアリリース用の IP アドレスを選択します。
IP アドレスを手動で入力することもできます。オートコンプリート機能も利用できます。
説明IP アドレスは、設定をサブスクライブするマシンを指定します。複数のアドレスを区切るには、コンマ (,) を使用します。
-
設定を変更した後、Canary Release をクリックします。Comparison of Configuration Content ダイアログボックスで、Current Official Version Content と Current Release Content を確認し、その後 Release をクリックします。
カナリア設定の表示
[MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、マイクロサービスの登録 > インスタンス を選択します。
インスタンス ページで、インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで設定管理> 設定を選択します。
-
カナリアリリース中の設定を見つけ、Actions 列で Edit をクリックします。
-
Edit Configuration パネルで、[ベータ (IP)] タブをクリックして、カナリアリリース情報を表示します。
[Beta(IP)] タブには、カナリアリリースの詳細が表示されます。リリースタイプは IP アドレスベースのカナリアリリース、アプリケーションノード IP は
172.16、設定形式は [Properties]、設定内容はuseLocalCache=falseです。ページの下部には、[Canary Release]、[Stop Canary Release]、および [Full Release] ボタンがあります。
その他の操作
-
カナリアリリースの停止: Edit Configuration パネルの [Beta(IP)] タブで、Stop Canary Release をクリックしてカナリアリリースをキャンセルします。
-
全量リリース: Edit Configuration パネルの ベータ版 (IP) タブで、Full Release をクリックします。表示される Comparison of Configuration Content ダイアログボックスで、設定情報を確認し、Full Release をクリックします。カナリア設定が新しい正式バージョンになり、カナリアリリースが終了します。
IP アドレスベースのカナリアリリースには、以下の問題があります:
-
Nacos 1.x を使用するクライアントの場合、トラフィックが Server Load Balancer (SLB) インスタンスを経由するため、サーバーはクライアントの IP アドレスを正確に取得できません。
-
Kubernetes ベースのアーキテクチャでは、ノードを再構築すると IP アドレスが変更される可能性があり、IP アドレスベースのカナリアバージョンが無効になります。
タグベースのカナリアリリース
MSE Nacos 2.2.3.3 以降は、タグベースのカナリアリリースをサポートしています。クライアントアプリケーションノードにタグを設定し、これらのタグを対象としてカナリアリリースを実行できます。
-
タグベースのカナリアリリースは、MSE Nacos 2.2.3.3 以降でサポートされています。エンジンをバージョン 2.2.3.3 以降にアップグレードする必要があります。
-
カナリアリリース用のカスタムアプリケーションタグは、オープンソースの Nacos クライアント 2.3.2 以降でサポートされています。クライアントをバージョン 2.3.2 以降にアップグレードする必要があります。
-
環境変数を使用してタグを注入するには、Nacos クライアントをバージョン 2.4.2 以降にアップグレードする必要があります。
クライアントアプリケーションタグの設定
キーと値の形式であるアプリケーションタグは、プロパティ、JVM パラメーター、または環境変数を使用して設定できます。キーが複数の場所で指定されている場合、優先度はプロパティ > JVM パラメーター > 環境変数となります。nacos.config.gray.label は、Nacos における設定のカナリアリリースのためのデフォルトの組み込みタグです。
//1. プロパティを使用して渡します。
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
properties.put("project.name", "your app name");
properties.put("nacos.config.gray.label","yourgrayname");
//2. JVM パラメーターを使用して設定します。
// 起動パラメーター -Dnacos.config.gray.label=yourgrayname を設定します
//3. 環境変数を使用して指定します。
// 環境変数 nacos_config_gray_label=yourgrayname を設定します
String dataId = "gray_test_dataid";
String group = "test-group";
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("設定を受信:" + configInfo);
}
});
タグベースのカナリアリリースの発行
-
リスナータグの表示
クライアントでアプリケーションタグを設定した後、サーバーで設定リスナーのリストを表示して、各リスナーのタグを確認できます。
[Listening Query] タブをクリックします。リスナーのアプリケーションノードタグが
nacos.config.gray.label:yourgraynameであり、プッシュステータスが [Push succeeded] であることが確認できます。 -
タグベースのカナリア設定の発行
Edit Configuration をクリックし、Tag-based Canary Release を選択して、アプリケーションノード上の既存のタグのキーと値のペアを選択します。 選択したタグに一致するノードの数を確認できます。 [設定の編集] ページで、[Data ID] (たとえば
nacos-config-example-demo) と [Group] (たとえばyang-group) を入力します。 [リリースタイプ] を [タグベースのカナリアリリース] に設定し、[アプリケーションノードタグキー] にnacos.config.gray.labelを選択し、[アプリケーションノードタグ値] にカナリアタグ (たとえばyourgrayname) を追加して、[設定形式] で [Properties] を選択します。 次に、[カナリアリリース] をクリックします。
タグベースのカナリアバージョンを公開した後、Configuration Listening Query タブで現在のクライアントに一致する設定バージョンを表示できます。Configuration details で現在のカナリアバージョンの詳細を確認できます。
最初のカナリアグループを観察した後、全体リリースの準備が整うまで、タグの値を編集することでリリースの範囲を拡大できます。[Full Release] をクリックすると、対応するカナリアバージョンが停止します。カナリアリリースがビジネス上の例外を引き起こした場合は、[Stop Canary Release] をクリックして変更をロールバックします。
関連情報
アプリケーションタグの高度な使用法
nacos.config.gray.label のような単一のタグを設定することに加えて、Nacos は複数のタグを設定し、カスタムタグの Collector Service Provider Interface (SPI) を使用できます。これにより、タグの定義と取得において、より高い柔軟性が得られます。
-
複数値タグの設定
Nacos は、複数のキーと値のペアをアプリケーションタグとして設定することをサポートしています。プロパティで、または JVM パラメーターとして
nacos.app.conn.labelsパラメーター (例:nacos.app.conn.labels="k1=v1,k2=v2,k3=v3") を指定できます。あるいは、環境変数として [nacos_app_conn_labels] パラメーターを指定することもできます。//1. プロパティを使用して渡します。 Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint"); properties.put("project.name", "your app name"); properties.put("nacos.app.conn.labels","app=demo,site=hangzhou-c,otherkey=othervaue"); //2. JVM パラメーターを使用して設定します。 // 起動パラメーター -Dnacos.app.conn.labels="app=demo,site=hangzhou-c,otherkey=othervaue" を設定します //3. 環境変数を使用して指定します。 // 環境変数 nacos_app_conn_labels="app=demo,site=hangzhou-c,otherkey=othervaue" を設定します NacosConfigService configService = new NacosConfigService(properties); String dataId = "gray_test_dataid"; String group = "test-group"; configService.addListener(dataId, group, new Listener() { @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { System.out.println("設定を受信:" + configInfo); } }); -
カスタムアプリケーションタグSPI
Nacos クライアントは、カスタムアプリケーションタグのための SPI を定義しています。
com.alibaba.nacos.common.labels.LabelsCollectorインターフェースを実装し、その実装クラスをサービスとして公開することで、カスタムアプリケーションタグ SPI を作成できます。package your.demo.test; import com.alibaba.nacos.common.labels.LabelsCollector; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * TestLabelsCollector。 * * @author 田中一郎 */ public class TestLabelsCollector implements LabelsCollector { @Override public String getName() { return "testlables"; } @Override public Map<String, String> collectLabels(Properties properties) { Map<String, String> labels = new HashMap<>(); labels.put("test", "ここにラベルロジックを実装します"); return labels; } @Override public int getOrder() { return 1; } }
並列カナリアバージョン
単一の設定は、正式バージョン、IP アドレスベースのカナリアバージョン、および複数のタグベースのカナリアバージョンを含む複数のバージョンを持つことができます。複数のバージョンが存在する場合、Nacos サーバーは次の優先順位で設定を照合し、プッシュします:IP アドレスベースのカナリアバージョン > タグベースのカナリアバージョン > 正式バージョン。
複数のタグベースのカナリアバージョンが存在する場合、それらは priority フィールドの値によってソートされます。値が大きいほど優先度が高くなります。優先度が等しい場合、バージョンは名前でソートされます。各カナリアバージョンには明確な優先度を設定することを推奨します。
サーバーがタグ付けされたアプリケーションノードからリクエストを受信すると、まず一致する IP アドレスベースのカナリアバージョンを確認します。一致が見つかった場合、そのバージョンが返されます。それ以外の場合、サーバーは優先度に従ってタグベースのカナリアバージョンを照合しようとします。タグベースのバージョンが一致した場合、その設定が返されます。どのカナリアバージョンも一致しない場合、サーバーは正式バージョンを返します。[Listening Query] ページで、各アプリケーションノードにどの設定バージョンが一致しているかを確認できます。
MSE Nacos 2.3.0 以降は、並列カナリアバージョンをサポートしています。単一の設定に対するカナリアバージョンの数には制限があります。デフォルトでは、最大 5 つのタグベースのカナリアバージョンを持つことができます。それ以上作成しようとするとブロックされます。
アプリケーションタグの計画
アプリケーションノードのタグを計画する際は、ビジネスへの影響に基づいて定義し、段階的にロールアウトすることで変更リスクを低減します。以下は、一般的なベストプラクティスです:
-
アプリケーション名をタグとして使用します。重要度の低いアプリケーションからカナリアリリースを開始します。問題がないことを確認した後、リリースを拡大してコアアプリケーションを含めます。
-
トラフィックイングレス層で、上流および下流のマシンのトラフィックを分離できます。たとえば、内部ユーザーテスト用の一群のマシンを特定し、それらに一意のカナリアタグを割り当てることができます。これにより、内部ユーザーを対象としたカナリアリリースを作成できます。
アプリケーションタグの形式
タグのキーと値には、大文字と小文字のアルファベット、数字、アンダースコア (_)、ハイフン (-)、ピリオド (.) のみを含めることができます。他の形式のタグは無視されます。nacos.app.conn.labels パラメーターを使用して複数のキーと値のペアを指定する場合は、 "k1=v1,k2=v2,k3=v3" の形式に従う必要があります。たとえば、"k1=v1,k2" のような不正な形式の値を渡した場合、k2 の部分は無視され、入力は k1=v1 として解析されます。