K8S Deployments 使用 & 更新 & 回滾 & 擴(kuò)容
K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一級(jí)的抽象,也具備更豐富的功能。Deployment對(duì)象不僅創(chuàng)建pod,還確保集群中始終運(yùn)行正確數(shù)量的pod,處理可伸縮性,并持續(xù)處理pod的更新。所有這些活動(dòng)都可以通過部署YAML中的字段進(jìn)行配置。下面接下來就開始K8S Deployment的學(xué)習(xí)之旅吧。
Deployment 應(yīng)用場(chǎng)景
以下是K8S Deployment典型的應(yīng)用場(chǎng)景
- 創(chuàng)建Deployment展示ReplicaSet - ReplicaSet在后臺(tái)自動(dòng)創(chuàng)建Pod,所以Deployment也會(huì)自動(dòng)創(chuàng)建Pod,并檢查Pod是否創(chuàng)建成功
- 使用Deployment配置文件申明Pods狀態(tài) - Deployment管理Pods并將其遷移到新的ReplicaSet, 每個(gè)新的ReplicaSet都會(huì)更新Deployment版本信息
- 更新Deployment - 如新版本Deployment狀態(tài)不穩(wěn)定,支持回滾到之前的版本,每次回滾都會(huì)更新Deployment版本信息
- Deployment支持?jǐn)U容,以支持更多的負(fù)載
- 暫停/恢復(fù)更新Deployment - 當(dāng)更新需要修改多處配置信息時(shí),暫停更新,等待修改完畢,再恢復(fù)更新Deployment
Deployment Example
演示環(huán)境
-
OS 信息
-
minikube 版本信息
-
Kubectl 版本
-
Dokcer 版本
-
啟動(dòng)minikube
minikube start --driver=docker
配置文件
# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
配置說明:
- 根據(jù)**.metadata.name**字段配置值 ,創(chuàng)建名為 nginx-deployment的Deployment對(duì)象,該名稱將作為ReplicaSet、Pod的前綴自動(dòng)闖將這兩種類型的對(duì)象
- Deployment根據(jù)**.spec.replicas**自動(dòng)創(chuàng)建ReplicaSet對(duì)象,并創(chuàng)建3個(gè)副本Pod
- .spec.selector字段定義ReplicaSet如何匹配Pod,需要跟template.labels.app一致
-
template模板字段包含以下信息
- 使用 .metadata.labels.app - 字段標(biāo)記Pod
- spec字段指示Pod運(yùn)行的容器(名稱為nginx) ,以及容器鏡像
- port容器端口
創(chuàng)建Deployment
kubectl apply -f nginx-deployment.yaml
運(yùn)行狀態(tài)
-
查看Deployment運(yùn)行狀態(tài)
# 創(chuàng)建成功后 使用以下命令查看deployment運(yùn)行狀態(tài) kubectl get deployments | grep nginx-deployment
如圖片所示,自動(dòng)創(chuàng)建了名為nginx-deployment 的 Deployments集群,副本數(shù)為3,上述中每個(gè)字段的含義如下
- NAME - 列出默認(rèn)命名空間集群中Deployment的名稱
- READY - 顯示應(yīng)用程序副本的數(shù)量
- UP-TO-DATE - 顯示已經(jīng)達(dá)到期望狀態(tài)的副本數(shù)量
- AVAILABLE - 顯示集群中應(yīng)用程序可用的副本數(shù)量,正常情況下應(yīng)該跟期望值一致,Pod在創(chuàng)建過程中可能會(huì)少于期望值
- AGE - 顯示應(yīng)用程序運(yùn)行時(shí)長(zhǎng)
-
使用rollout命令 查看Deployment創(chuàng)建狀態(tài)
kubectl rollout status deployment/nginx-deployment
-
查看Deployment自動(dòng)創(chuàng)建的ReplicSet 信息
kubectl get rs | grep nginx
注意:ReplicSet對(duì)象的名稱前綴跟Deployment定義中的一致
-
查看Deployment底層的Pod信息
kubectl get pods --show-labels | grep nginx-deployment
請(qǐng)注意,Pod后面攜帶的Hash值 - 7fb96c846b跟Deployment對(duì)應(yīng)ReplicaSet對(duì)象的Hash值一致,他們之間由此產(chǎn)生關(guān)聯(lián)。
更新 Deployment
僅當(dāng)Deployment配置文件中的Pod模板(.spec.template)更改時(shí),才會(huì)觸發(fā)Deployment更新操作。例如Pod模板中的鏡像文件更改,觸發(fā)Deployment更新。
更新鏡像版本
-
將之前nginx的鏡像版本從 nginx:1.14.2 升級(jí)到 nginx:1.16.1
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
此外還可以使用以下命令升級(jí)Deployment
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
另外還可以使用以下命令,直接修改Deployment
找到鏡像版本信息的位置,修改為更高級(jí)的版本進(jìn)行更新Deployment,修改完畢之后,shell控制臺(tái)輸出如下
deployment.apps/nginx-deployment edited
更新過程
kubectl describe deploy nginx-deployment
使用以上命令,查看Deployment對(duì)象的詳細(xì)創(chuàng)建過程
仔細(xì)查看Events信息,可以分析出Deployment 創(chuàng)建過程
- 第一次直接創(chuàng)建了3個(gè)副本的ReplicaSet
- 更新Deployment時(shí),啟動(dòng)一個(gè)新的ReplicaSet
- 將舊ReplicaSet的三個(gè)副本減掉一個(gè) 對(duì)應(yīng) to 2 from 3
- 更新操作啟動(dòng)第二個(gè)ReplicaSet副本,此時(shí)新版本ReplicaSet變成2 to 2 from 1
- 將舊ReplicaSet的存活的2個(gè)副本減掉一個(gè) 對(duì)應(yīng) to 1 from 2
- 更新操作啟動(dòng)第三個(gè)ReplicaSet副本,此時(shí)新版本ReplicaSet變成2 to 3 from 2
- 將舊ReplicaSet的存活的1個(gè)副本減掉一個(gè) 對(duì)應(yīng) to 0 from 1
由此可知,更新Deployment對(duì)象會(huì)啟動(dòng)新的ReplicaSet,等待啟動(dòng)完成后,會(huì)自動(dòng)停用舊版本的ReplicaSet。在升級(jí)過程中采用先啟動(dòng)后停用的方式,能夠始終保持ReplicaSet期望的副本數(shù)。
更新策略
默認(rèn)情況下,K8S會(huì)保留10個(gè)舊ReplicaSet版本,以方便回滾。超過10個(gè)以上的ReplicaSet將會(huì)被系統(tǒng)回收??梢允褂胹pec.revisionHistoryLimit設(shè)置保留ReplicaSet的個(gè)數(shù),設(shè)置為0時(shí),不保留歷史記錄。
.spec.strategy.type參數(shù)設(shè)置會(huì)影響Deployment的更新機(jī)制
- Recreate - 先刪除舊的Pod,再創(chuàng)建新的Pod
- RollingUpdate - 滾動(dòng)更新,默認(rèn)值,可以通過指定 maxUnavailable 、maxSurge來控制更新過程
- .spec.strategy.rollingUpdate.maxUnavailable 指定回滾更新時(shí),最大不可用的Pod數(shù)量,默認(rèn)25%,簡(jiǎn)單理解為一部分更新
- .spec.strategy.rollingUpdate.maxSurge 可以超過期望值的最大Pod數(shù),可選字段,默認(rèn)為25%
.spec.minReadySeconds 可選參數(shù),指定新建的Pod在沒有任何容器崩潰情況下視為就緒- Ready狀態(tài)的最小時(shí)間,單位為秒,默認(rèn)為0,即一旦創(chuàng)建Pod,則被視為可用
回滾Deployment
當(dāng)部署不穩(wěn)定、新版本發(fā)布失敗時(shí),用戶可能需要回滾Deployment,繼續(xù)使用舊版本Deployment提供服務(wù)。默認(rèn)情況下所有回滾信息都會(huì)保存在系統(tǒng)中,目的是方便隨時(shí)回滾.
當(dāng)且僅當(dāng)Deployment關(guān)聯(lián)的Pod對(duì)象 (.spec.template) 發(fā)生變化時(shí),Deployment才會(huì)創(chuàng)建新的版本信息。其他操作,如擴(kuò)容伸縮操作并不會(huì)更新版本信息。因此也就意味著,回滾操作只需要回滾Deployment對(duì)象關(guān)聯(lián)的Pod即可。
更新失敗
- 假設(shè)您需要將nginx的版本從nginx:1.16.1回滾到nginx:1.161,可以使用如下命令進(jìn)行回滾
kubectl set image deployment/nginx-deployment nginx=nginx:1.161
- 驗(yàn)證更新狀態(tài)
kubectl rollout status deployment/nginx-deployment
如圖片所示,此次更新失敗。
- 檢查ReplicaSet更新狀態(tài)
kubectl get rs
新版本的ReplicaSet對(duì)象創(chuàng)建失敗。
- 檢查Pod狀態(tài)
kubectl get pods
如圖片所示,Pod啟動(dòng)失敗的原因是鏡像拉取失敗(由于不存在對(duì)應(yīng)版本鏡像)。
系統(tǒng)回滾
- 首先檢查回滾版本信息
kubectl rollout history deployment/nginx-deployment
我們更新了三次,最后一個(gè)是失敗的。
- 查看回滾版本詳細(xì)信息
kubectl rollout history deployment/nginx-deployment --revision=2
- 回滾到上一個(gè)版本
kubectl rollout undo deployment/nginx-deployment
- 回滾到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
- 檢查Deployment信息
kubectl describe deployment nginx-deployment
如上圖所示,Deployment中的鏡像版本變成了最初的1.14.2,至此回滾成功。
擴(kuò)容Deployment
手動(dòng)擴(kuò)容
當(dāng)公司業(yè)務(wù)流程變大,需要更多的節(jié)點(diǎn)來處理新增的流量,此時(shí)需要將系統(tǒng)進(jìn)行擴(kuò)容。K8S Deployment擴(kuò)容的方式非常簡(jiǎn)單,只需要使用以下命令即可進(jìn)行擴(kuò)容
kubectl scale deployment/nginx-deployment --replicas=10
擴(kuò)容成功后,檢查下Deployment的副本數(shù)量
kubectl get deploy
文章來源:http://www.zghlxwxcb.cn/news/detail-445143.html
自動(dòng)擴(kuò)容
Deployment 還支持根據(jù)服務(wù)器運(yùn)行情況進(jìn)行擴(kuò)容文章來源地址http://www.zghlxwxcb.cn/news/detail-445143.html
# 當(dāng)cpu超過80%的時(shí)候,進(jìn)行擴(kuò)容,副本數(shù)量最低10個(gè),最高不超過15個(gè)
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
到了這里,關(guān)于K8S Deployment 使用 & 更新 & 回滾 & 擴(kuò)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!