構成変更をすべてのノードに一度に適用すると、変更内容に誤りがある場合、クラスター全体が停止するリスクがあります。カナリアリリースは、このリスクを軽減するために、まず少数のノードに対して変更を配信します。その後、変更内容を確認してから、残りのすべてのノードへ段階的に展開します。
MSE Nacos では、以下の 2 種類のカナリアリリース戦略をサポートしています:
| 戦略 | 動作の仕組み | 推奨される利用シーン |
|---|---|---|
| IP アドレスベース | 特定のノード IP アドレスを対象とする | IP アドレスが固定された小規模な業務システム |
| タグベース | アプリケーションタグ(キーと値のペア)でノードを対象とする | Kubernetes など、IP アドレスが頻繁に変更される環境 |
前提条件
開始する前に、以下の条件を満たしていることをご確認ください。
Nacos Client 2.x 以降
IP アドレスベースのカナリアリリースによる構成のリリース
IP アドレスベースのカナリアリリースでは、指定した IP アドレスを持つノードのみが新しい構成を受信します。IP リストに含まれないノードは、現在の正式版構成を引き続き使用します。
この手法は小規模クラスターには有効ですが、以下の 2 つの制限があります。
Nacos Client 1.x では、SLB インスタンスを経由した接続において、サーバーがクライアントの IP アドレスを正確に取得できません。
Kubernetes 環境では、ノードが再構築されると Pod の IP アドレスが変更されるため、カナリアリリースが誤ったノードを対象としてしまう可能性があります。
動的な環境では、代わりにタグベースのカナリアリリースをご利用ください。
IP アドレスベースのカナリア構成の作成
MSE コンソールにログインし、上部のナビゲーションバーからリージョンを選択します。
左側のナビゲーションウィンドウで、マイクロサービスレジストリ > インスタンス を選択します。
インスタンス ページで、対象のインスタンス名をクリックします。
左側のナビゲーションウィンドウで、構成管理 > 構成 を選択します。
対象の構成を探し、[アクション] 列の [編集] をクリックします。
構成の編集 パネルで、リリースタイプ を IP アドレスベースのカナリアリリース に設定します。

アプリケーションノード IP 入力ボックスをクリックし、カナリアリリース対象の IP アドレスを選択します。手動で IP アドレスを入力することも可能です。入力欄では自動補完が有効です。
説明ここにリスト表示される IP アドレスは、本構成をサブスクライブするノードの IP アドレスです。複数の IP アドレスをカンマ(,)で区切って指定します。
構成内容を編集し、カナリアリリース をクリックします。
構成内容の比較 ダイアログボックスで、現在の正式版 および リリース対象の内容 を確認し、リリース をクリックします。
カナリア構成の確認
対象インスタンスの 構成 ページへ移動します(上記の手順 1~4 を実行)。
アクティブなカナリアリリースがある構成を見つけ、[操作] 列の [編集] をクリックします。
構成の編集 パネルで、ベータ(IP) タブをクリックして、カナリアリリースの詳細を確認します。

カナリアリリースの停止または本番リリースへの昇格
「Beta(IP)」タブの「設定の編集」パネルで:
カナリアリリースの停止: カナリアリリースの停止 をクリックします。カナリア構成は破棄され、すべてのノードが正式版構成を引き続き使用します。
本番リリースへの昇格: 本番リリース をクリックします。構成内容の比較 ダイアログボックスで構成内容を確認し、本番リリース をクリックします。カナリア構成が新しい正式版となり、カナリアリリースは終了します。
タグベースのカナリアリリースによる構成のリリース
タグベースのカナリアリリースでは、IP アドレスではなくアプリケーションタグでノードを対象とします。タグは Pod の再起動やノードの再構築後も維持されるため、Kubernetes やその他の動的環境において、より高い耐障害性を実現します。
タグベースのカナリアリリースを利用するには、MSE Nacos 2.2.3.3 以降が必要です。エンジンをバージョン 2.2.3.3 以降にアップグレードしてください。
カスタムアプリケーションタグを利用するには、オープンソース版 Nacos Client 2.3.2 以降が必要です。
環境変数によるタグ注入を利用するには、Nacos Client 2.4.2 以降が必要です。
ステップ 1:クライアントでのアプリケーションタグの設定
アプリケーションノードにキーと値のペア形式でタグを割り当てます。タグはプロパティ、JVM パラメーター、または環境変数のいずれかで設定できます。同一のキーが複数の場所で定義されている場合、優先順位は次のとおりです:プロパティ > JVM パラメーター > 環境変数。
nacos.config.gray.label は、カナリアリリース用の組み込みデフォルトタグキーです。
// オプション 1:プロパティで設定
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "<your-nacos-endpoint>");
properties.put("project.name", "<your-app-name>");
properties.put("nacos.config.gray.label", "<your-canary-tag>");
// オプション 2:JVM パラメーターとして設定
// -Dnacos.config.gray.label=<your-canary-tag>
// オプション 3:環境変数として設定
// nacos_config_gray_label=<your-canary-tag>
// 構成サービスを作成し、構成をサブスクライブ
NacosConfigService configService = new NacosConfigService(properties);
String dataId = "<your-data-id>";
String group = "<your-group>";
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("Received config: " + configInfo);
}
});以下のプレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<your-nacos-endpoint> | Nacos サーバーエンドポイント | mse-xxx.nacos.mse.aliyuncs.com:8848 |
<your-app-name> | アプリケーション名 | order-service |
<your-canary-tag> | カナリアリリースのタグ値 | canary-v2 |
<your-data-id> | Nacos 構成のデータ ID | com.example.app.properties |
<your-group> | Nacos 構成のグループ | DEFAULT_GROUP |
ステップ 2:サーバーでのリスナータグの確認
クライアントがタグ付きで接続した後、サーバーがそれらのタグを正しく認識しているかを確認します。対象構成のリスナー一覧を開きます。各リスナーには関連付けられたタグが表示されます。

ステップ 3:タグベースのカナリア構成のリリース
構成の編集 をクリックし、リリースタイプ を タグベースのカナリアリリース に設定します。
既存のキーと値のペアのタグを選択します。コンソールには、選択したタグに一致するノード数が表示されます。

構成内容を編集し、カナリアリリース をクリックします。
ステップ 4:リリースの確認と範囲の拡大
カナリアバージョンをリリースした後:
カナリアグループの確認: リスナー照会 タブで、各ノードがどの構成バージョンを受信したかを確認します。
カナリア詳細の表示: 構成詳細 タブで、現在のカナリアバージョンの内容を確認します。
リリース範囲の拡大: カナリアグループが正常であることを確認した後、タグ値を拡張してより多くのノードを含めます。対象となるすべてのノードがカバーされるまで繰り返します。
本番リリースへの昇格: 本番リリース をクリックして、カナリア構成を新しい正式版に昇格させます。カナリアバージョンは自動的に停止します。
必要に応じたロールバック: 問題が発生した場合は、カナリアリリースの停止 をクリックしてカナリア構成を破棄します。すべてのノードは正式版に戻ります。
並列カナリアバージョンの実行
単一の構成に対して、同時に複数のアクティブなバージョンを設定できます。
1 つの 正式版
1 つの IP アドレスベースのカナリアバージョン
最大 5 つの タグベースのカナリアバージョン(デフォルト)
バージョンのマッチング優先順位
ノードが構成をリクエストすると、MSE Nacos は以下の順序でバージョンを評価します。
IP アドレスベースのカナリアバージョン: ノードの IP アドレスがカナリア IP リストと一致する場合、このバージョンが返されます。
タグベースのカナリアバージョン: IP の一致がない場合、
priorityフィールド(数値が高いほど優先度が高い)に基づいてソートされたタグベースのカナリアバージョンがチェックされます。優先度が同じ場合は、名前順にソートされます。正式版: カナリアバージョンに一致するものが存在しない場合、正式版が返されます。
MSE コンソールの リスナー照会 ページで、各ノードにマッチした構成バージョンを確認できます。
並列カナリアバージョンを利用するには、MSE Nacos 2.3.0 以降が必要です。構成あたりのタグベースのカナリアバージョン数は、デフォルトで最大 5 つまでです。この上限を超えると、新たなカナリアリリースはブロックされます。
高度なタグ構成
複数のタグの設定
Nacos では、nacos.app.conn.labels パラメーターを使用して、アプリケーションに複数のキーと値のペアのタグを注入できます。フォーマットは "k1=v1,k2=v2,k3=v3" です。
// オプション 1:プロパティで設定
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "<your-nacos-endpoint>");
properties.put("project.name", "<your-app-name>");
properties.put("nacos.app.conn.labels", "app=order-service,site=hangzhou-c,env=staging");
// オプション 2:JVM パラメーターとして設定
// -Dnacos.app.conn.labels="app=order-service,site=hangzhou-c,env=staging"
// オプション 3:環境変数として設定
// nacos_app_conn_labels="app=order-service,site=hangzhou-c,env=staging"
NacosConfigService configService = new NacosConfigService(properties);
String dataId = "<your-data-id>";
String group = "<your-group>";
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("Received config: " + configInfo);
}
});カスタムタグコレクターの実装(SPI)
動的または複雑なタグロジックを実現するには、com.alibaba.nacos.common.labels.LabelsCollector SPI インターフェイスを実装し、サービスとして登録します。
package com.example.labels;
import com.alibaba.nacos.common.labels.LabelsCollector;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class CustomLabelsCollector implements LabelsCollector {
@Override
public String getName() {
return "custom-labels";
}
@Override
public Map<String, String> collectLabels(Properties properties) {
Map<String, String> labels = new HashMap<>();
// タグを決定するカスタムロジックを追加
labels.put("env", System.getenv("DEPLOY_ENV"));
labels.put("region", System.getenv("DEPLOY_REGION"));
return labels;
}
@Override
public int getOrder() {
return 1;
}
}この実装を利用するには、サービスとして公開します。
タグのフォーマット要件
タグのキーおよび値には、大文字・小文字、数字、アンダースコア(_)、ハイフン(-)、ピリオド(.)が使用可能です。それ以外のフォーマットのタグは無視されます。
nacos.app.conn.labels を使用して複数のキーと値のペアを指定する場合、"k1=v1,k2=v2,k3=v3" のフォーマットを使用します。値が指定されていないエントリは無視されます。たとえば、"k1=v1,k2" という指定では、k1=v1 のみが解析されます。
タグ計画のベストプラクティス
ビジネスへの影響範囲に基づいてアプリケーションタグを計画し、段階的な展開を可能にしてリスクを最小限に抑えます。
アプリケーション名によるタグ付け: まず非重要アプリケーションに対してリリースします。問題がないことを確認した後、コアアプリケーションへ展開を拡大します。
トラフィックグループによるタグ付け: 内部ユーザー向けに、トラフィックの入り口でカナリアマシンのグループを分離します。これらのマシンに専用のカナリアタグを割り当てることで、本番ユーザーに公開する前に内部トラフィックで変更内容を検証できます。