kubernetes(七)项目部署方式:蓝绿部署,灰度发布/金丝雀发布,滚动更新
在項目迭代的過程中,不可避免需要上線進行部署。
目前項目部署的方式有很多種:像重新部署,藍綠部署,金絲雀部署(灰度部署),滾動更新。本文簡單介紹下這些常見的部署方案以及使用k8s怎么進行對應(yīng)部署
重新部署
定義:先停止舊服務(wù),然后啟動新服務(wù),這是最簡單的一種部署方式
缺點:在整個過程中會出現(xiàn)一段時間的服務(wù)不可用
先準備兩個自己的鏡像,訪問接口為/dockerfile,返回的數(shù)據(jù)不一樣:
registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0? 返回hello,docker
registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v3.0? 返回hello,k8s <br/>
詳細步驟參考這篇docker學習筆記(二)創(chuàng)建自己的鏡像
#recreate.yaml apiVersion: apps/v1 kind: Deployment metadata:name: recreate spec:strategy:type: Recreateselector:matchLabels:app: recreatereplicas: 4template:metadata:labels:app: recreatespec:containers:- name: recreateimage: registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0ports:- containerPort: 8080livenessProbe:tcpSocket:port: 8080修改yaml里的鏡像版本為v3.0,再次執(zhí)行apply -f?
通過對pod狀態(tài)的持續(xù)觀察可以發(fā)現(xiàn)k8s是先停止舊的,然后再創(chuàng)建新的pod
藍綠部署
定義:藍綠部署就是不停止舊版本,直接部署新版本然后進行測試,測試驗證OK后,將流量全部切換到新版本,同時將舊版本也升級到新版本(或者可以將舊版本直接停掉)
優(yōu)點: 無需停機,風險較小
缺點: 切換是全量的,如果版本2有問題,則對用戶體驗有直接影響,?需要雙倍機器資源。
部署過程:
修改bluegreen.yaml
deployment-name: blue ???---> ?? green
image: v2.0---> ??v3.0
version: v2.0 ???---> ?? v3.0
查看Pod可以發(fā)現(xiàn)兩個一開始green,blue 兩種pod共存(一共有八個pod),訪問之前的ClusterIP地址,返回結(jié)果沒有變化
修改service的內(nèi)容(把流量切到3.0的版本中)
version: v2.0? --->? v3.0
訪問之前的地址?發(fā)現(xiàn)流量已經(jīng)完全切到了v3.0的版本上
金絲雀部署(灰度部署)
定義 :?灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。
AB Test就是一種灰度發(fā)布方式,讓部分用戶繼續(xù)使用A版本,一部分用戶開始用B版本,如果用戶對新版本沒有什么意見反饋,那么逐步擴大范圍,把所有用戶都遷移到新版本上面來(A/B Test主要是用來測試應(yīng)用功能表現(xiàn),例如可用性、受歡迎程度、可見性等)。
灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度,而我們平常所說的金絲雀部署就是灰度發(fā)布的一種方式。
部署過程:
優(yōu)點: 用戶體驗影響小,灰度發(fā)布過程出現(xiàn)問題只影響部分用戶。
具體步驟跟上述差不多,只不過上面的service在切換的時候直接根據(jù)版本來切換,所以流量會全部切換過去,想要實現(xiàn)灰度部署的結(jié)果只需要把service的selector里的version標簽去掉就好(兩個版本的app標簽都是一樣的,鏡像不一樣,但是不影響service篩選需要負載的pod)
可以按照各自版本的設(shè)置不同的replicas,流量會按照比例進行分配
持續(xù)訪問service,可以看到請求被分發(fā)到不同的版本(如果不想增加pod數(shù)量,可以修改下每個版本pod的replicas數(shù)目)
滾動更新
定義:一般是取出一個或者多個服務(wù)器停止服務(wù),更新版本后重新將其投入使用。周而復(fù)始,直到集群中所有的實例都更新成新版本。
這種部署方式相對于藍綠部署,更加節(jié)約資源——它不需要運行兩個集群、兩倍的實例數(shù)。我們可以部分部署,例如每次只取出集群的25%進行升級。
apiVersion: apps/v1 kind: Deployment metadata:name: rollingupdate spec:strategy:rollingUpdate:maxSurge: 25% #滾動升級時先啟動的pod數(shù)量maxUnavailable: 25% #滾動升級時允許的最大unavailable的pod數(shù)量type: RollingUpdateselector:matchLabels:app: rollingupdatereplicas: 4template:metadata:labels:app: rollingupdatespec:containers:- name: rollingupdateimage: registry.cn-shenzhen.aliyuncs.com/chenpp/springboot-image:v2.0ports:- containerPort: 8080 --- apiVersion: v1 kind: Service metadata:name: rollingupdate spec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: rollingupdatetype: ClusterIP在worder1上,不斷地訪問觀察輸出結(jié)果
while sleep 0.2;do curl 10.102.115.66/dockerfile;echo "";done
在master上,監(jiān)控pod kubectl get pods -w?
修改yaml中image的版本為v3.0,滾動更新
整個部署過程中Service不會停止,但是會有新舊pod并存的情況。
?
參考文章:https://www.v2ex.com/t/344341
?
總結(jié)
以上是生活随笔為你收集整理的kubernetes(七)项目部署方式:蓝绿部署,灰度发布/金丝雀发布,滚动更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubernetes(八)问题排查
- 下一篇: docker,k8s学习笔记汇总