目標(biāo):
- 使用kubectl做一次滾動(dòng)更新
更新一個(gè)應(yīng)用
用戶期望應(yīng)用一直是可用的,而開發(fā)者期望一天部署多次新版本。
在k8s里,這是通過(guò)滾動(dòng)更新來(lái)實(shí)現(xiàn)的。
Rolling updates允許增量更新新的Pods實(shí)例,部署的更新以零宕機(jī)時(shí)間進(jìn)行。新的Pod將在具有可用資源的節(jié)點(diǎn)上進(jìn)行調(diào)度。、
在之前的單元里,我們伸縮app以達(dá)到運(yùn)行多個(gè)實(shí)例的目的。這是一種不影響應(yīng)用可用的執(zhí)行更新的需求。默認(rèn)情況下,Pod實(shí)例的最大個(gè)數(shù)在更新期間是不可用的,而且可以新創(chuàng)建的新Pod也只能是一個(gè)。無(wú)論P(yáng)od的個(gè)數(shù)和百分比都是可以配置的。在k8s中,更新都是由版本的,而且無(wú)論什么時(shí)候的部署更新都能被回退到之前的(穩(wěn)定)版本。
總結(jié):
- 更新應(yīng)用
滾動(dòng)更新允許部署的更新以零宕機(jī)時(shí)間的增量更新Pod實(shí)例來(lái)完成。
滾動(dòng)更新概覽




與伸縮應(yīng)用類似,如果部署被公開暴露了,服務(wù)將對(duì)流量做負(fù)載均衡到可用的Pod。一個(gè)可用的Pod是一個(gè)用戶可用的應(yīng)用實(shí)例。
滾動(dòng)更新包括以下幾個(gè)步驟:
- 通過(guò)image更新,將應(yīng)用從一個(gè)環(huán)境推廣到另外一個(gè)環(huán)境
- 回滾到之前的版本
- 零宕機(jī)時(shí)間的持續(xù)集成和持續(xù)應(yīng)用分發(fā)
如果一個(gè)部署被公開暴露了出來(lái),更新期間服務(wù)將會(huì)把流量負(fù)載均衡到可用的Pod。
- 通過(guò)kubectl set image更新一個(gè)已部署的應(yīng)用
- 使用kubectl rollout undo回滾到之前的版本
更新app的版本
主要看image字段
kubectl describe pods
都是Image: gcr.io/google-samples/kubernetes-bootcamp:v1
升級(jí)應(yīng)用image到version 2
命令:set image + 部署名 + 新的image版本
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment "kubernetes-bootcamp" image updated
驗(yàn)證更新
檢查正在運(yùn)行的App。我們可以用describe service找出外露IP和端口。
kubectl describe services/kubernetes-bootcamp
設(shè)置NODE_PORT變量
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
NODE_PORT=32427
驗(yàn)證更新
curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7689dc585d-7b2gk | v=2
確認(rèn)更新
kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
查看image版本
kubectl describe pods
Image: jocatalin/kubernetes-bootcamp:v2
回滾更新
升級(jí)deployments/kubernetes-bootcamp到v10
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 5 2 3 17m
kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5569c6b8d6-86248 0/1 ImagePullBackOff 0 4m
kubernetes-bootcamp-5569c6b8d6-8cn6l 0/1 ImagePullBackOff 0 4m
kubernetes-bootcamp-7689dc585d-847df 1/1 Running 0 13m
kubernetes-bootcamp-7689dc585d-vk68v 1/1 Running 0 13m
kubernetes-bootcamp-7689dc585d-x7q9j 1/1 Running 0 13m
回滾到上一個(gè)版本(更新錯(cuò)誤時(shí)使用,比如我們的repo中沒(méi)有v10但卻set了image)
kubectl rollout undo deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp"
此時(shí)再查看部署
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 4m
期待和大家交流,共同進(jìn)步,歡迎大家加入我創(chuàng)建的與前端開發(fā)密切相關(guān)的技術(shù)討論小組:
- SegmentFault技術(shù)圈:ES新規(guī)范語(yǔ)法糖
- SegmentFault專欄:趁你還年輕,做個(gè)優(yōu)秀的前端工程師
- 知乎專欄:趁你還年輕,做個(gè)優(yōu)秀的前端工程師
- Github博客: 趁你還年輕233的個(gè)人博客
- 前端開發(fā)QQ群:660634678
微信公眾號(hào): 人獸鬼 / excellent_developers
努力成為優(yōu)秀前端工程師!
