蓝绿发布原理
蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务。通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署。
Kubernetes中可以通过deployment来部署一个蓝发布,然后通过控制service,来决定使用的版本。即通过label selector 将流量转发至对应的版本。
蓝绿发布实践
构建环境
基础Kubernetes环境
需要部署一个处于健壮状态的Kubernetes,部署Kubernetes可参考
Kubernetes_v1.20.0高可用部署
准备测试文件
root@master01:~/mystudy# mkdir -p /data/nginx/blue
root@master01:~/mystudy# mkdir -p /data/nginx/green
root@master01:~/mystudy# echo myblue > /data/nginx/blue/index.html
root@master01:~/mystudy# echo mygreen > /data/nginx/green/index.html
部署蓝应用
创建Kubernetes deployment
root@master01:~/mystudy# cat mybluedp.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-blue-dp
labels:
dp: nginx-blue-dp
spec:
replicas: 1
selector:
matchLabels:
app: nginx-blue
template:
metadata:
labels:
app: nginx-blue
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html/index.html
name: nginx-pv-tpl
readOnly: True
volumes:
- name: nginx-pv-tpl
hostPath:
path: /data/nginx/blue/index.html
type: File
root@master01:~/mystudy# kubectl apply -f mybluedp.yaml
Kubernetes暴露蓝应用
root@master01:~/mystudy# vim mysvc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
svc: nginx-svc
spec:
type: NodePort
ports:
- port: 80
name: nginx-svc
protocol: TCP
targetPort: 80
nodePort: 80
selector:
app: nginx-blue
root@master01:~/mystudy# kubectl apply -f mysvc.yaml
测试蓝应用
[root@client ~]# curl -X GET http://172.16.10.31 #客户端测试
myblue
[root@client ~]# while true; do curl -X GET http://172.16.10.31 ; done
部署绿应用
创建Kubernetes deployment
root@master01:~/mystudy# vim mygreendp.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-green-dp
labels:
dp: nginx-green-dp
spec:
replicas: 1
selector:
matchLabels:
app: nginx-green
template:
metadata:
labels:
app: nginx-green
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html/index.html
name: nginx-pv-tpl
readOnly: True
volumes:
- name: nginx-pv-tpl
hostPath:
path: /data/nginx/green/index.html
type: File
root@master01:~/mystudy# kubectl apply -f mygreendp.yaml
蓝绿切换
提示:部署绿应用后,若不进行流量切换,可保持蓝应用对外服务,同时观察绿应用是否部署运行正常。
root@master01:~/mystudy# kubectl edit svc nginx-svc
……
apiVersion: v1
kind: Service
……
spec:
……
selector:
app: nginx-green
……
提示:通过selector的标签,将svc流量引向绿应用。
测试绿应用
[root@client ~]# curl -X GET http://172.16.10.31
mygreen
[root@client ~]# watch curl -X GET http://172.16.10.31
总结
在进行蓝绿发布的过程中,对外服务一直处于可用状态,绿版本部署成功之后,所有请求还是蓝应用,当流量切换后,立刻迭代至绿版本,若需要回滚只需要将流量切回蓝应用即可。
通常建议对外成功发布绿应用后,蓝应用保持并行一段时间,然后根据业务情况进行释放。
同时,如上手动操作,可融合进相关开源devops项目中,从而实现自动化,也可使用相关厂商现有产品,若阿里云云效、开源的CODING等。