您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
軟件世界比以往任何時(shí)候都更快。為了保持競(jìng)爭(zhēng)力,需要盡快推出新的軟件版本,而不會(huì)中斷活躍用戶訪問(wèn),影響用戶體驗(yàn)。越來(lái)越多企業(yè)已將其應(yīng)用遷移到 Kubernetes。
在 Kubernetes 中有幾種不同的方式發(fā)布應(yīng)用,所以為了讓?xiě)?yīng)用在升級(jí)期間依然平穩(wěn)提供服務(wù),選擇一個(gè)正確的發(fā)布策略就非常重要了,小編將講解在 Kubernetes 使用藍(lán)綠更新的方式更新鏡像。
藍(lán)綠發(fā)布是版本 1 與版本 2 會(huì)同時(shí)存在,通過(guò)控制 Service 來(lái)決定使用具體哪一個(gè)版本,也稱為紅黑部署。藍(lán)綠發(fā)布與滾動(dòng)更新不同,版本 2 (綠
) 與版本 1(藍(lán)
)一起部署,在測(cè)試新版本滿足要求后,然后更新 Service 對(duì)象,通過(guò)替換 label selector 中的版本標(biāo)簽來(lái)將流量發(fā)送到新版本,更新過(guò)程如下圖所示
image
bebullish/demo:v1 bebullish/demo:v2
deployment-v1
apiVersion: apps/v1 kind: Deployment metadata: name: demo-dp-v1 spec: selector: matchLabels: app: demo version: v1 replicas: 3 template: metadata: labels: app: demo version: v1 spec: containers: - name: demo image: bebullish/demo:v1 ports: - containerPort: 8080
deployment-v2
apiVersion: apps/v1 kind: Deployment metadata: name: demo-dp-v2 spec: selector: matchLabels: app: demo version: v2 replicas: 3 template: metadata: labels: app: demo version: v2 spec: containers: - name: demo image: bebullish/demo:v2 ports: - containerPort: 8080
service
apiVersion: v1 kind: Service metadata: name: demo-service spec: selector: app: demo version: v1 # 通過(guò)更改 version 來(lái)控制流量走向 type: LoadBalancer ports: - port: 80 targetPort: 8080 protocol: TCP
將上述 deployment-v1
以及 service
保存為 yaml 文件,使用 kubectl apply -f
命令創(chuàng)建 yaml 資源,等待創(chuàng)建成功后,使用 kubectl get svc
獲取 EXTERNAL-IP。
如果使用瀏覽器測(cè)試的話,你會(huì)發(fā)現(xiàn)每次調(diào)用都會(huì)返回同一個(gè) pod 的名字,那是因?yàn)闉g覽器發(fā)出的請(qǐng)求包含 keepAlive,所以需要使用 curl 來(lái)保證每次發(fā)出的請(qǐng)求都是重新創(chuàng)建的。
curl -X GET http://${EXTERNAL-IP}
將上述 deployment-v2
保存為 yaml 文件,使用 kubectl apply -f
命令創(chuàng)建 yaml 資源,切換流量之前先執(zhí)行命令,以便查看鏡像更新過(guò)程
while true; do curl -X GET http://${EXTERNAL-IP} ; done
等待 deployment-v2
創(chuàng)建成功后,通過(guò)將 service 的 version 值改為 v2 來(lái)切換流量
kubectl edit service demo-service
首先可以發(fā)現(xiàn)在更新過(guò)程中,程序保持一直可用的狀態(tài),v2 版本部署成功之后,所有請(qǐng)求還是 v1 版本,當(dāng)流量切換后,立刻出現(xiàn) v2 版本的日志,并且不會(huì)出現(xiàn) v1 版本的日志,說(shuō)明流量是一次性切換的,如果需要回滾只需要將流量切回 v1 版本即可。
service
apiVersion: v1 kind: Service metadata: name: demo-service spec: selector: createBy: demo-service # 這里填寫(xiě)的標(biāo)簽,會(huì)被添加到對(duì)應(yīng)的 ReplicaSet 中 type: LoadBalancer ports: - port: 80 targetPort: 8080 protocol: TCP
這里注意,service 創(chuàng)建之后應(yīng)不會(huì)匹配到任何資源,即 endpoint 為空,而在后面執(zhí)行部署流程時(shí)會(huì)為 ReplicaSet 添加 label createBy: demo-service
,從而決定流量走向。
部署成功之后可以看到 demo-service
使用 docker 官方鏡像需要以 docker.io
開(kāi)頭
replicaSet
apiVersion: apps/v1 kind: ReplicaSet metadata: name: demo-rs spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - image: docker.io/bebullish/demo name: demo ports: - containerPort: 8080
階段中選擇 部署(Manifest)
,輸入上述 yaml 文件(目前發(fā)布策略選項(xiàng)僅支持 ReplicaSet),這里需要把鏡像的版本刪除掉,在需要綁定的制品選擇之前配置的制品。這樣配置之后,每次執(zhí)行的時(shí)候版本是動(dòng)態(tài)傳入的。
在下方勾選讓 CODING 部署控制臺(tái)管理入口流量,然后選擇 demo-service
所在的命名空間(我這里是在 marlon
這個(gè)命名空間下),然后選擇 demo-service
,策略選擇 Red/Black(Blue/Green),保存即可。
選擇應(yīng)用和部署流程,輸入版本 v1。
等待一小段時(shí)間后,就可以在部署控制臺(tái)中看到發(fā)布的資源了。
再次執(zhí)行發(fā)布,版本輸入 v2。
基于 CODING CD 的藍(lán)綠發(fā)布和一般的藍(lán)綠發(fā)布略有不同,一旦 v2 版本的 pod 處于就緒狀態(tài)后,他就會(huì)立即獲得流量,而當(dāng)所有的 v2 版本的 pod 處于就緒狀態(tài)后,會(huì)禁用 v1 版本的 pod,此時(shí)所有流量會(huì)打到 v2 版本上,從而完成更新。
注意:基于 CODING CD 的藍(lán)綠發(fā)布會(huì)出現(xiàn) v1 版本和 v2 版本同時(shí)獲得流量的情況,具體取決于 pod 的就緒探針,v2 版本的 pod 一旦就緒,那么它就會(huì)獲得流量,所以需要合理設(shè)計(jì)就緒探針,盡量減少 v1 版本和 v2 版本同時(shí)存在的時(shí)間差。
上述就是小編為大家分享的基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。