Kubernetes(15):Pod控制器ReplicaSet和Deployment详解
文章目錄
- 前言
- 第一節(jié) Pod控制器
- 第二節(jié) ReplicaSet(RS)
- 1. 概念和資源清單
- 2. 創(chuàng)建ReplicaSet
- 3. 擴(kuò)縮容
- 3.1 方法一:直接編輯rs
- 3.2方法二 :命令擴(kuò)縮容
- 4. 鏡像升級(jí)/降級(jí)
- 4.1 方法一: 直接編輯rs
- 4.2 方法二 :命令升級(jí)
- 5. 刪除ReplicaSet
- 5.1 命令刪除
- 5.2 非級(jí)聯(lián)刪除
- 5.3 yaml刪除
- 第三節(jié) Deployment(Deploy)
- 1. 概念和資源清單
- 2. 創(chuàng)建Deployment
- 2. 擴(kuò)縮容
- 2.1 方法一: 命令方式
- 2.2 方法二 : 直接編輯rs
- 3. 升級(jí)策略
- 3.1 重建更新
- 3.2 滾動(dòng)更新
- 4. 版本回退
- 5. 金絲雀發(fā)布
- 6. 終止金絲雀發(fā)布
前言
pod控制器
第一節(jié) Pod控制器
在kubernetes中,按照pod的創(chuàng)建方式可以將其分為兩類
- 自主式pod: kubernetes直接創(chuàng)建出來的pod,這種pod刪除后就沒有了,也不會(huì)重建.
- 控制器創(chuàng)建的pod: 通過控制器創(chuàng)建的pod, 這種pod刪除了之后還會(huì)自動(dòng)重建
什么是pod控制器
Pod控制器是管理pod的中間層,使用了pod控制器之后,我們只需要告訴pod控制器,想要多少個(gè)什么樣的pod就可以了,它就會(huì)創(chuàng)建出滿足條件的pod并確保每一個(gè)pod處于用戶期望的狀態(tài),如果pod在運(yùn)行中出現(xiàn)故障,控制器會(huì)基于指定策略重啟或者重建pod。
在kubernetes中,有很多類型的pod控制器,每個(gè)都有自己的適合的場(chǎng)景,常見的有下面這些:
- ReplicationController
比較原始的pod控制器,已經(jīng)被廢棄,由ReplicatSet替代 - ReplicaSet
保證指定數(shù)量的pod運(yùn)行,并支持pod數(shù)量變更,鏡像版本變更 - Deployment
通過空值ReplicaSet來空值pod,并支持滾動(dòng)升級(jí),版本回退 - Horizontal Pod Autoscaler
可以根據(jù)集群負(fù)載自動(dòng)調(diào)整pod的數(shù)量,實(shí)現(xiàn)消峰填谷 - DaemonSet
在集群中的指定Node上都運(yùn)行一個(gè)副本,一般用于守護(hù)進(jìn)行類的任務(wù) - Job
它創(chuàng)建出來的pod只要完成任務(wù)就立即退出,用于執(zhí)行一次性任務(wù) - Cronjob
它創(chuàng)建的pod會(huì)周期性的執(zhí)行,用于執(zhí)行周期性任務(wù) - StatefulSet
管理有狀態(tài)應(yīng)用
第二節(jié) ReplicaSet(RS)
1. 概念和資源清單
ReplicaSet的主要作用是保證一定數(shù)量的pod能夠正常運(yùn)行,它會(huì)持續(xù)監(jiān)聽這些pod的運(yùn)行狀態(tài),一旦pod發(fā)生故障,就會(huì)重啟或重建。同時(shí)它還支持pod數(shù)量。同時(shí)它還支持對(duì)pod數(shù)量的擴(kuò)縮容和版本鏡像的升級(jí)。
ReplicaSet的資源清單文件:
在這里,需要新了解的配置項(xiàng)就是spec下面的幾個(gè)屬性
- replicas: 指定副本數(shù)量,其實(shí)就是當(dāng)前rs創(chuàng)建出來的pod的數(shù)量,默認(rèn)1
- selector: 選擇器,它的作用是建立pod控制器與pod之間的關(guān)聯(lián)關(guān)系,采用Label Selector機(jī)制在在pod模板上定義label,在控制器上定義選擇器,就可以表明當(dāng)前控制器能管理哪些pod了
- template: 模板,就是當(dāng)前控制器創(chuàng)建pod所使用的模板,就是前面的pod定義
2. 創(chuàng)建ReplicaSet
創(chuàng)建pc-replicaset.yaml文件,內(nèi)容如下
apiVersion: apps/v1 #版本號(hào) kind: ReplicaSet #類型 metadata: #元數(shù)據(jù)name: pc-replicaset #rs名稱namespace: dev #所屬命名空間labels: #標(biāo)簽controller: rs spec: #詳情replicas: 3 #副本數(shù)量3selector: #選擇器,通過它指定該控制器管理哪些podmatchLabels: #labels匹配規(guī)則,用于匹配templateapp: nginx-podtemplate: #模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)模板創(chuàng)建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1創(chuàng)建rs
kubectl create -f pc-replicaset.yaml查看rs
kubectl get rs pc-replicaset -n dev -o wideDESIRED: 期望副本數(shù)量
CURRENT: 當(dāng)前副本數(shù)量
READY: 已準(zhǔn)備好的副本數(shù)
可以看到它創(chuàng)建了3個(gè)pod,pod的名稱是控制器的名稱+一個(gè)隨機(jī)字符串。
3. 擴(kuò)縮容
3.1 方法一:直接編輯rs
kubectl edit rs pc-replicaset -n dev3.2方法二 :命令擴(kuò)縮容
kubectl scale rs pc-replicaset --replicas=2 -n devreplicas=n,kubernetes會(huì)根據(jù)當(dāng)前pod數(shù)量自動(dòng)增加或者減少到n個(gè)pod
4. 鏡像升級(jí)/降級(jí)
4.1 方法一: 直接編輯rs
kubectl edit rs pc-replicaset -n dev修改版本并退出
查看rs
4.2 方法二 :命令升級(jí)
kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev5. 刪除ReplicaSet
5.1 命令刪除
使用kubectl delete 命令會(huì)刪除此RS以及它管理的Pod
在kubernetes刪除之前,會(huì)將RS的replicascaler調(diào)整為0,等地所有的Pod被刪除后,在執(zhí)行RS對(duì)象的刪除
5.2 非級(jí)聯(lián)刪除
如果希望只刪除RS對(duì)象(保留Pod),可以使用kubectl delete 命令后添加 --cascade=false選項(xiàng)(不推薦)
#只刪除RS,不級(jí)聯(lián)刪除pod,不推薦此操作 kubectl delete rs pc-replicaset -n dev --cascade=false5.3 yaml刪除
直接使用yaml刪除(推薦)
kubectl delete -f pc-replicaset.yaml第三節(jié) Deployment(Deploy)
1. 概念和資源清單
為了更好的解決服務(wù)編排的問題,kubernetes在v1.2版本開始,引入了Deployment控制器。值得一提的是,這種控制器并不直接管理pod,而是通過管理ReplicasSet來間接管理Pod,即Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加強(qiáng)大。
Deployment主要功能有下面幾個(gè)
- 支持ReplicaSet的所有功能
- 支持發(fā)布的停止、繼續(xù)
- 支持版本滾動(dòng)更新和版本回退
Deployment的資源清單
apiVersion: apps/v1 #版本號(hào) kind: Deployment #類型 metadata: #元數(shù)據(jù)name: pc-deployment #rs名稱namespace: dev #所屬命名空間labels: #標(biāo)簽controller: deploy spec: #詳情replicas: 3 #副本數(shù)量3revisionHistoryLimit: 3 #保留歷史版本,默認(rèn)10paused: false #暫停部署,默認(rèn)是falseprogressDeadlineSeconds: 600 #部署超時(shí)時(shí)間(s),默認(rèn)600strategy: 策略type: RollingUpdate #滾動(dòng)更新策略rollingUpdate:maxSurge: 30% #最大額外可以存在的副本數(shù),可以為百分比,也可以是整數(shù)maxUnavailable: 30% #最大不可用狀態(tài)的Pod的最大值,可以為百分比,也可以是整數(shù)selector: #選擇器,通過它指定該控制器管理哪些podmatchLabels: #labels匹配規(guī)則,用于匹配templateapp: nginx-podmatchExpressions: #Expressions匹配規(guī)則- {key: app,operator: In ,values:[nginx-pod]}template: #模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)模板創(chuàng)建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 802. 創(chuàng)建Deployment
創(chuàng)建pc-deployment.yaml,內(nèi)容如下
apiVersion: apps/v1 #版本號(hào) kind: Deployment #類型 metadata: #元數(shù)據(jù)name: pc-deployment #rs名稱namespace: dev #所屬命名空間labels: #標(biāo)簽controller: rs spec: #詳情replicas: 3 #副本數(shù)量3selector: #選擇器,通過它指定該控制器管理哪些podmatchLabels: #labels匹配規(guī)則,用于匹配templateapp: nginx-podtemplate: #模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)模板創(chuàng)建pod副本metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1創(chuàng)建deployment
kubectl create -f pc-deployment.yaml --record=true
查看deployment
UP-TO-DATE 最新版本的pod的數(shù)量
AVAILABLE 當(dāng)前可用的pod的數(shù)量
名稱規(guī)則
2. 擴(kuò)縮容
2.1 方法一: 命令方式
將副本數(shù)量變成5
kubectl scale deploy pc-deployment --replicas=5 -n dev查看deployment
kubectl get deploy pc-deployment -n dev查看pod
kubectl get pod -n dev2.2 方法二 : 直接編輯rs
編輯deployment的副本數(shù)量,修改spec.replicas:3
kubectl edit deploy pc-deployment -n dev查看pod
kubectl get pod -n dev3. 升級(jí)策略
Deployment支持兩種鏡像更新的策略: 重建更新和滾動(dòng)更新(默認(rèn)),可以通過strategy選項(xiàng)進(jìn)行配置。
strategy: 指定新的pod替換舊的Pod的策略,支持兩個(gè)屬性type: 指定策略類型,支持兩種策略Recreate: 在創(chuàng)建出新的Pod之前會(huì)先殺死所有已存在的PodRollingUpdate: 滾動(dòng)更新,就是殺死一部分,就啟動(dòng)一部分,在更新過程中,存在兩個(gè)版本PodrollingUpdate: 當(dāng)type為RollingUpdate時(shí)生效,用于為RollingUpdate設(shè)置參數(shù),支持兩個(gè)屬性maxUnavailable: 用來指定在升級(jí)過程中不可用Pod的最大數(shù)量,默認(rèn)為25%maxSurge: 用來指定在升級(jí)過程中可以超過期望的Pod的最大數(shù)量,默認(rèn)為25%3.1 重建更新
重建更新是將舊pod全部刪除,重建創(chuàng)建新的pod
變更鏡像
觀察升級(jí)過程
kubectl get pod -n dev -w一次性把所有的pod都停止了,然后重建創(chuàng)建
3.2 滾動(dòng)更新
變更鏡像
觀察升級(jí)過程
kubectl get pod -n dev -w可以看到它是按照25%比例進(jìn)行創(chuàng)建新版本pod,再停止舊版本pod,這樣滾動(dòng)升級(jí)
4. 版本回退
deployment支持版本升級(jí)過程中的暫停、繼續(xù)功能以及版本回退等諸多功能,下面具體來看
kubectl rollout 版本升級(jí)相關(guān)功能,支持下面選項(xiàng)
- status 顯示當(dāng)前升級(jí)狀態(tài)
- history 顯示升級(jí)歷史記錄
- pause 暫停版本升級(jí)過程
- resume 繼續(xù)已經(jīng)暫停的版本升級(jí)過程
- restart 重啟版本升級(jí)
- undo 回滾到上一級(jí)版本(可以使用–to-revision回滾到指定版本)
(1)演示版本升級(jí)前,我們需要先進(jìn)行一次升級(jí),查看一下升級(jí)過程。
刪除掉之前的pc-deployment,重新create 一個(gè)rs
進(jìn)行版本升級(jí)前,先打開兩個(gè)標(biāo)簽窗口,分別查看rs和pod信息
kubectl get pod -n dev -w kubectl get rs -n dev -w #進(jìn)行版本升級(jí) kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
升級(jí)保留了原來的rs,創(chuàng)建了新的rs,新rs上的pod增加,舊的rs上pod被刪除。即使升級(jí)完了,舊的rs依然被保留。
(2)版本回退
查看當(dāng)前升級(jí)版本的狀態(tài)
查看歷史升級(jí)信息
注意,kubectl create 時(shí)需要添加–record ,否則可能顯示為空
回退版本
可以看到第一個(gè)rs上面擁有3個(gè)pod,而第三個(gè)則沒有了。
再次查看歷史升級(jí)信息,可以看到1版本消失了。
5. 金絲雀發(fā)布
Deployment 支持更新過程中的空值,如暫停(pause)或繼續(xù)(resume)更新操作
比如有一批新的Pod資源創(chuàng)建完成后立即暫停更新過程,此時(shí),僅存在一部分新版本的應(yīng)用,主體部分還是舊的版本。然后,再篩選一小部分的用戶請(qǐng)求路由到新的版本的Pod應(yīng)用,繼續(xù)觀察能否穩(wěn)定地按期望的方式運(yùn)行。確定沒問題之后再繼續(xù)完成余下的Pod資源滾動(dòng)更新,否則立即回滾更新操作。這就是金絲雀發(fā)布。
更新deployment 的版本,并配置暫停deployment
kubectl set image deploy pc-deployment nginx=nginx:1.17.4 -n dev && kubectl rollout pause deployment pc-deployment -n dev監(jiān)控更新的過程,可以看到已經(jīng)新增了一個(gè)資源,但是并未按照預(yù)期的狀態(tài)去刪除一個(gè)舊的資源,就是因?yàn)槭褂昧藀ause暫停命令
kubectl get rs -n dev -o wide
觀察更新狀態(tài)
可以看到有一個(gè)pod創(chuàng)建,并且finish,三個(gè)副本等待更新。
確保更新的pod沒問題之后,繼續(xù)更新
稍等一下就更新完成了。
6. 終止金絲雀發(fā)布
請(qǐng)見:k8s金絲雀發(fā)布終止
總結(jié)
以上是生活随笔為你收集整理的Kubernetes(15):Pod控制器ReplicaSet和Deployment详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LIN总线
- 下一篇: vim quickfix——最灵活的qu