デプロイ中のトラフィック損失を回避するため、多くの高並行性アプリケーションはオフピーク時にのみデプロイを実行します。このアプローチは問題の発生を減らすのに役立ちますが、予測不可能な要因により依然として高い運用コストが発生します。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コンポーネントのインストール」をご参照ください。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
展開 ページで、YAML のリソースの作成 をクリックします。
-
[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
-
デプロイしたアプリケーションでマイクロサービスガバナンスを有効にします。詳細については、「ACK および ACS マイクロサービスアプリケーション (Java) の MSE ガバナンスを有効にする」をご参照ください。
可観測性データの表示
spring-cloud-b と spring-cloud-b-gray の両方で CronHPA が有効になっており、5 分ごとの定期的なスケーリングをシミュレートします。アプリケーション名をクリックし、[Scaling] タブをクリックして詳細を表示します。
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側メニューで、Microservices Governance > Application Governance を選択し、spring-cloud-a アプリケーションカードをクリックします。
-
Application Overview ページに、このアプリケーションの可観測性データが表示されます。
グレースフルスタートの有効化
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) です。
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側メニューで、Microservices Governance > Application Governance を選択し、spring-cloud-c アプリケーションカードをクリックします。
-
左側メニューで Traffic management を選択し、Graceful Start/Shutdown タブを選択します。Graceful Start をオンにします。Prompt message ダイアログボックスで、OK をクリックします。ウォームアップ時間はデフォルトで 120 秒です。
ウォームアップを有効にすると、再起動されたアプリケーションへのトラフィックは時間とともに徐々に増加します。アプリケーションが起動時に接続プールやキャッシュを事前に構築する必要があるようなスロースタートシナリオでは、サービスのウォームアップを有効にすることで、リソースの秩序ある初期化と、トラフィック損失のない安全な起動が保証されます。