一、常見的部署方案
- 滾動更新
-
- 服務不會停止,但是整個pod會有新舊並存的情況。
- 重新建立
-
- 先停止舊的pod,然後再建立新的pod,這個過程服務是會間斷的。
- 藍綠 (無需停機,風險較小)
- 部署v1的應用(一開始的狀態)所有外部請求的流量都打到這個版本上
- 部署版本2的應用版本2的程式碼與版本1不同(新功能、Bug修復等)
-
將流量從版本1切換到版本2。
-
如版本2測試正常,就刪除版本1正在使用的資源(例如例項),從此正式用版本2。
-
金絲雀
1.1 、滾動更新
- maxSurge :滾動升級時先啟動的pod數量
- maxUnavailable :滾動升級時允許的最大unavailable的pod數量
apiVersion: apps/v1 kind: Deployment metadata: name: rollingupdate spec: strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate selector: matchLabels: app: rollingupdate replicas: 4 template: metadata: labels: app: rollingupdate spec: containers: - name: rollingupdate image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: rollingupdate spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: rollingupdate type: ClusterIP
(2)執行指令碼
kubectl apply -f rollingupdate.yaml
(3)檢視pods
kubectl get pods
(4) 檢視svc
kubectl get svc
(5) 上面成功後就可以直接通過ip進行訪問pod對應的服務的
curl cluster-ip/dockerfile
(6) 前面如果都成功了,那下面要做的事就是實現滾動更新動作了,先修改rollingupdate.yaml檔案,將映象修改成v2.0 然後儲存檔案
(7)在w1上,不斷地訪問觀察輸出
while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done
(8)在w2上,監控pod
kubectl get pods -w
(7)執行apply操作讓檔案重新生效變成2.0版本
kubectl apply -f rollingupdate.yaml
(8)執行下面命令會發現有新老版本的替換的過程
kubectl get pods
1.2、 重新建立
apiVersion: apps/v1 kind: Deployment metadata: name: recreate spec: strategy: type: Recreate selector: matchLabels: app: recreate replicas: 4 template: metadata: labels: app: recreate spec: containers: - name: recreate image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0 ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 8080
(2)執行指令碼
kubectl apply -f rollingupdate.yaml
(3)檢視pods
kubectl get pods
(4)和前面一樣修改recreate.yaml檔案的版本號
kubectl apply -f recreate.yaml
(5)檢視pod
kubectl get pods
(6)執行apply操作讓檔案重新生效變成2.0版本
kubectl apply -f rollingupdate.yaml
(7)執行下面命令會發現老版本停止後再啟動新版本
kubectl get pods
1.3 、藍綠
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: blue spec: strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate selector: matchLabels: app: bluegreen replicas: 4 template: metadata: labels: app: bluegreen version: v1.0 spec: containers: - name: bluegreen image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v1.0 ports: - containerPort: 8080
(2)執行指令碼
kubectl apply -f bluegreen.yaml
(3)檢視pods
kubectl get pods
apiVersion: v1 kind: Service metadata: name: bluegreen spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: bluegreen version: v1.0 type: ClusterIP
(5)重新啟動指令碼
kubectl apply -f bluegreen-service.yaml
(6)檢視svc
kubectl get svc
(7)在w1上不斷訪問觀察
while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done
(8)接下來就是要做將1.0版本升級到2.0版本了修改bluegreen.yaml,修改的內容我標記不同顏色
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: green spec: strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate selector: matchLabels: app: bluegreen replicas: 4 template: metadata: labels: app: bluegreen version: v2.0 spec: containers: - name: bluegreen image: registry.cn-hangzhou.aliyuncs.com/ghy/test-docker-image:v2.0 ports: - containerPort: 8080
(9)重新啟動指令碼
kubectl apply -f bluegreen.yaml
(10)檢視pod
kubectl get pods
(11)同時觀察剛才訪問的地址有沒有變化,可以發現,兩個版本就共存了,並且之前訪問的地址沒有變化,那怎麼切換版本呢,前面不是寫了個bluegreen-service.yaml檔案嗎,很簡單,修改bluegreen-service.yaml檔案的指向就行,修改後的bluegreen-service.yaml檔案如下
apiVersion: v1 kind: Service metadata: name: bluegreen spec: ports: - port: 80 protocol: TCP targetPort: 8080
#也就是把流量切到了2.0版本中 selector: app: bluegreen version: v2.0 type: ClusterIP
(12)重啟下bluegreen-service.yaml檔案
kubectl apply -f bluegreen-service.yaml
(13)重新檢視svc
kubectl get svc
(14)同時觀察剛才訪問的地址有沒有變化,發現流量已經完全切到了v2.0的版本上
1.4、金絲雀
前面三種介紹完了,接下來說一種開發中常用的一種部署方式,在有些場景中,如果我們希望多版本共存,那部署怎麼搞呢,方法就是接下來要說明的
(1)其實很簡單,只用在我們1.3中的藍綠部署中做一些小小的改變就好。修改下bluegreen-service.yaml檔案,改動如下
apiVersion: v1 kind: Service metadata: name: bluegreen spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: bluegreen version: v2.0 #把veersion刪除掉只根據bluegreen進行選擇 type: ClusterIP
(2)重啟下bluegreen-service.yaml檔案
kubectl apply -f bluegreen-service.yaml
(3)同時觀察剛才訪問的地址有沒有變化,istio中就更方便咯,此時新舊版本能夠同時被訪問到,AB測試,新功能部署少一些的例項