附032.Kubernetes實現藍綠髮布

木二發表於2021-03-31

藍綠髮布原理

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

藍綠髮布實踐

構建環境

基礎Kubernetes環境

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

藍綠切換

提示:部署綠應用後,若不進行流量切換,可保持藍應用對外服務,同時觀察綠應用是否部署執行正常。

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等。

相關文章