附032.Kubernetes实现蓝绿发布

蓝绿发布原理

蓝绿发布本质上是但愿能优雅无误的迭代应用,以便于使应用平稳提供服务。一般是不停老版本的同时对新版本进行先发布,而后确认无误后进行流量切换,即并行部署。
Kubernetes中能够经过deployment来部署一个蓝发布,而后经过控制service,来决定使用的版本。即经过label selector 将流量转发至对应的版本。html

蓝绿发布实践

构建环境

基础Kubernetes环境

须要部署一个处于健壮状态的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

部署蓝应用

建立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

蓝绿切换

提示:部署绿应用后,若不进行流量切换,可保持蓝应用对外服务,同时观察绿应用是否部署运行正常。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

001

总结

在进行蓝绿发布的过程当中,对外服务一直处于可用状态,绿版本部署成功以后,全部请求仍是蓝应用,当流量切换后,马上迭代至绿版本,若须要回滚只须要将流量切回蓝应用便可。
一般建议对外成功发布绿应用后,蓝应用保持并行一段时间,而后根据业务状况进行释放。
同时,如上手动操做,可融合进相关开源devops项目中,从而实现自动化,也可以使用相关厂商现有产品,若阿里云云效、开源的CODING等。api

相关文章
相关标签/搜索