主页 » DevOps » Kubernetes蓝绿部署 原理、优缺点和kubernetes蓝绿部署以及流量切换实践指南

Kubernetes蓝绿部署 原理、优缺点和kubernetes蓝绿部署以及流量切换实践指南

正文

近期更新文章:

1、k8s之deployment控制器工作原理、滚动更新和编写yaml技巧详解

2、如何使用Deployment管理Kubernetes Pod:扩容、缩容、滚动更新

什么是蓝绿部署?

蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的、正在运行的系统,只是系统版本和对外服务情况不同。开发新版本,要用新版本替换线上的旧版本,在线上的系统之外,搭建了一个使用新版本代码的全新系统。 这时候,一共有两套系统在运行,正在对外提供服务的老系统是绿色系统,新部署的系统是蓝色系统。

k8s蓝绿部署

蓝色系统不对外提供服务,用来做什么呢?

用来做发布前测试,测试过程中发现任何问题,可以直接在蓝色系统上修改,不干扰用户正在使用的系统。(注意,两套系统没有耦合的时候才能百分百保证不干扰)
蓝色系统经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统;

蓝绿部署

切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。

当确信对外提供服务的蓝色系统工作正常,不对外提供服务的绿色系统已经不再需要的时候,蓝色系统正式成为对外提供服务系统,成为新的绿色系统。 原先的绿色系统可以销毁,将资源释放出来,用于部署下一个蓝色系统。

蓝绿部署有什么优势和缺点

优点:
1、更新过程无需停机,风险较少
2、回滚方便,只需要更改路由或者切换DNS服务器,效率较高
缺点:
1、成本较高,需要部署两套环境。如果新版本中基础服务出现问题,会瞬间影响全网用户;如果新版本有问题也会影响全网用户。
2、需要部署两套机器,费用开销大
3、在非隔离的机器(Docker、VM)上操作时,可能会导致蓝绿环境被摧毁风险
4、负载均衡器/反向代理/路由/DNS处理不当,将导致流量没有切换过来情况出现

蓝绿部署的关键步骤

  1. 创建两个 Deployment: 首先,创建两个 Deployment,一个代表当前生产版本(绿色部署),另一个代表新的版本(蓝色部署)。这两个Deployment 将会共享同一个 Service,以便它们可以共享相同的 DNS 名称和 IP 地址。
  2. 通过Service的Selector和Label功能,将请求切到蓝色版本,让其变成绿色版本

kubernetes蓝绿部署

deployment官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

Kubernetes不支持内置的蓝绿部署。目前最好的方式是创建新的deployment,然后使用Service资源来实现蓝绿部署,需要借助Service的Selector和Label功能,来将service以指向新的deployment部署的应用,

创建绿色部署环境

[root@pengfei-master1 deply]# cat deploy-lv.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v1
  namespace: blue-green
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

使用kubectl命令创建部署。

[root@pengfei-master1 deply]# kubectl create ns blue-green
[root@pengfei-master1 deply]# kubectl apply -f lv.yaml
[root@pengfei-master1 deply]# kubectl get pods -n blue-green

创建前端service

[root@pengfei-master1 deply]# cat service_lanlv.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-lan-lv
  labels:
    app: myapp
  namespace: blue-green
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30062
    name: http
  selector:
    app: myapp
    version: v2

使用kubectl部署service

[root@pengfei-master1 deply]# kubectl apply -f service_lanlv.yaml
[root@pengfei-master1 deply]# kubectl get svc -n blue-green
NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
myapp-lan-lv   NodePort   10.100.221.185   <none>        80:30062/TCP   5m44s

在浏览器访问http://k8s-master节点ip:30062

创建蓝色部署环境

[root@pengfei-master1 deply]# cat deploy-service.yaml
lan.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2
  namespace: blue-green
spec:
  replicas: 3
  selector:
   matchLabels:
    app: myapp
    version: v1
  template:
   metadata:
    labels:
     app: myapp
     version: v1
   spec:
    containers:
    - name: myapp
      image: nginx:latest
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 80

然后使用kubectl命令创建部署。

[root@pengfei-master1 deply]# kubectl apply -f lan.yaml

验证部署是否成功:

[root@pengfei-master1 deply]# kubectl get pods -n blue-green

切换流量

修改service_lanlv.yaml 配置文件,修改标签version: v1,让其匹配到蓝程序(升级之后的程序)

apiVersion: v1
kind: Service
metadata:
  name: myapp-lan
  namespace: blue-green
  labels:
    app: myapp
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30062
    name: http
  selector:
    app: myapp
    version: v1

更新

[root@pengfei-master1 deply]# kubectl apply -f service_lanlv.yaml

[root@xianchaomaster1 deployment]# kubectl get svc -n blue-green
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
myapp-lan-lv   NodePort   10.107.213.1   <none>        80:30062/TCP   9m50s

在浏览器访问http://k8s-master节点ip:30062

若发现问切,可以快速回滚

配置文件,修改标签version: v2,让其匹配到旧绿色程序(升级之前的程序)

更高级的做法

而更高级的做法是创建一个Ingress资源来将外部一部分流量导入到蓝色版本的Service,同时保持一部分流量继续访问绿色版本。验证新版本是否满足业务需求和性能要求。在保证新版本运行稳定后,将所有流量切换到新版本的Service,完成线上业务的蓝绿部署

通过Ingress的配置,可以实现在蓝绿部署过程中,将流量灵活地引导到不同的Service,实现业务的平滑升级

关于Ingress内容后续再说

分享:
Telegram
Twitter
Facebook

发表评论

了解 zhpengfei.com 的更多信息

立即订阅以继续阅读并访问完整档案。

Continue reading

解锁流媒体/ChatGPT

智能分流/仅代理海外网站

IEPL优质线路|全天4K秒开