1. 程式人生 > >附032.Kubernetes實現藍綠髮布

附032.Kubernetes實現藍綠髮布

## 藍綠髮布原理 藍綠髮布本質上是希望能優雅無誤的迭代應用,以便於使應用平穩提供服務。通常是不停老版本的同時對新版本進行先發布,然後確認無誤後進行流量切換,即並行部署。 Kubernetes中可以通過deployment來部署一個藍髮布,然後通過控制service,來決定使用的版本。即通過label selector 將流量轉發至對應的版本。 ## 藍綠髮布實踐 ### 構建環境 #### 基礎Kubernetes環境 需要部署一個處於健壯狀態的Kubernetes,部署Kubernetes可參考 **[Kubernetes_v1.20.0高可用部署](https://www.cnblogs.com/itzgr/p/14173665.html)** #### 準備測試檔案 ``` 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](https://bed01.oss-cn-hangzhou.aliyuncs.com/study/kubernetes/f032/001.png) ## 總結 在進行藍綠髮布的過程中,對外服務一直處於可用狀態,綠版本部署成功之後,所有請求還是藍應用,當流量切換後,立刻迭代至綠版本,若需要回滾只需要將流量切回藍應用即可。 通常建議對外成功釋出綠應用後,藍應用保持並行一段時間,然後根據業務情況進行釋放。 同時,如上手動操作,可融合進相關開源devops專案中,從而實現自動化,也可使用相關廠商現有產品,若阿里云云效、開源的CODI