Microservices Engine (MSE) のトラフィックガバナンスを Jenkins CI/CD パイプラインと統合し、マイクロサービスアプリケーションのカナリアリリースを自動化します。このワークフローは、ビルド、デプロイメント、検証、昇格 (またはロールバック) を単一のパイプラインにまとめることで、リリースの速度を維持しながらデプロイメントのリスクを低減します。
仕組み
Jenkins パイプラインは、リリースライフサイクル全体を自動化します。
ビルド -- ソースコードをパッケージ化し、コンテナイメージをビルドします。
カナリアのデプロイ -- 安定したベースバージョンと並行して新しいバージョンをデプロイします。
カナリアトラフィックのルーティング -- MSE は、定義したヘッダー、Cookie、またはリクエストパラメーターに基づいて、トラフィックのサブセットをカナリアにルーティングします。
検証 -- カナリアが期待どおりに動作することを確認します。
昇格またはロールバック -- 検証に合格した場合、カナリアを本番環境に完全に昇格させるか、ベースバージョンにロールバックします。
次の図は、アーキテクチャを示しています。
MSE は、3 つのカナリアルーティング戦略をサポートしています。
| 戦略 | 説明 |
|---|---|
| パーセンテージベース | トラフィックの固定パーセンテージをカナリアにルーティングします。 |
| ルールベース | 特定のヘッダー、Cookie、またはリクエストパラメーターに一致するトラフィックをルーティングします。 |
| タグベース | カナリアトラフィックを x-mse-tag: gray のような組み込みヘッダーでマークし、呼び出しチェーン全体を通してルーティングします。 |
このチュートリアルでは、x-mse-tag: gray ヘッダーを使用したタグベースルーティングを使用します。
前提条件
開始する前に、以下が完了していることを確認してください。
ACK クラスターへの Jenkins のデプロイ およびコンテナレジストリへのイメージのプッシュ権限を付与済み
次のセクションで説明するデモアプリケーションのデプロイ、または独自のマイクロサービスアプリケーションの準備
デモアプリケーションのデプロイ
このチュートリアルでは、ACK クラスターにデプロイされた 5 つのアプリケーションを使用します。
| アプリケーション | 役割 | コンテナポート |
|---|---|---|
| spring-cloud-zuul | イングレスゲートウェイ | 20000 |
| spring-cloud-a | アプリケーション A | 20001 |
| spring-cloud-b | アプリケーション B | 8080 |
| spring-cloud-c | アプリケーション C | 20003 |
| nacos-server | サービスレジストリ (スタンドアロンモード) | -- |
呼び出しチェーンは、spring-cloud-zuul -> spring-cloud-a -> spring-cloud-b -> spring-cloud-c です。
spring-cloud-zuul ゲートウェイは、100 QPS の通常トラフィックと、追加で 10 QPS のカナリアトラフィックを処理します。x-mse-tag: gray ヘッダーを持つリクエストは、gray タグが付いたダウンストリームノードに自動的にルーティングされます。要件に合わせて、gray を任意のカスタムタグ値に置き換えることができます。
ステップ 1:Deployment の作成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスター名を見つけてクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [Deployments] を選択します。
[YAML から作成] をクリックし、以下の YAML ファイルを適用します。
spring-cloud-zuul (イングレスゲートウェイ)
spring-cloud-a (ベースバージョン)
spring-cloud-b (ベースバージョン)
spring-cloud-c (ベースバージョン)
nacos-server (サービスレジストリ) と SLB サービス
ステップ 2:デプロイメントの検証
すべてのアプリケーションをデプロイした後、MSE コンソールを開き、アプリケーション A のトラフィックを確認します。すべてのトラフィックは [タグなし] ノードに流れ、カナリアノードにはトラフィックがないはずです。
カナリアルーティング用のレーンの作成
レーンは、MSE がマイクロサービスの呼び出しチェーンを通じてカナリアトラフィックをどのようにルーティングするかを定義します。まずレーングループを設定し、次にルーティングルールを持つレーンを作成します。
ステップ 1:レーングループの作成
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [フルトレースグレースケール] を選択します。
[レーングループとレーンの作成] をクリックします。マイクロサービス名前空間にレーングループが既に存在する場合は、[+ レーングループの作成] をクリックします。
レーングループを設定します。
パラメーター 値 レーングループ名 レーングループの分かりやすい名前。 Ingress タイプ [Java マイクロサービスゲートウェイ] を選択します。 レーングループ トラフィックエントリ イングレスアプリケーション (spring-cloud-zuul) を選択します。 レーングループアプリケーション 呼び出しチェーン内のすべてのアプリケーションを選択します。 [OK] をクリックします。
作成後、[フルトレースグレースケール] ページの [レーングループに関連するアプリケーション] セクションにイングレスアプリケーションと関連アプリケーションが表示されることを確認します。レーングループを変更するには、
をクリックします。
ステップ 2:レーンの作成
[フルトレースグレースケール] ページで、レーングループと同じマイクロサービス名前空間を選択します。
[クリックして最初の分割レーンを作成] をクリックします。レーンが既に存在する場合は、[レーンの作成] をクリックします。
重要アプリケーションにエンドツーエンドのカナリアリリースを設定すると、これらのアプリケーションはカナリアリリースやタグベースルーティングなどの機能をサポートしなくなります。
レーンパラメーターを設定します:ルーティング条件は、以下のパラメータータイプをサポートしています。
重要どのカナリアルーティング条件にも一致しないトラフィックは、ベースバージョンのタグなしノードにルーティングされます。
パラメーター 説明 [ノードタグの追加] カナリアノードを識別するためのタグ (例: gray) を追加します。[レーン情報の入力] [レーンタグ] を設定し、[一致関係の確認] を使用してタグ付けされたノード数を確認します。 [ルーティングとカナリアリリースのルールの設定] ルーティング条件を定義します (次の表を参照)。 パラメータータイプ 説明 パラメーター リクエストパラメーター ヘッダー リクエストヘッダー Cookie HTTP Cookie 本文コンテンツ JSON 形式のリクエストボディ [OK] をクリックします。
設定後、ゲートウェイは次のようにトラフィックをルーティングします。
カナリアのルールに一致しないトラフィックは、ベースバージョンに送られます。

カナリアのルールに一致するトラフィックは、カナリアバージョンに送られます。

Jenkins パイプラインの設定
ステップ 1:イメージレジストリの認証情報の設定
Jenkins がご利用の Container Registry にイメージをプッシュできるように、Kubernetes Secret を作成します。レジストリの認証情報を含む config.json ファイルを生成した後、以下を実行します。
kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json詳細については、「Jenkins を設定してアプリケーション配信パイプラインを構築する」をご参照ください。
ステップ 2:パイプラインの作成
Jenkins ダッシュボードの左側のナビゲーションウィンドウで [新規アイテム] をクリックします。
パイプライン名を入力し、タイプとして [パイプライン] を選択し、[OK] をクリックします。
設定ページで [パイプライン] タブをクリックし、以下を設定します。
[定義]:[SCM からのパイプラインスクリプト] を選択します。
[SCM]:[Git] を選択します。
[リポジトリ URL]:Git リポジトリの URL を入力します。このチュートリアルでは
https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demoを使用します。> 注: ご利用の Jenkins インスタンスが GitHub にアクセスできない場合は、代わりに Gitee のミラーを使用してください。[スクリプトパス]:
Jenkinsfileと入力します。
[保存] をクリックします。
Jenkinsfile は 4 つのパイプラインステージを定義します。
パイプラインステージ:
| ステージ | 内容 | コンテナ |
|---|---|---|
| コードのパッケージング | Maven (mvn clean package) でアプリケーションをビルドします。 | maven |
| イメージのビルドとリリース | Kaniko でコンテナイメージをビルドし、プッシュします。 | kaniko |
| カナリアデプロイメント | gray デプロイメントの YAML を新しいイメージタグで更新し、適用します。 | kubectl |
| カナリアデプロイメントの完了 | 手動入力を待ちます。昇格するには true、ロールバックするには false を入力します。 | kubectl |
パイプラインパラメーター:
| パラメーター | デフォルト | 説明 |
|---|---|---|
image_region | cn-shanghai | Container Registry のリージョン。 |
image_namespace | yizhan | Container Registry の名前空間。 |
image_reponame | spring-cloud-a | イメージリポジトリ名。 |
image_tag | gray | カナリアビルドのイメージタグ。 |
branch | master | ビルド元の Git ブランチ。 |
number_of_pods | 2 | Pod レプリカの数。 |
パイプラインの実行と検証
ステップ 1:パイプラインのビルド
Jenkins ダッシュボードで、パイプライン名の横にある
をクリックします。[ビルド] をクリックします。
説明最初のビルドでは、Git リポジトリから設定をプルし、パイプラインを初期化します。エラーが発生した場合は、[パラメーター付きでビルド] をクリックし、パラメーターを設定して再ビルドしてください。
[コード パッケージング]、[イメージのビルドとリリース]、および [カナリア デプロイメント] ステージが完了するまで待ちます。 パイプラインは [カナリア デプロイメントの完了] ステージで一時停止し、確認待ちの状態になります。
ステップ 2:カナリアデプロイメントの検証
ACK コンソールにログインします。クラスターに移動し、[ワークロード] > [Deployments] を選択します。
spring-cloud-a-grayDeployment が存在し、spring-cloud-a:grayイメージを使用していることを確認します。[ネットワーク] > [サービス] に移動して名前空間を選択し、[zuul-slb] サービスの [パブリックエンドポイント] をクリックします。
トラフィックルーティングをテストします:通常トラフィック (カナリアヘッダーなし) -- ベースバージョンにルーティングされます:期待される出力:カナリアトラフィック (カナリアタグ付き) -- カナリアノードにルーティングされます:期待される出力:
curl http://<zuul-slb-public-endpoint>/A/aA[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%curl http://<zuul-slb-public-endpoint>/A/a?name=xiaomingAgray[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%MSE コンソールで、アプリケーション詳細ページを開き、カナリアトラフィックがカナリアノードにルーティングされていることを確認します。
フルリリースへの昇格
検証が合格した後、カナリアを本番環境に昇格させます。
ロールバック
検証が失敗した場合、ベースバージョンにロールバックします。