藍綠髮布本質上是但願能優雅無誤的迭代應用,以便於使應用平穩提供服務。一般是不停老版本的同時對新版本進行先發布,而後確認無誤後進行流量切換,即並行部署。
Kubernetes中能夠經過deployment來部署一個藍髮布,而後經過控制service,來決定使用的版本。即經過label selector 將流量轉發至對應的版本。html
須要部署一個處於健壯狀態的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
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
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
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
在進行藍綠髮布的過程當中,對外服務一直處於可用狀態,綠版本部署成功以後,全部請求仍是藍應用,當流量切換後,馬上迭代至綠版本,若須要回滾只須要將流量切回藍應用便可。
一般建議對外成功發佈綠應用後,藍應用保持並行一段時間,而後根據業務狀況進行釋放。
同時,如上手動操做,可融合進相關開源devops項目中,從而實現自動化,也可以使用相關廠商現有產品,若阿里云云效、開源的CODING等。api