CKA考生注意:這些Deployment要點(diǎn)能助你一臂之力!
一、什么是Deployment
在Kubernetes中,Deployment是一種API對象,用于定義和管理Pod的部署方式。它提供了一種聲明性的方法,允許您描述應(yīng)用程序的期望狀態(tài),而不必關(guān)心具體的部署細(xì)節(jié)。Deployment的主要目標(biāo)是確保所定義的Pod副本數(shù)一直運(yùn)行在集群中,并支持滾動更新和回滾操作。以下是Deployment的關(guān)鍵特性和功能:
- 聲明式配置: 使用Deployment,您可以通過YAML文件描述應(yīng)用程序的期望狀態(tài),包括Pod的數(shù)量、所使用的鏡像、端口等。
- 自動化的滾動更新: 當(dāng)您需要更新應(yīng)用程序時,可以通過修改Deployment的配置來實(shí)現(xiàn)。Deployment將負(fù)責(zé)逐步更新Pod,確保在整個過程中保持應(yīng)用程序的可用性。
- 副本集管理: Deployment使用副本集(ReplicaSet)來確保指定數(shù)量的Pod實(shí)例一直運(yùn)行。如果有Pod失敗或被刪除,Deployment會啟動新的Pod來替代它們。
- 滾動回滾: 如果在更新中發(fā)現(xiàn)問題,您可以輕松地執(zhí)行回滾操作,將Deployment回退到之前的版本,從而恢復(fù)到穩(wěn)定狀態(tài)。
- 自動修復(fù): Deployment會自動監(jiān)測Pod的運(yùn)行狀況,并在出現(xiàn)故障時嘗試自動修復(fù)。如果Pod失敗,Deployment將啟動新的Pod,以確保所需數(shù)量的副本一直在運(yùn)行。
二、Deployment基本使用
1.創(chuàng)建Deployment
創(chuàng)建Deployment資源有兩種方式,一種是書寫資源清單方式,一種是通過kubectl命令行的方式創(chuàng)建。下面的 yaml 文件定義了一個 Deployment,該 Deployment 將創(chuàng)建一個有 3 個 nginx Pod 副本的 ReplicaSet(副本集):
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.7.9
ports:
-containerPort:80
在這個例子中:
(1) 將創(chuàng)建一個名為 nginx-deployment 的 Deployment(部署),名稱由.metadata.name字段指定
(2) 該 Deployment 將創(chuàng)建 3 個 Pod 副本,副本數(shù)量由 .spec.replicas 字段指定
(3) .spec.selector 字段指定了 Deployment 如何找到由它管理的 Pod。此案例中,我們使用了 Pod template 中定義的一個標(biāo)簽(app: nginx)。對于極少數(shù)的情況,這個字段也可以定義更加復(fù)雜的規(guī)則
(4) .template 字段包含了如下字段:
- .template.metadata.labels 字段,指定了 Pod 的標(biāo)簽(app: nginx)
- .template.spec.containers[].image 字段,表明該 Pod 運(yùn)行一個容器 nginx:1.7.9
- .template.spec.containers[].name 字段,表明該容器的名字是 nginx執(zhí)行命令以創(chuàng)建 Deployment執(zhí)行命令以創(chuàng)建 Deployment
執(zhí)行命令以創(chuàng)建 Deployment:
kubectl apply -f nginx-deployment.yaml
或者通過下面的命令創(chuàng)建:
kubectl create deploy nginx-deployment --image=nginx:1.7.9 --port=80 --replicas=3
創(chuàng)建成功,可以通過下面的命令查詢:
controlplane $ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 10s
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-867765c857-24rdz 1/1 Running 0 54s
nginx-deployment-867765c857-6r86m 1/1 Running 0 54s
nginx-deployment-867765c857-xj7c5 1/1 Running 0 54s
2.Deploy擴(kuò)容
通過修改 Deployment 的 spec.replicas 字段來指定期望的副本數(shù)。例如,現(xiàn)在需要把上述的nginx-deployment的副本數(shù)修改5??梢酝ㄟ^kubect edit deploy nginx-deployment進(jìn)行修改。
把spec.replicas從原來的3修改成5。保存退出編輯。然后通過如下命令查看,nginx-deployment就成功的從3個副本數(shù)變成了5個。
controlplane $ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 5/5 5 5 5m17s
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-867765c857-24rdz 1/1 Running 0 6m13s
nginx-deployment-867765c857-6r86m 1/1 Running 0 6m13s
nginx-deployment-867765c857-vfr55 1/1 Running 0 62s
nginx-deployment-867765c857-vrj4f 1/1 Running 0 62s
nginx-deployment-867765c857-xj7c5 1/1 Running 0 6m13s
或者也可通過下面的命令進(jìn)行擴(kuò)容:
controlplane $ kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
3.滾動更新
(1) 滾動更新介紹
滾動更新是一種自動化程度較高的發(fā)布方式,用戶體驗(yàn)比較平滑,是目前成熟型技術(shù)組織所采用的主流發(fā)布方式,一次滾動發(fā)布一般由若干個發(fā)布批次組成,每批的數(shù)量一般是可以配置的(可以通過發(fā)布模板定義),例如第一批1臺,第二批10%,第三批50%,第四批100%。每個批次之間留觀察間隔,通過手工驗(yàn)證或監(jiān)控反饋確保沒有問題再發(fā)下一批次,所以總體上滾動式發(fā)布過程是比較緩慢的。
(2) 查看控制器策略
可以通過kubectl explain deploy.spec.strategy查看控制器策略。如下圖:
(3) deploy更新方式
- 支持兩種更新,Recreate和RollingUpdate
- Recreate是重建式更新,刪除一個更新一個
RollingUpdate 滾動更新,定義滾動更新的更新方式的,也就是pod能多幾個,少幾個,控制更新力度的。
①RollingUpdate
通過kubectl explain deploy.spec.strategy.RollingUpdate查看滾動更新幫助文檔。如下圖:
maxSurge(最大擴(kuò)展的值)和maxUnavailable(最大不可用)用來控制滾動更新的策略,取值范圍分為數(shù)值和百分比。
先來看百分比:
- maxUnavailable: [0%, 100%] 向下取整,比如10個副本,5%的話==0.5個,但計算按照0個
- maxSurge: [0%, 100%] 向上取整,比如10個副本,5%的話==0.5個,但計算按照1個
再來看數(shù)值:
- maxUnavailable: [0, 副本數(shù)]
- maxSurge: [0, 副本數(shù)]
②Recreate
把deploy更新策略變成Recreate:
apiVersion:apps/v1
kind:Deployment
metadata:
name:nginx-deployment
labels:
app:nginx
spec:
replicas:3
strategy:
type:Recreate
...省略...
通過以下命令更新:
kubectl apply -f deploy-demo1.yaml
#另一個窗口實(shí)時監(jiān)控
kubectl get pods -w
輸出的結(jié)果如下:
詳細(xì)deployment的使用可以參考如下:
- 介紹 Deployment[1]
- Deployments[2]
三、CKA真題
1.真題截圖
2.中文解析
切換 k8s 集群環(huán)境:kubectl config use-context k8s
Task:
將loadbalancer 的 deployment 管理的 Pod 的副本數(shù)擴(kuò)容成 6 個。
3.參考文檔
Deployments[3]
4.解題作答
切換集群環(huán)境:
kubectl config use-context k8s
檢查現(xiàn)有的Pod數(shù)量:
kubectl get deploy loadbalancer -o wide
擴(kuò)容loadbalancer 的 deployment 管理的 Pod 的副本數(shù)擴(kuò)容成 6 個:
kubelct scale deploy loadbalancer --replicas=6
檢查Pod的數(shù)量:
kubectl get pod
參考資料:
- [1]介紹 Deployment: https://www.kuboard.cn/learning/k8s-intermediate/workload/wl-deployment/
- [2]Deployments: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
- [3]Deployments: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/