軟件世界比以往任什麼時候候都更快。爲了保持競爭力,須要儘快推出新的軟件版本,而不會中斷活躍用戶訪問,影響用戶體驗。愈來愈多企業已將其應用遷移到 Kubernetes。html
在 Kubernetes 中有幾種不一樣的方式發佈應用,因此爲了讓應用在升級期間依然平穩提供服務,選擇一個正確的發佈策略就很是重要了,本篇文章將講解如何在 Kubernetes 使用滾動更新的方式更新鏡像。docker
策略定義爲 RollingUpdate 的 Deployment。滾動更新經過逐個替換實例來逐步部署新版本的應用,直到全部實例都被替換完成爲止,會有新版舊版同時存在的狀況。api
spec: replicas: 4 strategy: type: RollingUpdate rollingUpdate: maxSurge: 0 # 決定了配置中指望的副本數以外,最多容許超出的 pod 實例的數量 maxUnavailable: %25 # 決定了在滾動升級期間,相對於指望副本數可以容許有多少 pod 實例處於不可用狀態
上述更新策略執行結果以下圖所示瀏覽器
imageapp
bebullish/demo:v1 bebullish/demo:v2
deploymentcurl
apiVersion: apps/v1 kind: Deployment metadata: name: demo-dp spec: selector: matchLabels: app: demo replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% template: metadata: labels: app: demo spec: containers: - name: demo image: bebullish/demo:v1 ports: - containerPort: 8080
service測試
apiVersion: v1 kind: Service metadata: name: demo-service spec: selector: app: demo type: LoadBalancer ports: - port: 80 targetPort: 8080 protocol: TCP
將上述 deployment
以及 service
保存爲 yaml 文件,使用 kubectl apply -f
命令建立 yaml 資源,等待建立成功後,使用 kubectl get svc
獲取 EXTERNAL-IP。url
若是使用瀏覽器測試的話,你會發現每次調用都會返回同一個 pod 的名字,那是由於瀏覽器發出的請求包含 keepAlive,因此須要使用 curl 來保證每次發出的請求都是從新建立的。.net
curl -X GET http://${EXTERNAL-IP}
升級以前先執行命令,以便查看鏡像更新過程3d
while true; do curl -X GET http://${EXTERNAL-IP} ; done
更新鏡像
kubectl set image deployment demo-dp demo=bebullish/demo:v2
首先能夠發如今更新過程當中,程序保持一直可用的狀態,在出現了 v2 版本以後,還會出現 v1 版本的日誌,說明在這個期間 v1 和 v2 版本是同時存在的,等到 v2 版本的 pod 所有處於就緒狀態以後,能夠看到全部的請求就都是 v2 版本的了。
使用 docker 官方鏡像須要以 docker.io
開頭
deployment
apiVersion: apps/v1 kind: Deployment metadata: name: demo-dp spec: selector: matchLabels: app: demo replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% template: metadata: labels: app: demo spec: containers: - name: demo image: docker.io/bebullish/demo ports: - containerPort: 8080 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 30 # 延遲 30 秒檢測,以便更好的觀察更新過程 periodSeconds: 5 livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 30 # 延遲 30 秒檢測,以便更好的觀察更新過程 periodSeconds: 5 terminationGracePeriodSeconds: 1 # 處於 Terminating 狀態多久後,強制殺死 pod
階段中選擇 部署(Manifest)
,輸入上述 yaml 文件(主要增長了就緒探針和存活探針),這裏須要把鏡像的版本刪除掉,在須要綁定的製品選擇以前配置的製品。這樣配置以後,每次執行的時候版本是動態傳入的。
選擇應用和部署流程,輸入版本 v1。
等待一小段時間後,就能夠在部署控制檯中看到發佈的資源了。
再次執行發佈,版本輸入 v2。
能夠看到此時 v2 版本的 pod 有一個正在啓動,而 v1 版本的 pod 所有處於就緒狀態。
v2 版本的 pod 有一個已經就緒,同時正在啓動另外一個新的 pod,與此同時 v1 版本的有一個 pod 已經關機了,而另外兩個 pod 仍處於就緒狀態。
v2 版本的 pod 有兩個已經就緒,同時正在啓動最後一個新的 pod,與此同時 v1 版本的有兩個 pod 已經關機了,而另一個 pod 仍處於就緒狀態。
v2 版本的 pod 已經所有處於就緒狀態了,同時 v1 版本的 pod 已經所有關機,至此,一次滾動更新結束。
使用 Kubernetes 原生方式實現滾動更新更加簡單方便,但也容易出錯(人工),推薦使用 coding.net 提供的 CD 功能,配置一次,永久使用。不只能夠直觀的觀察到 pod 更新過程,還提供了很是豐富的 CD 功能,推薦使用哦~
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公衆號,及時獲取更多幹貨!!