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