蓝绿发布本质上是但愿能优雅无误的迭代应用,以便于使应用平稳提供服务。一般是不停老版本的同时对新版本进行先发布,而后确认无误后进行流量切换,即并行部署。
Kubernetes中能够经过deployment来部署一个蓝发布,而后经过控制service,来决定使用的版本。即经过label selector 将流量转发至对应的版本。html
须要部署一个处于健壮状态的Kubernetes,部署Kubernetes可参考
Kubernetes_v1.20.0高可用部署node
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
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
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
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
提示:部署绿应用后,若不进行流量切换,可保持蓝应用对外服务,同时观察绿应用是否部署运行正常。nginx
root@master01:~/mystudy# kubectl edit svc nginx-svc …… apiVersion: v1 kind: Service …… spec: …… selector: app: nginx-green ……
提示:经过selector的标签,将svc流量引向绿应用。vim
[root@client ~]# curl -X GET http://172.16.10.31 mygreen [root@client ~]# watch curl -X GET http://172.16.10.31
在进行蓝绿发布的过程当中,对外服务一直处于可用状态,绿版本部署成功以后,全部请求仍是蓝应用,当流量切换后,马上迭代至绿版本,若须要回滚只须要将流量切回蓝应用便可。
一般建议对外成功发布绿应用后,蓝应用保持并行一段时间,而后根据业务状况进行释放。
同时,如上手动操做,可融合进相关开源devops项目中,从而实现自动化,也可以使用相关厂商现有产品,若阿里云云效、开源的CODING等。api