10.1 什么是蓝绿部署?
蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的、正在运行的系统,只是系统版本和对外服务情况不同。
开发新版本,要用新版本替换线上的旧版本,在线上的系统之外,搭建了一个使用新版本代码的全新系统。这时候,一共有两套系统在运行,正在对外提供服务的老系统是绿色系统,新部署的系统是蓝色系统。
蓝色系统不对外提供服务,用来做什么呢?
用来做发布前测试,测试过程中发现任何问题,可以直接在蓝色系统上修改,不干扰用户正在使用的系统。(注意,两套系统没有耦合的时候才能百分百保证不干扰)
蓝色系统经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统:
切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。
当确信对外提供服务的蓝色系统工作正常,不对外提供服务的绿色系统已经不再需要的时候,蓝色系统正式成为对外提供服务系统,成为新的绿色系统。原先的绿色系统可以销毁,将资源释放出来,用于部署下一个蓝色系统。
10.2 蓝绿部署的优势和缺点
优点:
1、更新过程无需停机,风险较少
2、回滚方便,只需要更改路由或者切换DNS服务器,效率较高
缺点:
1、成本较高,需要部署两套环境。如果新版本中基础服务出现问题,会瞬间影响全网用户;如果新版本有问题也会影响全网用户。
2、需要部署两套机器,费用开销大
3、在非隔离的机器(Docker、VM)上操作时,可能会导致蓝绿环境被摧毁风险
4、负载均衡器/反向代理/路由/DNS处理不当,将导致流量没有切换过来情况出现
11、通过k8s实现线上业务的蓝绿部署
下面实验需要的镜像包在课件,把镜像压缩包上传到k8s的各个工作节点,docker load -i解压:
[root@xianchaonode2 ~]# docker load -i myapp-lan.tar.gz [root@xianchaonode1 ~]# docker load -i myapp-lv.tar.gz
Kubernetes不支持内置的蓝绿部署。目前最好的方式是创建新的deployment,然后更新应用程序的service以指向新的deployment部署的应用
1.创建蓝色部署环境(新上线的环境,要替代绿色环境)
下面步骤在k8s的控制节点操作:
[root@xianchaomaster1 ~]# kubectl create ns blue-green [root@xianchaomaster1 ~]# cat lan.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v1 namespace:blue-green spec: replicas: 3 selector: matchLabels: app: myapp version: v1 template: metadata: labels: app: myapp version: v1 spec: containers: - name: myapp image:janakiramm/myapp:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 80
然后可以使用kubectl命令创建部署。
[root@xianchaomaster1~]# kubectl apply -f lan.yaml
验证部署是否成功:
[root@xianchaomaster1~]# kubectl get pods -n blue-green
显示如下:
NAME READY STATUS RESTARTS AGE myapp-v1-67fd9fc9c8-tsl92 1/1 Running 0 53s myapp-v1-67fd9fc9c8-24tbp 1/1 Running 0 53s myapp-v1-67fd9fc9c8-cw59c 1/1 Running 0 53s
2.创建绿色部署环境(原来的部署环境)
[root@xianchaomaster1 ~]# cat lv.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-v2 namespace:blue-green spec: replicas: 3 selector: matchLabels: app: myapp version: v2 template: metadata: labels: app: myapp version: v2 spec: containers: - name: myapp image:janakiramm/myapp:v2 imagePullPolicy: IfNotPresent ports: -containerPort: 80
可以使用kubectl命令创建部署。
[root@xianchaomaster1~]# kubectl apply -f lv.yaml
创建前端service
[root@xianchaomaster1 ~]# cat service_lanlv.yaml apiVersion: v1 kind: Service metadata: name: myapp-lan namespace:blue-green labels: app: myapp version: v2 spec: type: NodePort ports: - port: 80 nodePort: 30062 name: http selector: app: myapp version: v2
更新服务:
[root@xianchaomaster1~]# kubectl apply -f service_lanlv.yaml
在浏览器访问http://k8s-master节点ip:30062 显示如下:
修改service_lanlv.yaml 配置文件,修改标签,让其匹配到蓝程序(升级之后的程序)
[root@xianchaomaster1 ~]# cat service_lanlv.yaml apiVersion: v1 kind: Service metadata: name: myapp-lan namespace:blue-green labels: app: myapp version: v1 spec: type: NodePort ports: - port: 80 nodePort: 30062 name: http selector: app: myapp version: v1
更新资源清单文件:
[root@xianchaomaster1~]# kubectl apply -f service_lanlv.yaml
在浏览器访问http://k8s-master节点ip:30062 显示如下: