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

Microservices Engine:MSE を使用したマイクロサービスアプリケーションのグレースフルスタートとグレースフルシャットダウンの実現

最終更新日:Jun 21, 2026

デプロイ中のトラフィック損失を回避するため、多くの高並行性アプリケーションはオフピーク時にのみデプロイを実行します。このアプローチは問題の発生を減らすのに役立ちますが、予測不可能な要因により依然として高い運用コストが発生します。MSE は、アプリケーションの起動とシャットダウンのプロセスを深く最適化します。シャットダウン時には、MSE は適応的な待機と積極的な通知メカニズムを使用し、サービスがオフラインになる前にすべての保留中のリクエストが完了することを保証し、突然のサービス中断を防ぎます。起動時には、MSE は readiness プローブを使用してマイクロサービスのライフサイクル管理を各デプロイフェーズと正確に連携させ、新しいサービスバージョンの安定した立ち上げを保証します。

前提条件

デモアーキテクチャの概要

アプリケーションアーキテクチャが Zuul ゲートウェイとバックエンドのマイクロサービスアプリケーションインスタンス (Spring Cloud) で構成されていると仮定します。バックエンドの呼び出しチェーンには、ショッピングカートアプリケーション A、トランザクションセンターアプリケーション B、在庫センターアプリケーション C が含まれます。これらのアプリケーションは、サービス登録とディスカバリに Nacos を使用します。

spring-cloud-zuul アプリケーションでは、次の図に示すように、spring-cloud-a のカナリアリリースバージョンと通常バージョンの両方を、毎秒 100 クエリ (QPS) で同時に呼び出します。应用部署流量架构图

アプリケーションのデプロイとマイクロサービスガバナンスの有効化

重要

このデモには CronHPA タスクが含まれているため、まずクラスターに ack-kubernetes-cronhpa-controller コンポーネントをインストールする必要があります。詳細については、「手順1:CronHPAコンポーネントのインストール」をご参照ください。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイ] を選択します。

  3. 展開 ページで、YAML のリソースの作成 をクリックします。

  4. [Sample Template][Custom] を選択します。次の YAML を [Template] フィールドに貼り付け、デプロイ をクリックします。

    このデモファイルの名前は mse-demo.yaml です。これには、Zuul ゲートウェイと 3 つのアプリケーション (A、B、C) がデプロイされます。アプリケーション A と B には、それぞれベースラインバージョンとカナリアリリースバージョンがあります。アプリケーション B のベースラインバージョンではグレースフルシャットダウンが無効になっており、カナリアバージョンではグレースフルシャットダウンが有効になっています。アプリケーション C では、ウォームアップ時間が 120 秒に設定されたサービスのウォームアップが有効になっています。

    クリックして YAML ファイルを展開

    # Nacos サーバー
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nacos-server
      name: nacos-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nacos-server
      template:
        metadata:
          labels:
            app: nacos-server
            msePilotCreateAppName: nacos-server
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: MODE
              value: standalone
            image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
            imagePullPolicy: Always
            name: nacos-server
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
          dnsPolicy: ClusterFirst
          restartPolicy: Always
    # Nacos サーバーのサービス設定
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    # Zuul ゲートウェイアプリケーション
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-zuul
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-zuul
      template:
        metadata:
          labels:
            app: spring-cloud-zuul
            msePilotCreateAppName: spring-cloud-zuul
            msePilotAutoEnable: "on"
        spec:
          containers:
            - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                - name: LANG
                  value: C.UTF-8
              image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.1
              imagePullPolicy: Always
              name: spring-cloud-zuul
              ports:
                - containerPort: 20000
    # アプリケーション A のベースラインバージョン (マシンディメンションによるフルリンクパススルーが有効)
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-a
      name: spring-cloud-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata: 
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-a
            ports:
            - containerPort: 20001
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    # アプリケーション A のカナリアバージョン (マシンディメンションによるフルリンクパススルーが有効)
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-a-gray
      name: spring-cloud-a-gray
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a-gray
      strategy:
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-a-gray
            ports:
            - containerPort: 20001
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    # アプリケーション B のベースラインバージョン (グレースフルシャットダウンが無効)
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-b
      name: spring-cloud-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b
      strategy:
      template:
        metadata:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: micro.service.shutdown.server.enable
              value: "false"
            - name: profiler.micro.service.http.server.enable
              value: "false"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-b
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    # アプリケーション B のカナリアバージョン (デフォルトでグレースフルシャットダウンが有効)
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-b-gray
      name: spring-cloud-b-gray
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-b-gray
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-b-gray
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    # アプリケーション C のベースラインバージョン
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-c
      name: spring-cloud-c
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-c
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 10
              periodSeconds: 30
    # HPA 設定
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-b
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-b
       jobs:
       - name: "scale-down"
         schedule: "0 0/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 0/5 * * * *"
         targetSize: 2
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-b-gray
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-b-gray
       jobs:
       - name: "scale-down"
         schedule: "0 0/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 0/5 * * * *"
         targetSize: 2
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-c
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-c
       jobs:
       - name: "scale-down"
         schedule: "0 2/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 2/5 * * * *"
         targetSize: 2
    # Zuul ゲートウェイをクラスター内サービスとして公開
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zuul-slb
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 20000
      selector:
        app: spring-cloud-zuul
      type: ClusterIP
    # Kubernetes サービスとしてアプリケーション A を公開
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: spring-cloud-a-base
    spec:
      ports:
        - name: http
          port: 20001
          protocol: TCP
          targetPort: 20001
      selector:
        app: spring-cloud-a
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: spring-cloud-a-gray
    spec:
      ports:
        - name: http
          port: 20001
          protocol: TCP
          targetPort: 20001
      selector:
        app: spring-cloud-a-gray
    # Nacos サーバーの SLB サービス設定
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-slb
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: LoadBalancer
  5. デプロイしたアプリケーションでマイクロサービスガバナンスを有効にします。詳細については、「ACK および ACS マイクロサービスアプリケーション (Java) の MSE ガバナンスを有効にする」をご参照ください。

可観測性データの表示

spring-cloud-b と spring-cloud-b-gray の両方で CronHPA が有効になっており、5 分ごとの定期的なスケーリングをシミュレートします。アプリケーション名をクリックし、[Scaling] タブをクリックして詳細を表示します。

  • spring-cloud-b アプリケーション:

    [CronHPA] ページでは、spring-cloud-b に 2 つの定期スケーリングタスクがあり、両方とも正常に実行されています (ステータス:Succeed)。タスク [scale-down] はスケジュール 0 0/5 * * * * で実行され、目標レプリカ数は 1 です。タスク [scale-up] はスケジュール 10 0/5 * * * * で実行され、目標レプリカ数は 2 です。

  • spring-cloud-b-gray アプリケーション:

    CronHPA ページには、2 つの定期タスク、[scale-down] (スケジュール 0 0/5 * * * *、目標レプリカ数 1) と [scale-up] (スケジュール 10 0/5 * * * *、目標レプリカ数 2) が表示され、両方ともステータスは Succeed です。

  1. MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側メニューで、Microservices Governance > Application Governance を選択し、spring-cloud-a アプリケーションカードをクリックします。

  3. Application Overview ページに、このアプリケーションの可観測性データが表示されます。

    データは以下を示しています:

    • spring-cloud-a-gray バージョンでは、Pod のスケーリング中にリクエストエラーはゼロで、トラフィック損失はありませんでした。

    • グレースフルシャットダウンが無効な spring-cloud-b のベースラインバージョンでは、Pod スケーリング中にリクエストが 20 件失敗し、トラフィック損失が発生しました。

グレースフルスタートの有効化

spring-cloud-c アプリケーションは、CronHPA を使用して起動動作をシミュレートし、5 分ごとにスケーリングします。具体的には、2 分目の 0 秒に 1 つのノードにスケールダウンし、2 分目の 10 秒に 2 つのノードにスケールアップします。[CronHPA] ページでは、spring-cloud-c の CronHPA に 2 つのタスクがあります:scale-down (スケジュール 0 2/5 * * * *、目標レプリカ数 1、ステータス Succeed) と scale-up (スケジュール 10 2/5 * * * *、目標レプリカ数 2、ステータス Succeed) です。

  1. MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側メニューで、Microservices Governance > Application Governance を選択し、spring-cloud-c アプリケーションカードをクリックします。

  3. 左側メニューで Traffic management を選択し、Graceful Start/Shutdown タブを選択します。Graceful Start をオンにします。Prompt message ダイアログボックスで、OK をクリックします。ウォームアップ時間はデフォルトで 120 秒です。

    ウォームアップを有効にすると、再起動されたアプリケーションへのトラフィックは時間とともに徐々に増加します。アプリケーションが起動時に接続プールやキャッシュを事前に構築する必要があるようなスロースタートシナリオでは、サービスのウォームアップを有効にすることで、リソースの秩序ある初期化と、トラフィック損失のない安全な起動が保証されます。