アプリケーションが同時に多数のリクエストを処理する必要がある場合、ほとんどの場合、アプリケーションの新しいバージョンはオフピーク時にリリースされます。これにより、リリース中のトラフィック損失は防止されますが、予期しない状況により 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 コンポーネントをインストールする」セクションをご参照ください。
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のペインで、 を選択します。
展開 ページで、YAML のリソースの作成 をクリックします。
[サンプルテンプレート] ドロップダウンリストから [カスタム] を選択し、[テンプレート] に次の 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
アプリケーションに対して Microservices Governance を有効にします。詳細については、「ACK または ACS クラスターの Java マイクロサービスアプリケーションに対して Microservices Governance を有効にする」をご参照ください。
可視性データを表示する
spring-cloud-b と spring-cloud-b-gray の両方で CronHPA が有効になっており、5 分間隔でスケジュールされたスケーリングをシミュレートします。アプリケーション名をクリックし、[pod スケーリング] タブをクリックすると、関連情報が表示されます。
spring-cloud-b
spring-cloud-b-gray
MSE コンソール にログインし、トップナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。表示されたページで、spring-cloud-a アプリケーションのリソースカードをクリックします。
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 つのノードを使用可能にします。
MSE コンソール にログインし、トップナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。表示されたページで、spring-cloud-c アプリケーションのリソースカードをクリックします。
左側のナビゲーションペインで、Traffic management をクリックします。Graceful Start/Shutdown タブで、Graceful Start をオンにします。表示される Prompt message で、[OK] をクリックします。デフォルトのプリフェッチ期間は 120 秒です。
サービスプリフェッチ機能が有効になっているアプリケーションが再起動した後、トラフィックは時間とともに徐々に増加します。接続プールやキャッシュなどのリソースを事前に提供する必要がある、アプリケーションの起動が遅いシナリオでは、アプリケーションに対してサービスプリフェッチ機能を有効にすることができます。このようにして、キャッシュリソースが順番に作成され、アプリケーションが安全な方法で起動され、トラフィック損失は発生しません。