附032.Kubernetes實現藍綠發布


藍綠發布原理

藍綠發布本質上是希望能優雅無誤的迭代應用,以便於使應用平穩提供服務。通常是不停老版本的同時對新版本進行先發布,然后確認無誤后進行流量切換,即並行部署。
Kubernetes中可以通過deployment來部署一個藍發布,然后通過控制service,來決定使用的版本。即通過label selector 將流量轉發至對應的版本。

藍綠發布實踐

構建環境

基礎Kubernetes環境

需要部署一個處於健壯狀態的Kubernetes,部署Kubernetes可參考
附034.Kubernetes_v1.21.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# vim 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

001

總結

在進行藍綠發布的過程中,對外服務一直處於可用狀態,綠版本部署成功之后,所有請求還是藍應用,當流量切換后,立刻迭代至綠版本,若需要回滾只需要將流量切回藍應用即可。
通常建議對外成功發布綠應用后,藍應用保持並行一段時間,然后根據業務情況進行釋放。
同時,如上手動操作,可融合進相關開源devops項目中,從而實現自動化,也可使用相關廠商現有產品,若阿里雲雲效、開源的CODING等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM