共计 8166 个字符,预计需要花费 21 分钟才能阅读完成。
简介:本文是阿里云微服务引擎 MSE 在利用公布时提供的无损高低线和服务预热能力最佳实际介绍。
本文是阿里云微服务引擎 MSE 在利用公布时提供的无损高低线和服务预热能力最佳实际介绍。假如利用的架构由 Zuul 网关以及后端的微服务利用实例(Spring Cloud)形成。具体的后端调用链路有购物车利用 A,交易中心利用 B,库存核心利用 C,这些利用中的服务之间通过 Nacos 注册核心实现服务注册与发现。
前提条件
开启 MSE 微服务治理
- 已创立 Kubernetes 集群,请参见创立 Kubernetes 托管版集群。
- 已开明 MSE 微服务治理专业版,请参见开明 MSE 微服务治理。
背景信息
很多用户量大并发度高的利用零碎为了防止公布过程中的流量有损个别抉择在流量较小的中午公布,尽管这样做有成果,但不可控导致背地的研发运维人员常常因为公布问题时常搞得中午胆战心惊,心力疲乏。基于此,阿里云微服务引擎 MSE 通过在利用公布过程中,通过利用下线被动实时登记,利用上线衰弱就绪查看与生命周期对齐以及服务预热等技术手段所提供的微服务利用无损高低线公布性能,让研发运维人员即便是在白天公布利用,也能风轻云淡。
筹备工作
留神,本实际所应用的 Agent 目前还在灰度中,须要对利用 Agent 进行灰度降级,降级文档:https://help.aliyun.com/docum…
利用部署在不同的 Region(临时仅反对国内 region)请应用对应的 Agent 下载地址:http://arms-apm-cn-[regionId].oss-cn-[regionId].aliyuncs.com/2.7.1.3-mse-beta/,留神替换地址中的[regionId],regionId 是阿里云 regionId,
例如 Region 北京 Agent 地址为:http://arms-apm-cn-beijing.os…
利用部署流量架构图
流量压力起源
在 spring-cloud-zuul 利用中,每个 pod 具备并发为 10 的拜访本地 zuul 端口的 127.0.0.1:20000:/A/a 的 http 申请流量。能够通过环境变量 demo.qps 配置并发数。
部署 Demo 应用程序
将上面的内容保留到一个文件中,假如取名为 mse-demo.yaml,并执行 kubectl apply -f mse-demo.yaml 以部署利用到提前创立好的 Kubernetes 集群中(留神因为 demo 中有 CronHPA 工作,所以请先在集群中装置 ack-kubernetes-cronhpa-controller 组件,具体在容器服务 -Kubernetes-> 市场 -> 利用目录中搜寻组件在测试集群中进行装置),这里咱们将要部署 Zuul,A, B 和 C 三个利用,其中 A、B 两个利用别离部署一个基线版本和一个灰度版本,B 利用的基线版本敞开了无损下线能力,灰度版本开启了无损下线能力。C 利用开启了服务预热能力,其中预热时长为 120 秒。
# 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
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 配置
---
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:
annotations:
msePilotCreateAppName: spring-cloud-zuul
labels:
app: spring-cloud-zuul
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 利用 base 版本, 开启依照机器纬度全链路透传
---
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:
annotations:
msePilotCreateAppName: spring-cloud-a
msePilotAutoEnable: "on"
labels:
app: spring-cloud-a
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 利用 gray 版本, 开启依照机器纬度全链路透传
---
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:
annotations:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-a
msePilotAutoEnable: "on"
labels:
app: spring-cloud-a-gray
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 利用 base 版本,敞开无损下线能力
---
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:
annotations:
msePilotCreateAppName: spring-cloud-b
msePilotAutoEnable: "on"
labels:
app: spring-cloud-b
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 利用 gray 版本, 默认开启无损下线性能
---
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:
annotations:
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-b
msePilotAutoEnable: "on"
labels:
app: spring-cloud-b-gray
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
lifecycle:
preStop:
exec:
command:
- /bin/sh
- '-c'
- >-
wget http://127.0.0.1:54199/offline 2>/tmp/null;sleep
30;exit 0
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
# C 利用 base 版本
---
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:
annotations:
msePilotCreateAppName: spring-cloud-c
msePilotAutoEnable: "on"
labels:
app: spring-cloud-c
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 网关开启 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 利用裸露 k8s 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 配置
---
apiVersion: v1
kind: Service
metadata:
name: nacos-slb
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: LoadBalancer
后果验证一:无损下线性能
因为咱们对 spring-cloud- b 跟 spring-cloud-b-gray 利用均开启了定时 HPA,模仿每 5 分钟进行一次定时的扩缩容。
登录 MSE 控制台,进入微服务治理核心 -> 利用列表 ->spring-cloud-a-> 利用详情,从利用监控曲线,咱们能够看到 spring-cloud- a 利用的流量数据:
![上传中 …]()
gray 版本的流量在 pod 扩缩容的过程中申请谬误数为 0,无流量损失。未打标的版本因为敞开了无损下线性能,在 pod 扩缩容的过程中有 20 个从 spring-cloud- a 发到 spring-cloud- b 的申请呈现报错,产生了申请流量损耗。
后果验证二:服务预热性能
咱们在 spring-cloud-c 利用开启了定时 HPA 模仿利用启动的过程,每隔 5 分钟做一次伸缩,在第 2 分钟第 0 秒缩容到 1 个节点,在第 2 分钟第 10 秒扩容到 2 个节点。
在预热利用的生产端 spring-cloud- b 开启服务预热性能。
在预热利用的服务提供端 spring-cloud- c 开启服务预热性能。预热时长配置为 120 秒。
察看节点的流量,发现节点流量迟缓回升。并且能看到节点的预热开始和完结工夫,以及相干的事件。
从上图能够看到开启预热性能的利用重启后的流量会随工夫迟缓减少,在一些利用启动过程中须要预建连接池和缓存等资源的慢启动场景,开启服务预热能无效爱护利用启动过程中缓存资源有序创立保障利用平安启动并做到流量无损。
原文链接
本文为阿里云原创内容,未经容许不得转载。