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

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

最終更新日:Jan 08, 2025

アプリケーションが同時に多数のリクエストを処理する必要がある場合、ほとんどの場合、アプリケーションの新しいバージョンはオフピーク時にリリースされます。これにより、リリース中のトラフィック損失は防止されますが、予期しない状況により O&M コストが増加します。これらの問題に対処するために、マイクロサービスエンジン(MSE)は、アプリケーションバージョンのリリース中にアプリケーションのグレースフルスタートとシャットダウンをサポートするテクノロジーを提供します。アプリケーションのグレースフルシャットダウンのために、MSE は適応待機とプロアクティブな通知を提供します。これにより、すべてのリクエストが処理された後にのみアプリケーションがシャットダウンされ、予期しないサービスのダウンタイムが防止されます。アプリケーションのグレースフルスタートのために、MSE は準備プローブを使用し、ライフサイクル管理とマイクロサービスアプリケーションのリリースの段階を正確に調整します。これにより、新しいバージョンのアプリケーションが安定して実行されます。

前提条件

デモアーキテクチャ

この例では、アプリケーションアーキテクチャは、Zuul ゲートウェイとバックエンド Spring Cloud アプリケーションで構成されています。バックエンドサービスコールには、ショッピングカート(アプリケーション A)、トランザクションセンター(アプリケーション B)、在庫センター(アプリケーション C)の 3 つのアプリケーションが関係します。アプリケーションのサービス登録と検出のために MSE Nacos インスタンスが提供されます。

デモアプリケーションをデプロイし、アプリケーションに対して Microservices Governance を有効にする

重要

このデモでは、Cron Horizontal Pod Autoscaler(CronHPA)が使用されます。したがって、デモアプリケーションをデプロイする前に、クラスターに ack-kubernetes-cronhpa-controller コンポーネントをインストールする必要があります。詳細については、「CronHPA を使用したスケジュールされた水平スケーリング」の「手順 1:CronHPA コンポーネントをインストールする」セクションをご参照ください。

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

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

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

  4. [サンプルテンプレート] ドロップダウンリストから [カスタム] を選択し、[テンプレート] に次の YAML コードを入力して、デプロイ をクリックします。

    この例のデモファイルの名前は mse-demo.yaml です。この例では、Zuul ゲートウェイとアプリケーション 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-server サービスの構成。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    
    # spring-cloud-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
    
    
    # spring-cloud-zuul アプリケーション用にサーバーロードバランサー(SLB)インスタンスを作成します。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zuul-slb
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 20000
      selector:
        app: spring-cloud-zuul
      type: ClusterIP
    
    # アプリケーション A を使用して Kubernetes サービスを公開します。
    ---
    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. アプリケーションに対して Microservices Governance を有効にします。詳細については、「ACK または ACS クラスターの Java マイクロサービスアプリケーションに対して Microservices Governance を有効にする」をご参照ください。

可視性データを表示する

spring-cloud-b と spring-cloud-b-gray の両方で CronHPA が有効になっており、5 分間隔でスケジュールされたスケーリングをシミュレートします。アプリケーション名をクリックし、[pod スケーリング] タブをクリックすると、関連情報が表示されます。

  • spring-cloud-b

    image

  • spring-cloud-b-gray

    image

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

  2. 左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。表示されたページで、spring-cloud-a アプリケーションのリソースカードをクリックします。

  3. Application overview ページで、アプリケーションの関連する可視性データを表示します。

    データから次の情報が得られます。

    • Pod のスケーリング中に、spring-cloud-a-gray バージョンでリクエストエラーは返されません。この場合、トラフィック損失は発生しません。

    • spring-cloud-a バージョンでは、グレースフルシャットダウン機能が無効になっています。Pod のスケーリング中に spring-cloud-a から spring-cloud-b に送信された 20 個のリクエストに対してエラーが返されます。この場合、トラフィック損失が発生します。

グレースフルスタートを有効にする

spring-cloud-c に対して CronHPA を有効にして、アプリケーションの起動をシミュレートします。5 分間隔でスケーリングを実行します。60 秒目に 1 つのノードを使用可能にし、70 秒目に 2 つのノードを使用可能にします。image

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

  2. 左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。表示されたページで、spring-cloud-c アプリケーションのリソースカードをクリックします。

  3. 左側のナビゲーションペインで、Traffic management をクリックします。Graceful Start/Shutdown タブで、Graceful Start をオンにします。表示される Prompt message で、[OK] をクリックします。デフォルトのプリフェッチ期間は 120 秒です。

    サービスプリフェッチ機能が有効になっているアプリケーションが再起動した後、トラフィックは時間とともに徐々に増加します。接続プールやキャッシュなどのリソースを事前に提供する必要がある、アプリケーションの起動が遅いシナリオでは、アプリケーションに対してサービスプリフェッチ機能を有効にすることができます。このようにして、キャッシュリソースが順番に作成され、アプリケーションが安全な方法で起動され、トラフィック損失は発生しません。