在生产环境中,应用的部署、回滚、缩容等操作是不可避免的。如果您的应用没有具备无损下线的能力,您的任何应用在发布的过程中会造成短暂的服务不可用,短时间内业务监控会出现大量 IO 异常报错。如何在服务更新部署、缩容过程中保证业务无感知,是开发者必须要解决的问题,下面我们介绍基于MSE的无损下线。
关于MSE的详细介绍,请参见什么是微服务引擎MSE。
helm plugin install https://github.com/AliyunContainerService/helm-acr
git clone https://github.com/AliyunContainerService/helm-acr.git
sed -i 's/github.com/helm-acr-releases.oss-cn-hangzhou.aliyuncs.com/g' helm-acr/scripts/install_plugin.sh
helm plugin install helm-acr
git clone https://github.com/AliyunContainerService/helm-acr.git
sed -i '' 's/github.com/helm-acr-releases.oss-cn-hangzhou.aliyuncs.com/g' helm-acr/scripts/install_plugin.sh
helm plugin install helm-acr
# 添加 helm repo
export HELM_REPO_USERNAME='edas_common_test@aliyun-inner.com';
export HELM_REPO_PASSWORD='Hello1234';
helm repo add mse acr://microservice-repo-chart.cn-hangzhou.cr.aliyuncs.com/ms/canary --username ${HELM_REPO_USERNAME} --password ${HELM_REPO_PASSWORD}
# 部署 MSE-Samples
helm install mse-samples-v2 mse/mse-samples --namespace default
安装成功后,示例如下
$ kubectl get svc,deploy,ing
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 13h
service/nacos-server ClusterIP 172.21.1.80 <none> 8848/TCP 13h
service/zuul-gateway-svc LoadBalancer 172.21.2.69 192.168.0.48 80:32266/TCP 13h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nacos-server 1/1 1 1 13h
deployment.extensions/sc-a-gray 1/1 1 1 13h
deployment.extensions/sc-a-normal 4/4 4 4 13h
deployment.extensions/sc-a-normal-without-shutdown 4/4 4 4 13h
deployment.extensions/sc-b-gray 1/1 1 1 13h
deployment.extensions/sc-b-normal 1/1 1 1 13h
deployment.extensions/sc-c 1/1 1 1 13h
deployment.extensions/zuul-gateway 1/1 1 1 13h
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/zuul-ingress * 101.133.150.118 80 13h
# 获取ingress的ip
export INGRESS_IP=`kubectl get ing zuul-ingress -n default --output jsonpath="{.status.loadBalancer.ingress[*].ip}"|xargs -I {} echo {}`
Demo应用的架构如下图所示。流量从 Netflix Zuul 对应的 Ingress 进来,会调用 SC-A 应用对应的服务,SC-A 应用内部调用 SC-B 应用的服务,SC-B 应用内部调用 SC-C 应用的服务。其中sc-a-gray、sc-b-gray用于金丝雀发布演示,SC-A 的正常版本通过两个 Deployment 部署,其中带 -without-shutdown 的 Deployment 关闭无损下线功能,不带 -without-shutdown 的 Deployment 会被 MSE 默认开启无损下线功能。关闭无损下线的 Deployment 在下线/缩容等场景下会出现流量损失、业务报错的问题。
$ kubectl get ing zuul-ingress -n default --output jsonpath="{.status.loadBalancer.ingress[*].ip}"|xargs -I {} echo {}
101.133.150.118
访问该ip我们可以看到如下所示一个简单的页面
当我们打开开关页面就会不断去访问后端服务,并且将结果打印至页面,对应的字符串是 A[] ->B[] ->C[] ,其中[]中的内容是对应服务提供者的ip,我们可以看到A[]中的ip在不断变化,其中会记录调用的总数与调用失败的次数
而两个应用的差别就是在Yaml文件中是否有如下的配置。
annotations:
msePilotAutoEnable: "on"
msePilotCreateAppName: "<your-deployment-name>"
方案优势:
由于篇幅所限,本文例子中使用的注册中心为nacos,微服务协议是springcloud,同样的方案适用于如下的微服务中心和服务协议: