Untuk menghindari kehilangan traffic selama penerapan, banyak aplikasi berkonkurensi tinggi hanya melakukan deployment pada jam sepi. Meskipun pendekatan ini membantu mengurangi masalah, biaya operasional tetap tinggi karena faktor-faktor yang tidak dapat diprediksi. MSE melakukan optimasi mendalam terhadap proses startup dan shutdown aplikasi. Saat shutdown, MSE menggunakan mekanisme penantian adaptif dan notifikasi proaktif untuk memastikan semua permintaan yang tertunda selesai sebelum layanan offline, sehingga mencegah gangguan layanan yang tiba-tiba. Saat startup, MSE menyelaraskan manajemen siklus hidup layanan mikro secara tepat dengan setiap fase deployment menggunakan readiness probe, memastikan peluncuran versi layanan baru yang stabil.
Ikhtisar arsitektur demo
Asumsikan arsitektur aplikasi terdiri dari gerbang Zuul dan instans aplikasi layanan mikro backend (Spring Cloud). Rantai panggilan backend mencakup aplikasi keranjang belanja A, aplikasi pusat transaksi B, dan aplikasi pusat inventaris C. Aplikasi-aplikasi ini menggunakan Pusat Registrasi Nacos untuk registrasi dan penemuan layanan.
Pada aplikasi spring-cloud-zuul, seperti yang ditunjukkan pada gambar berikut, aplikasi tersebut secara bersamaan memanggil versi rilis canary dan versi normal spring-cloud-a dengan laju 100 permintaan per detik (QPS).
Deploy aplikasi dan aktifkan governance layanan mikro
Penting
Karena demo ini mencakup tugas CronHPA, instal terlebih dahulu komponen ack-kubernetes-cronhpa-controller di kluster Anda. Untuk detailnya, lihat Langkah 1: Instal komponen CronHPA.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Pada halaman Deployments, klik Create from YAML.
-
Untuk Sample Template, pilih Custom. Tempel YAML berikut ke dalam bidang Template, lalu klik Create.
File demo ini bernama mse-demo.yaml. File tersebut mendeploy gerbang Zuul dan tiga aplikasi (A, B, dan C). Aplikasi A dan B masing-masing memiliki versi garis dasar dan versi rilis canary. Versi garis dasar aplikasi B menonaktifkan graceful shutdown, sedangkan versi canary-nya mengaktifkan graceful shutdown. Aplikasi C mengaktifkan warmup layanan dengan durasi warmup 120 detik.
Expand to view the YAML file
# Nacos Server
---
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 Service configuration
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: ClusterIP
# Zuul gateway application
---
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
# Application A baseline version, with full-link pass-through enabled by machine dimension.
---
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
# Application A canary version, with full-link pass-through enabled by machine dimension.
---
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
# Application B baseline version, with graceful shutdown disabled.
---
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
# Application B canary version, with graceful shutdown enabled by default.
---
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
# Application C baseline version
---
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 configuration
---
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
# Expose Zuul gateway via SLB for demonstration
---
apiVersion: v1
kind: Service
metadata:
name: zuul-slb
spec:
ports:
- port: 80
protocol: TCP
targetPort: 20000
selector:
app: spring-cloud-zuul
type: ClusterIP
# Expose Application A as a Kubernetes Service
---
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 Server SLB Service configuration
---
apiVersion: v1
kind: Service
metadata:
name: nacos-slb
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: LoadBalancer
-
Aktifkan governance layanan mikro untuk aplikasi yang telah Anda deploy. Untuk detailnya, lihat Aktifkan governance MSE untuk aplikasi layanan mikro ACK dan ACS (Java).
Melihat data yang dapat diamati
Kedua aplikasi spring-cloud-b dan spring-cloud-b-gray telah mengaktifkan CronHPA, mensimulasikan penjadwalan penskalaan setiap 5 menit. Klik nama aplikasi, lalu klik tab Scaling untuk melihat detailnya.
-
Masuk ke Konsol MSE, dan pilih Wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance, lalu klik kartu aplikasi spring-cloud-a.
-
Halaman Application Overview menampilkan data observabilitas untuk aplikasi ini.
Data menunjukkan:
-
Versi spring-cloud-a-gray tidak mengalami error permintaan selama penskalaan Pod, menandakan tidak ada kehilangan traffic.
-
Versi spring-cloud-a, yang menonaktifkan graceful shutdown, mengalami 20 permintaan gagal dari spring-cloud-a ke spring-cloud-b selama penskalaan Pod, sehingga menyebabkan kehilangan traffic.
Aktifkan mulai mulus
Aplikasi spring-cloud-c menggunakan CronHPA untuk mensimulasikan perilaku startup, melakukan penskalaan setiap 5 menit—menurunkan skala menjadi satu node pada detik ke-0 menit ke-2, dan meningkatkan skala menjadi dua node pada detik ke-10 menit ke-2. Pada halaman CronHPA, CronHPA spring-cloud-c memiliki dua tugas: scale-down (jadwal 0 2/5 * * * *, jumlah replika target 1, status Succeed) dan scale-up (jadwal 10 2/5 * * * *, jumlah replika target 2, status Succeed).
-
Masuk ke Konsol MSE, dan pilih Wilayah di bilah navigasi atas.
-
Di panel navigasi kiri, pilih Microservices Governance > Application Governance, lalu klik kartu aplikasi spring-cloud-c.
-
Di panel navigasi kiri, pilih Traffic management, lalu pilih tab Graceful Start/Shutdown. Aktifkan Graceful Start. Pada kotak dialog Prompt message, klik OK. Durasi warmup default adalah 120 detik.
Setelah mengaktifkan warmup, traffic ke aplikasi yang direstart akan meningkat secara bertahap seiring waktu. Dalam skenario slow-start—seperti ketika aplikasi perlu membangun kolam koneksi atau cache terlebih dahulu saat startup—mengaktifkan service warmup memastikan inisialisasi resource yang teratur dan startup yang aman tanpa kehilangan traffic.