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