阿里云 - 灰度发布/蓝绿发布
蓝绿发布
蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK后将流量逐步切到新版本。蓝绿部署无需停机,并且风险较小。
示例
本例是一个 nginx 应用,包含一个 deployment、 service 以及 ingress。deployment 通过 NodePort 对外暴露端口,并且有一个 ingress 正在对外提供服务。编排模板如下。
示例项目地址:https://code.aliyun.com/CodePipeline/kubernetes-deploy-demo.git
步骤一 部署版本1的应用(old-nginx)
编排模板如下:
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: old-nginxspec:replicas: 2selector:matchLabels:run: old-nginxtemplate:metadata:labels:run: old-nginxspec:containers:- image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginximagePullPolicy: Alwaysname: old-nginxports:- containerPort: 80protocol: TCPrestartPolicy: AlwaysapiVersion: v1kind: Servicemetadata:name: old-nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: old-nginxsessionAffinity: Nonetype: NodePortapiVersion: extensions/v1beta1kind: Ingressmetadata:name: gray-releasespec:rules:- host: www.example.comhttp:paths:- path: /backend:serviceName: old-nginxservicePort: 80
配置CodePipeline项目进行部署:
登录Master节点,查询Ingress的访问地址
NAME HOSTS ADDRESS PORTS AGEgray-release www.example.com 47.97.238.11 80 8m
执行curl命令,查看路由的访问情况:
#curl -H "Host: www.example.com" http://47.97.238.11old
步骤二 创建新版本的应用(new-nginx)
编排模板如下:
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: new-nginxspec:replicas: 1selector:matchLabels:run: new-nginxtemplate:metadata:labels:run: new-nginxspec:containers:- image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginximagePullPolicy: Alwaysname: new-nginxports:- containerPort: 80protocol: TCPrestartPolicy: AlwaysapiVersion: v1kind: Servicemetadata:name: new-nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: new-nginxsessionAffinity: Nonetype: NodePortapiVersion: extensions/v1beta1kind: Ingressmetadata:name: gray-releaseannotations:# 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中#nginx.ingress.kubernetes.io/service-match: |# new-nginx: header("foo", /^bar$/)nginx.ingress.kubernetes.io/service-weight: |new-nginx: ${NEW_PER}, old-nginx: ${OLD_PER}spec:rules:- host: www.example.comhttp:paths:- path: /backend:serviceName: old-nginxservicePort: 80- path: /backend:serviceName: new-nginxservicePort: 80
此处我们在编排模板中设置了${NEW_PER}和${OLD_PER}两个环境变量来帮助调节路由权重。 您可通过灵活调整这两个值来设置蓝绿发布的流量占比。
配置CodePipeline项目进行部署:
设置NEW_PER为0,OLD_PER为100进行部署:
执行curl命令,查看路由的访问情况:
#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old
设置NEW_PER为50,OLD_PER为50进行部署:
执行curl命令,查看路由的访问情况:
#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11new#curl -H "Host: www.example.com" http://47.97.238.11new#curl -H "Host: www.example.com" http://47.97.238.11old
设置NEW_PER为100,OLD_PER为0进行部署:
执行curl命令,查看路由的访问情况:
#curl -H "Host: www.example.com" http://47.97.238.11new#curl -H "Host: www.example.com" http://47.97.238.11new#curl -H "Host: www.example.com" http://47.97.238.11new#curl -H "Host: www.example.com" http://47.97.238.11new
完成新版本应用测试后,您可将 Ingress 的路由权重设置为 100 将流量完全导向新服务;或者删除 Ingress 中的注解和旧版本服务,实现蓝绿发布。
灰度发布
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
假若我们希望请求头中满足foo=bar的客户端请求才能路由到新版本服务(new-nginx)中,那么我们可以如下修改配置ingress规则:
编排模板如下:
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: new-nginxspec:replicas: 1selector:matchLabels:run: new-nginxtemplate:metadata:labels:run: new-nginxspec:containers:- image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginximagePullPolicy: Alwaysname: new-nginxports:- containerPort: 80protocol: TCPrestartPolicy: AlwaysapiVersion: v1kind: Servicemetadata:name: new-nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: new-nginxsessionAffinity: Nonetype: NodePortapiVersion: extensions/v1beta1kind: Ingressmetadata:name: gray-releaseannotations:# 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中nginx.ingress.kubernetes.io/service-match: |new-nginx: header("foo", /^bar$/)spec:rules:- host: www.example.comhttp:paths:- path: /backend:serviceName: old-nginxservicePort: 80- path: /backend:serviceName: new-nginxservicePort: 80
配置CodePipeline项目进行部署:
执行curl命令,查看路由的访问情况:
#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" http://47.97.238.11old#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11new#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11new#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11new
来源:https://help.aliyun.com/knowledge_detail/85948.html










浙公网安备 33010602011771号