藍綠髮布原理
藍綠髮布本質上是希望能優雅無誤的迭代應用,以便於使應用平穩提供服務。通常是不停老版本的同時對新版本進行先發布,然後確認無誤後進行流量切換,即並行部署。
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
總結
在進行藍綠髮布的過程中,對外服務一直處於可用狀態,綠版本部署成功之後,所有請求還是藍應用,當流量切換後,立刻迭代至綠版本,若需要回滾只需要將流量切回藍應用即可。
通常建議對外成功釋出綠應用後,藍應用保持並行一段時間,然後根據業務情況進行釋放。
同時,如上手動操作,可融合進相關開源devops專案中,從而實現自動化,也可使用相關廠商現有產品,若阿里云云效、開源的CODING等。