溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

發(fā)布時(shí)間:2021-11-24 15:03:53 來(lái)源:億速云 閱讀:98 作者:柒染 欄目:云計(jì)算

這期內(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ò)程如下圖所示

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

實(shí)踐

使用 Kubernetes 原生方式升級(jí)應(yīng)用

準(zhǔn)備

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è)試

如果使用瀏覽器測(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}

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

升級(jí)

將上述 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
查看日志

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

請(qǐng)求流量

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

結(jié)論

首先可以發(fā)現(xiàn)在更新過(guò)程中,程序保持一直可用的狀態(tài),v2 版本部署成功之后,所有請(qǐng)求還是 v1 版本,當(dāng)流量切換后,立刻出現(xiàn) v2 版本的日志,并且不會(huì)出現(xiàn) v1 版本的日志,說(shuō)明流量是一次性切換的,如果需要回滾只需要將流量切回 v1 版本即可。

使用 CODING CD 方式升級(jí)應(yīng)用

創(chuàng)建服務(wù)

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

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 ,從而決定流量走向。

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

部署成功之后可以看到 demo-service

配置制品

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

使用 docker 官方鏡像需要以 docker.io 開(kāi)頭

配置 yaml 及綁定制品

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

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)傳入的。

藍(lán)綠(紅黑)發(fā)布配置

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

在下方勾選讓 CODING 部署控制臺(tái)管理入口流量,然后選擇 demo-service 所在的命名空間(我這里是在 marlon 這個(gè)命名空間下),然后選擇 demo-service ,策略選擇 Red/Black(Blue/Green),保存即可。

發(fā)布制品

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

選擇應(yīng)用和部署流程,輸入版本 v1。

查看結(jié)果

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

等待一小段時(shí)間后,就可以在部署控制臺(tái)中看到發(fā)布的資源了。

更新鏡像版本

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

再次執(zhí)行發(fā)布,版本輸入 v2。

更新原理

基于Kubernetes如何實(shí)現(xiàn)藍(lán)綠發(fā)布

基于 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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI