藍綠部署概述
? 藍綠部署中,一共有兩套系統,一套是正在提供服務的系統,一套是準備發布的系統。兩套系統都是功能完善、正在運行的系統,只是版本和對外服務情況不同。
? 開發新版本,要用新版本替換線上的舊版本,在線上的系統之外,搭建了一個使用新版本代碼的全新系統。 這時候,一共有兩套系統在運行(藍綠自定義),正在對外提供服務的老系統是綠色系統,新部署的系統是藍色系統。
藍色系統不對外提供服務,用來做什么呢?
? 用來做發布前測試,測試過程中發現任何問題,可以直接在藍色系統上修改,不干擾用戶正在使用的系統。(注意,兩套系統沒有耦合的時候才能百分百保證不干擾)**
藍色系統經過反復的測試、修改、驗證,確定達到上線標準之后,直接將用戶切換到藍色系統:
切換后的一段時間內,依舊是藍綠兩套系統并存,但是用戶訪問的已經是藍色系統。這段時間內觀察藍色系統(新系統)工作狀態,如果出現問題,直接切換回綠色系統。
? 當確信對外提供服務的藍色系統工作正常,不對外提供服務的綠色系統已經不再需要的時候,藍色系統正式成為對外提供服務系統,成為新的綠色系統。 原先的綠色系統可以銷毀,將資源釋放出來,用于部署下一個藍色系統。
藍綠部署的優缺點
優點:
- 更新過程無需停機,風險較小
- 回滾方便,只需要更改路由或切換DNS服務器,效率高
缺點:
- 成本高,需要兩套環境,開銷大
- 如果新版本有問題會影響全網用戶
藍綠部署示例
-
創建service,關聯到myapp上
vi blue-green-service.yaml apiVersion: apps/v1 kind: Deployment metadata:name: myapp-v1 spec:replicas: 10selector:matchLabels:app: myappversion: v1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappimage: 172.16.80.140/myapp/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
-
創建pod,使用版本 myapp:v1,作為藍版本
vi blue.yaml apiVersion: apps/v1 kind: Deployment metadata:name: myapp-v1 spec:replicas: 10selector:matchLabels:app: myappversion: v1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappimage: 172.16.80.140/myapp/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
-
瀏覽器訪問集群主機ip:30080,結果均為藍色,即v1版本
-
創建pod,使用版本 myapp:v2,作為綠版本
vi green.yaml apiVersion: apps/v1 kind: Deployment metadata:name: myapp-v2 spec:replicas: 10selector:matchLabels:app: myappversion: v2template:metadata:labels:app: myappversion: v2spec:containers:- name: myappimage: 172.16.80.140/myapp/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
瀏覽器訪問主機ip:30080,結果為藍色或綠色,即v1和v2版本都在使用
5. 訪問集群主機ip:30080,會發現藍綠不定
6. 使用命令查看路由 ipvsadm,service路由到了所有的pod
ipvsadm
TCP mast01:31180 rr
TCP mast01:30080 rr-> 10.244.140.76:http Masq 1 0 0 -> 10.244.140.77:http Masq 1 0 0 -> 10.244.140.78:http Masq 1 0 0 -> 10.244.140.79:http Masq 1 0 0 -> 10.244.140.80:http Masq 1 0 0 -> 10.244.140.81:http Masq 1 0 0 -> 10.244.140.82:http Masq 1 0 0 -> 10.244.140.83:http Masq 1 0 0 -> 10.244.140.84:http Masq 1 0 0 -> 10.244.140.85:http Masq 1 0 0 -> 10.244.196.140:http Masq 1 0 0 -> 10.244.196.141:http Masq 1 0 0 -> 10.244.196.142:http Masq 1 0 0 -> 10.244.196.143:http Masq 1 0 0 -> 10.244.196.144:http Masq 1 0 0 -> 10.244.196.145:http Masq 1 0 0 -> 10.244.196.146:http Masq 1 0 0 -> 10.244.196.147:http Masq 1 0 0 -> 10.244.196.148:http Masq 1 0 0 -> 10.244.196.149:http Masq 1 0 0
TCP mast01:31180 rr
TCP mast01:https rr
7. 如果測試業務一切正常,就說明v2版本也滿足需要,接下來就可以停掉v1版本了
kubectl delete -f blue.yaml
kubectl get pods
瀏覽器訪問也只有綠色了,即v2版本
8. 如果運行一段時間v2版本有問題,還可以直接按以上方法回退到v1版本