すべてのプロダクト
Search
ドキュメントセンター

Enterprise Distributed Application Service:Kubernetes クラスターで toolkit-maven-plugin を使用してカナリアリリースを実行する

最終更新日:Mar 11, 2026

toolkit-maven-plugin は、Enterprise Distributed Application Service (EDAS) にデプロイされた Spring Cloud、Dubbo、および High-speed Service Framework (HSF) アプリケーションのカナリアリリースを自動化します。カナリアリリースでは、すべてのインスタンスを一度に更新するのではなく、まずインスタンスの小さなサブセットに変更をロールアウトし、その後、残りのインスタンスにバッチで段階的に更新を適用します。

カナリアリリースの仕組み

toolkit-maven-plugin を使用したカナリアリリースは、2 つのフェーズのプロセスに従います。

  1. カナリアフェーズ: 新しいバージョンを、指定された数のインスタンス (gray) にデプロイします。これらのインスタンスはライブトラフィックを受信するため、完全なロールアウトの前に新しいバージョンを検証できます。

  2. バッチロールアウトフェーズ: 新しいバージョンを、制御されたバッチ (batch) で残りのインスタンスにロールアウトします。各バッチ間には設定可能な間隔 (batchWaitTime) があります。バッチは自動で実行することも、手動での承認を必要とすることもできます。

このプロセスの EDAS 更新ストラテジータイプは GrayBatchUpdate です。

前提条件

開始する前に、以下が準備できていることを確認してください。

  • EDAS Kubernetes クラスターにデプロイされた Spring Cloud、Dubbo、または HSF アプリケーション

  • Resource Access Management (RAM) ユーザーの AccessKey ID と AccessKey Secret (ルートアカウントの認証情報よりも推奨)

  • アプリケーション ID (appId)、または対象アプリケーションの microservices namespace ID (namespaceId) とアプリケーション名 (appName) の両方

カナリアリリースの設定

カナリアリリースを設定するには、プラグインの依存関係を追加し、設定ファイルを作成し、デプロイメントコマンドを実行します。

ステップ 1: プラグインの依存関係の追加

次の依存関係を pom.xml に追加します。

<build>
    <plugins>
        <plugin>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>toolkit-maven-plugin</artifactId>
            <version>1.1.9</version>
        </plugin>
    </plugins>
</build>
説明

常に最新バージョンの toolkit-maven-plugin を使用してください。

ステップ 2: 設定ファイルの作成

パッケージ化されたプロジェクトのルートディレクトリに 3 つの YAML ファイルを作成します。Maven サブモジュールをデプロイする場合は、代わりにサブモジュールディレクトリにパッケージ設定ファイルを作成します。

アカウント設定 (toolkit_profile.yaml)

regionId:        # アプリケーションがデプロイされているリージョン (例: cn-hangzhou)
accessKeyId:     # RAM ユーザーの AccessKey ID
accessKeySecret: # RAM ユーザーの AccessKey Secret
jarPath:         # (任意) デプロイメントパッケージへのパス。指定した場合、Maven のパッケージングはスキップされます。

パッケージ設定 (toolkit_package.yaml)

apiVersion: V1
kind: AppPackage
spec:
  packageType:   # War、FatJar、Image、または url
  packageUrl:    # (任意) リモートデプロイメントパッケージの URL。packageType が url の場合に使用されます。
  imageUrl:      # (任意) イメージ URL。packageType が Image の場合に使用されます。

デプロイメント設定 (toolkit_deploy.yaml)

apiVersion: V1
kind: AppDeployment
spec:
  type: kubernetes
  target:
    appId:        # アプリケーション ID。指定した場合、namespaceId と appName は不要です。
    namespaceId:  # microservices namespace ID。appId が指定されていない場合に必須です。
    appName:      # アプリケーション名。appId が指定されていない場合に必須です。
  updateStrategy:
    type: GrayBatchUpdate
    grayUpdate:
      gray: 2              # カナリアフェーズで更新するインスタンス数
    batchUpdate:
      batch: 3             # 残りのインスタンスのバッチ数
      releaseType: auto     # auto または manual
      batchWaitTime: 5      # バッチ間の待機時間 (分)

次の表に、カナリアリリースのパラメーターを示します。

パラメーター説明
appIdEDAS アプリケーション ID6bbc57a2-a2a0-4edb-****-************
namespaceIdmicroservices namespace IDcn-hangzhou:my-namespace
grayカナリアインスタンスの数2
batchロールアウトバッチの数3
releaseTypeauto (自動) または manual (承認が必要)auto
batchWaitTimeバッチ間隔(分)5

ステップ 3: デプロイメントコマンドの実行

pom.xml (またはサブモジュールの pom.xml) を含むディレクトリに移動し、次を実行します。

mvn clean package toolkit:deploy \
  -Dtoolkit_profile=toolkit_profile.yaml \
  -Dtoolkit_package=toolkit_package.yaml \
  -Dtoolkit_deploy=toolkit_deploy.yaml

デプロイメントが成功すると、出力に BUILD SUCCESS と表示されます。

コマンドパラメーター:

パラメーター説明
toolkit:deployMaven のパッケージング完了後にアプリケーションをデプロイします。
-Dtoolkit_profileアカウント設定ファイルへのパス。
-Dtoolkit_packageパッケージ設定ファイルへのパス。
-Dtoolkit_deployデプロイメント設定ファイルへのパス。
-Ddeploy_version(任意) デプロイメントバージョン。toolkit_deploy.yaml 内のバージョンを上書きします。toolkit-maven-plugin 1.0.6 以降が必要です。
説明

-Dtoolkit_profile-Dtoolkit_package、および -Dtoolkit_deploy パラメーターを省略するには、設定ファイルを pom.xml と同じディレクトリに配置し、各ファイル名の先頭にドットを付けます (.toolkit_profile.yaml.toolkit_package.yaml.toolkit_deploy.yaml)。プラグインはこれらを自動的に検出します。

デプロイメントシナリオ

ローカルの WAR または FatJar パッケージを使用したデプロイ

WAR または FatJar パッケージをローカルでビルドし、既存の EDAS アプリケーションにデプロイします。

toolkit_package.yaml:

apiVersion: V1
kind: AppPackage
spec:
  packageType: War    # または FatJar

toolkit_deploy.yaml:

apiVersion: V1
kind: AppDeployment
spec:
  type: kubernetes
  target:
    appId:        # アプリケーション ID
    namespaceId:  # (任意) namespace ID。appId が指定されていない場合に必須
    appName:      # (任意) アプリケーション名。appId が指定されていない場合に必須

既存のイメージ URL を使用したデプロイ

レジストリに既に存在するコンテナイメージを使用してアプリケーションをデプロイします。

toolkit_package.yaml:

apiVersion: V1
kind: AppPackage
spec:
  packageType: Image
  imageUrl: registry.cn-beijing.aliyuncs.com/test/gateway:latest

toolkit_deploy.yaml:

apiVersion: V1
kind: AppDeployment
spec:
  type: kubernetes
  target:
    appId:        # アプリケーション ID
    namespaceId:  # (任意) namespace ID。appId が指定されていない場合に必須
    appName:      # (任意) アプリケーション名。appId が指定されていない場合に必須

ローカル Docker イメージのビルドとプッシュ

Docker イメージをローカルでビルドし、Alibaba Cloud コンテナイメージリポジトリにプッシュしてデプロイします。

toolkit_package.yaml:

apiVersion: V1
kind: AppPackage
spec:
  packageType: Image
  build:
    docker:
      dockerfile: Dockerfile
      imageRepoAddress:   # イメージリポジトリのアドレス
      imageTag:           # イメージタグ
      imageRepoUser:      # リポジトリのユーザー名
      imageRepoPassword:  # リポジトリのパスワード

toolkit_deploy.yaml:

apiVersion: V1
kind: AppDeployment
spec:
  type: kubernetes
  target:
    appId:        # アプリケーション ID
    namespaceId:  # (任意) namespace ID。appId が指定されていない場合に必須
    appName:      # (任意) アプリケーション名。appId が指定されていない場合に必須

設定リファレンス

パッケージパラメーター

apiVersion: V1
kind: AppPackage
spec:
  packageType:         # War、FatJar、Image、または url
  imageUrl:            # イメージ URL。イメージを使用してデプロイする場合に必須。
  packageUrl:          # パッケージ URL。packageType が url の場合に使用されます。
  build:
    docker:
      dockerfile:        # Dockerfile のパス。ローカルイメージのビルドに必須。
      imageRepoAddress:  # Alibaba Cloud イメージリポジトリのアドレス
      imageTag:          # イメージタグ
      imageRepoUser:     # リポジトリのユーザー名
      imageRepoPassword: # リポジトリのパスワード
    oss:
      bucket:            # Object Storage Service (OSS) のバケット名
      key:               # OSS オブジェクトパス
      accessKeyId:       # OSS アクセス用の AccessKey ID
      accessKeySecret:   # OSS アクセス用の AccessKey Secret

デプロイメントパラメーター

クリックして、デプロイメント設定ファイルでサポートされているパラメーターを展開します。

デプロイメントファイルは、次のパラメーターをサポートしています。特に明記されていない限り、すべてのパラメーターは任意です。

apiVersion: V1
kind: AppDeployment
spec:
  type: kubernetes
  target:
    appName:       # アプリケーション名
    namespaceId:   # microservices namespace ID
    appId:         # アプリケーション ID。指定した場合、namespaceId と appName は不要です。
    version:       # デプロイメントバージョン。デフォルトのフォーマット: 日-時-分-秒。
    jdk:           # JDK バージョン (Open JDK 7 または Open JDK 8)。イメージデプロイメントには適用されません。
    webContainer:  # Tomcat バージョン (apache-tomcat-7.0.91)。イメージデプロイメントには適用されません。
    batchWaitTime: # バッチ間の間隔 (分)
    command:       # コンテナ起動コマンド。デフォルトのイメージコマンドを上書きします。
    commandArgs:   # 起動コマンドの引数
    - 1d
  envs:            # コンテナ環境変数
    - name: ENV_NAME
      value: 'value'

ヘルスチェック

liveness プローブと readiness プローブを設定して、コンテナとアプリケーションのヘルス状態をモニターします。各プローブに対して exectcpSocket、または httpGet のいずれかを指定します。

liveness チェックに失敗したコンテナは再起動されます。readiness チェックに複数回失敗したコンテナは停止してから再起動され、Server Load Balancer (SLB) インスタンスからのトラフィックを受信しなくなります。

  liveness:
    exec:
      command:
        - cat
        - /tmp/healthy
    tcpSocket:
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      port: "8080"
    httpGet:
      path: "/health"
      port: "8080"
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      scheme: "HTTP"       # HTTP または HTTPS
      httpHeaders:
        - name: "Custom-Header"
          value: "value"
    initialDelaySeconds: 5   # 最初のチェックまでの秒数
    timeoutSeconds: 11       # チェックがタイムアウトするまでの秒数
    periodSeconds: 5         # チェック間の秒数
    successThreshold: 1      # liveness プローブでは 1 である必要があります
    failureThreshold: 3      # アクションが実行されるまでの連続失敗回数

  readiness:
    exec:
      command:
        - cat
        - /tmp/healthy
    tcpSocket:
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      port: "8080"
    httpGet:
      path: "/health"
      port: "8080"
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      scheme: "HTTP"
      httpHeaders:
        - name: "Custom-Header"
          value: "value"
    initialDelaySeconds: 5
    timeoutSeconds: 11
    periodSeconds: 5
    successThreshold: 2
    failureThreshold: 3

ライフサイクルフック

  preStop:          # コンテナが終了する前に実行
    exec:
      command:
        - /bin/bash
        - -c
        - "sleep 30"
    httpGet:
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      path: "/shutdown"
      port: "8080"
      scheme: "HTTP"         # HTTP または HTTPS
      httpHeaders:
        - name: "Custom-Header"
          value: "value"

  postStart:        # コンテナが開始した後に実行
    exec:
      command:
        - /bin/bash
        - -c
        - "echo started"
    httpGet:
      host: "192.168.1.109"  # (任意) デフォルトは Pod の IP アドレス
      path: "/initialize"
      port: "8080"
      scheme: "HTTP"         # HTTP または HTTPS
      httpHeaders:
        - name: "Custom-Header"
          value: "value"

設定のマウント

ConfigMap または Secret リソースをコンテナにマウントします。

  configMountDescs:
    - type: "ConfigMap"           # ConfigMap または Secret
      name: "my-config"
      mountPath: "/home/admin"    # マウントディレクトリ
      mountItems:                 # 個別のファイルとしてマウント
        - key: "config-key"
          path: "config-file"
      useSubPath: true            # true: 既存のファイルを保持、false: 上書き

Java 起動パラメーター

  javaStartUpConfig:
    initialHeapSize:             # -Xms (初期ヒープサイズ、MB)
      original: 1000
      startup: "-Xms1000m"
    maxHeapSize:                 # -Xmx (最大ヒープサイズ、MB)
      original: 1000
      startup: "-Xmx1000m"
    newSize:                     # -XX:NewSize (若い世代の初期サイズ、MB)
      original: 200
      startup: "-XX:NewSize=200m"
    maxNewSize:                  # -XX:MaxNewSize (若い世代の最大サイズ、MB)
      original: 200
      startup: "-XX:MaxNewSize=200m"
    survivorRatio:               # -XX:SurvivorRatio (Eden 領域と Survivor 領域の比率)
      original: 2
      startup: "-XX:SurvivorRatio=2"
    newRatio:                    # -XX:NewRatio (古い世代と若い世代の比率)
      original: 8
      startup: "-XX:NewRatio=8"
    permSize:                    # -XX:PermSize (Permanent 世代、MB)
      original: 512
      startup: "-XX:PermSize=512m"
    maxPermSize:                 # -XX:MaxPermSize (Permanent 世代の最大サイズ、MB)
      original: 512
      startup: "-XX:MaxPermSize=200m"
    maxDirectMemorySize:         # -XX:MaxDirectMemorySize (MB)
      original: 100
      startup: "-XX:MaxDirectMemorySize=100m"
    threadStackSize:             # -XX:ThreadStackSize
      original: 500
      startup: "-XX:ThreadStackSize=500"
    hsfserverPort:               # HSF サーバーポート
      original: 12200
      startup: "-Dhsf.server.port=12200"
    hsfserverMinPoolSize:        # HSF 最小スレッドプールサイズ
      original: 50
      startup: "-Dhsf.server.min.poolsize=50"
    hsfserverMaxPoolSize:        # HSF 最大スレッドプールサイズ
      original: 720
      startup: "-Dhsf.server.max.poolsize=720"
    youngGarbageCollector:       # 若い世代の GC ポリシー
      original: "UseSerialGC"   # UseSerialGC、UseG1GC、UseParNewGC、または UseParallelGC
      startup: "-XX:+UseSerialGC"
    oldGarbageCollector:         # 古い世代の GC ポリシー
      original: "UseConcMarkSweepGC"   # UseConcMarkSweepGC、UseSerialGC、UseG1GC、UseParNewGC、UseParallelOldGC、または UseParallelGC
      startup: "-XX:+UseConcMarkSweepGC"
    concGCThreads:               # コンカレント GC スレッド数
      original: 5
      startup: "-XX:ConcGCThreads=5"
    parallelGCThreads:           # パラレル GC スレッド数
      original: 5
      startup: "-XX:ParallelGCThreads=5"
    g1HeapRegionSize:            # G1 リージョンサイズ (MB)
      original: 50
      startup: "-XX:G1HeapRegionSize=50m"
    gclogFilePath:               # GC ログディレクトリ
      original: "/tmp/"
      startup: "-Xloggc:/tmp/"
    useGCLogFileRotation:        # GC ログローテーションの有効化
      original: true
      startup: "-XX:+UseGCLogFileRotation"
    numberOfGCLogFiles:          # GC ログファイル数
      original: 5
      startup: "-XX:NumberOfGCLogFiles=5"
    gclogFileSize:               # GC ログファイルサイズ (MB)
      original: 100
      startup: "-XX:GCLogFileSize=100m"
    heapDumpOnOutOfMemoryError:  # メモリ不足 (OOM) 時のヒープダンプの有効化
      original: true
      startup: "-XX:+HeapDumpOnOutOfMemoryError"
    heapDumpPath:                # OOM ダンプファイルのパス
      original: "/tmp/dumpfile"
      startup: "-XX:HeapDumpPath=/tmp/dumpfile"
    customParams:                # カスタム JVM パラメーター
      original: "-Dtest=true"
      startup: "-Dtest=true"

スケジューリングルール

  deployAcrossZones: "true"    # Pod をアベイラビリティゾーンにまたがってデプロイ (推奨)
  deployAcrossNodes: "true"    # Pod をノードにまたがってデプロイ (推奨)

  customTolerations:           # Kubernetes スケジューリングの Toleration
    - key: my-key
      operator: Exists         # Exists または Equal
      effect: NoSchedule       # NoSchedule または NoExecute
    - key: another-key
      operator: Equal
      value: "my-value"
      effect: "NoExecute"
      tolerationSeconds: 300

  customAffinity:
    nodeAffinity:              # ノードラベルに基づいて Pod をスケジューリング
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: "topology.kubernetes.io/zone"
                operator: "In"
                values:
                  - "cn-hangzhou-a"
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
              - key: "topology.kubernetes.io/zone"
                operator: "In"
                values:
                  - "cn-hangzhou-b"
    podAffinity:               # 一致する Pod と同じ場所に Pod を配置
      requiredDuringSchedulingIgnoredDuringExecution:
        - namespaces:
            - "default"
          topologyKey: "topology.kubernetes.io/zone"
          labelSelector:
            matchExpressions:
              - key: "app"
                operator: "In"
                values:
                  - "my-app"
    podAntiAffinity:           # 一致する Pod から離れた場所に Pod を分散
      requiredDuringSchedulingIgnoredDuringExecution:
        - namespaces:
            - "default"
          topologyKey: "kubernetes.io/hostname"
          labelSelector:
            matchExpressions:
              - key: "app"
                operator: "In"
                values:
                  - "my-app"
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 2
          podAffinityTerm:
            namespaces:
              - "default"
            topologyKey: "kubernetes.io/hostname"
            labelSelector:
              matchExpressions:
                - key: "app"
                  operator: "In"
                  values:
                    - "my-app"