一、Kubernetes中滾動(dòng)發(fā)布的需求背景
1.1 滾動(dòng)發(fā)布
- Kubernetes及其強(qiáng)大的特點(diǎn)之一就是超大規(guī)模集群應(yīng)用的自動(dòng)化部署,這其中包括了應(yīng)用的擴(kuò)容、縮容及其自適應(yīng)擴(kuò)縮容(HPA、VPA)。
- 在滾動(dòng)發(fā)布的過(guò)程中,Kubernetes會(huì)對(duì)要進(jìn)行升級(jí)的應(yīng)用所屬Pod進(jìn)行逐個(gè)的替換,直至將所有的Pod都替換為新版本的Pod。整個(gè)過(guò)程中新老版本的Pod都處于在線(xiàn)、提供服務(wù)的狀態(tài)。
1.2 滾動(dòng)發(fā)布、藍(lán)綠發(fā)布、金絲雀發(fā)布的區(qū)別
-
藍(lán)綠發(fā)布:藍(lán)綠發(fā)布是存在2個(gè)系統(tǒng),一個(gè)是正在提供服務(wù)的系統(tǒng),標(biāo)記為綠色,一個(gè)是準(zhǔn)備發(fā)布的帶有新功能的系統(tǒng),標(biāo)記為藍(lán)色。藍(lán)色系統(tǒng)用來(lái)做發(fā)布前的測(cè)試,測(cè)試過(guò)程中發(fā)現(xiàn)的任何問(wèn)題都可以直接在藍(lán)色系統(tǒng)上直接更改,不干擾用戶(hù)正在使用的系統(tǒng)。藍(lán)色系統(tǒng)經(jīng)過(guò)充分、有效的測(cè)試、驗(yàn)證后,被證明可以安全上線(xiàn)后,會(huì)將所有的用戶(hù)切到藍(lán)色系統(tǒng)上。
-
金絲雀發(fā)布(灰度發(fā)布):金絲雀發(fā)布是只有一個(gè)系統(tǒng),對(duì)該系統(tǒng)中的應(yīng)用實(shí)例進(jìn)行逐步替換。例如系統(tǒng)中有100個(gè)服務(wù)實(shí)例,我們可以先替換掉其中的10個(gè)實(shí)例,然后系統(tǒng)給這10個(gè)實(shí)例切分流量,通過(guò)一段時(shí)間的線(xiàn)上流量的測(cè)試,如果發(fā)現(xiàn)這10個(gè)實(shí)例在功能及體驗(yàn)上沒(méi)有任何問(wèn)題,那我們繼續(xù)擴(kuò)大新實(shí)例的比例,并給新版本的實(shí)例切分更多的流量,直至全部實(shí)例替換完成。
- 滾動(dòng)發(fā)布:滾動(dòng)發(fā)布只有一個(gè)系統(tǒng),雖然也是逐個(gè)替換掉系統(tǒng)中的服務(wù)實(shí)例,但是新老實(shí)例會(huì)同時(shí)在系統(tǒng)中提供服務(wù),不存在特意的流量切分。不過(guò),在Kubernetes集群中,可以利用標(biāo)簽選擇器實(shí)現(xiàn)金絲雀發(fā)布(灰度發(fā)布)的效果。
二、Kubernetes中實(shí)現(xiàn)滾動(dòng)發(fā)布
2.1 定義Kubernetes中的版本
- 我們常說(shuō)的版本可能就是跟代碼掛鉤,就是代碼或者配置發(fā)生變動(dòng)就產(chǎn)生一個(gè)新的版本,Kubernetes中將在Yaml中對(duì)Pod的定義定義為一個(gè)版本,可參考文章Kubernetes 中 Pod 定義與操作實(shí)踐快速了解Pod定義。
- K8S中版本定義范圍。我們?cè)赑od模版中定義了Pod使用的鏡像及其版本、鏡像拉取策略、環(huán)境變量參數(shù)等。定義Pod的Yaml內(nèi)容的變化都會(huì)產(chǎn)生一個(gè)新的版本。對(duì)Pod的定義不光是通過(guò)創(chuàng)建Pod資源對(duì)象直接創(chuàng)建,我們?cè)贒eployment 資源對(duì)象或者 DaemonSet 資源對(duì)象中的
template
字段中定義的Pod 的變化也會(huì)導(dǎo)致Pod的版本變化。 - 版本號(hào)。Kubernetes中的版本號(hào)一般是對(duì)Deployment 資源對(duì)象或者 DaemonSet 資源對(duì)象中的
template
字段的定義部分進(jìn)行哈希,計(jì)算哈希值,取哈希值作為版本號(hào)。
2.2 創(chuàng)建 Deployment 資源對(duì)象
2.2.1 在 Yaml 中定義 Deployment
資源對(duì)象
Yaml 內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ngx-dep
name: ngx-dep
spec:
minReadySeconds: 20
replicas: 4
selector:
matchLabels:
app: ngx-dep
template:
metadata:
labels:
app: ngx-dep
spec:
containers:
- image: nginx:1.24-alpine
name: nginx
2.2.2 執(zhí)行命令創(chuàng)建 Deployment
資源對(duì)象
在終端窗口中執(zhí)行命令kubectl apply -f ngx-dep-v1.yaml
:
使用kubectl get pod
、 kubectl get deploy
或者 kubectl describe deploy
命令查看創(chuàng)建出的資源對(duì)象的狀態(tài)。
三、Kubernetes中滾動(dòng)發(fā)布的管理
3.1 查看 Deployment 資源對(duì)象對(duì)應(yīng)Pod在滾動(dòng)發(fā)布中的狀態(tài)
3.1.1 查看滾動(dòng)發(fā)布狀態(tài)
執(zhí)行命令 kubectl rollout status deploy ngx-dep
,查看deploy資源名為ngx-dep
的狀態(tài):
終端會(huì)不斷輸出當(dāng)前滾動(dòng)發(fā)布的進(jìn)程狀態(tài),直接滾動(dòng)發(fā)布完成,完成時(shí)該命令結(jié)束會(huì)輸出deployment "xxxxxx" successfully rolled out
的字樣。
3.1.2 查看滾動(dòng)發(fā)布?xì)v史
執(zhí)行命令 kubectl rollout history deploy ngx-dep
,查看 deploy資源名為ngx-dep
的滾動(dòng)發(fā)布記錄:
查到滾動(dòng)發(fā)布記錄之后,我們可以通過(guò)--revision
參數(shù)來(lái)具體指定某個(gè)具體的版本,來(lái)查看該發(fā)布相對(duì)于上一個(gè)版本的變更,例如執(zhí)行 kubectl rollout history deploy --revision=2
:
3.2 版本回退
3.2.1 回滾掉最新的滾動(dòng)發(fā)布
使用 kubectl rollout undo deploy ngx-dep
回滾掉名為 ngx-dep
的 deploy 資源對(duì)象最新的滾動(dòng)發(fā)布:
我們使用kubectl rollout history
命令查看發(fā)布記錄可以看到多出一個(gè)記錄4,因?yàn)榛貪L也會(huì)產(chǎn)生一個(gè)新的發(fā)布記錄。
3.2.2 回滾至指定版本
我們使用kubectl rollout history
命令先看下當(dāng)前有哪些版本可用:
我們使用kubectl rollout history deploy --revision
命令再看下版本3和版本5的內(nèi)容:
可以看到,這2個(gè)版本的差別僅在與所使用的Nginx 鏡像的版本號(hào)不同,現(xiàn)在使用 kubectl rollout history
命令的--to-revision
選項(xiàng)回退到我們指定的版本3(1.24-alpine):
可以看到提示回滾成功了。我們看下當(dāng)前最新版本Pod的NGINX的版本號(hào):
確實(shí)是我們預(yù)期的1.24-alpine
。
3.3 增加版本說(shuō)明
我們需要在Deployment 資源對(duì)象的metadata字段下添加annotations 字段,就可以為查詢(xún)滾動(dòng)發(fā)布記錄的CHANGE-CAUSE
處添加對(duì)應(yīng)說(shuō)明了。此處對(duì)文件 ngx-dep-v3.yaml
進(jìn)行更改如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ngx-dep
name: ngx-dep
annotations:
kubernetes.io/change-cause: 升級(jí)Nginx的版本到1.27
spec:
minReadySeconds: 20
replicas: 4
selector:
matchLabels:
app: ngx-dep
template:
metadata:
labels:
app: ngx-dep
spec:
containers:
- image: nginx:1.27-alpine
name: nginx
然后執(zhí)行kubectl apply -f ngx-dep-v3.yaml
命令進(jìn)行升級(jí)。然后我們使用kubectl rollout history
命令再來(lái)查看版本記錄,可以看到我們記錄的具體的變更原因了。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-820735.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-820735.html
到了這里,關(guān)于【K8S】Kubernetes 中滾動(dòng)發(fā)布由淺入深實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!