日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes(15):Pod控制器ReplicaSet和Deployment详解

發(fā)布時(shí)間:2024/3/7 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes(15):Pod控制器ReplicaSet和Deployment详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 第一節(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的資源清單文件:

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-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: 80

在這里,需要新了解的配置項(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 wide

DESIRED: 期望副本數(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 dev

3.2方法二 :命令擴(kuò)縮容

kubectl scale rs pc-replicaset --replicas=2 -n dev

replicas=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

kubectl get rs pc-replicaset -n dev -o wide

4.2 方法二 :命令升級(jí)

kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n dev

5. 刪除ReplicaSet

5.1 命令刪除

使用kubectl delete 命令會(huì)刪除此RS以及它管理的Pod
在kubernetes刪除之前,會(huì)將RS的replicascaler調(diào)整為0,等地所有的Pod被刪除后,在執(zhí)行RS對(duì)象的刪除

kubectl delete rs pc-replicaset -n dev kubectl get pod -n dev -o wide

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=false

5.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: 80

2. 創(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 dev

2.2 方法二 : 直接編輯rs

編輯deployment的副本數(shù)量,修改spec.replicas:3

kubectl edit deploy pc-deployment -n dev

查看pod

kubectl get pod -n dev

3. 升級(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

  • 編輯pc-deployment.yaml,在spec節(jié)點(diǎn)下添加更新策略
  • apiVersion: apps/v1 #版本號(hào) kind: Deployment #類型 metadata: #元數(shù)據(jù)name: pc-deployment #rs名稱namespace: dev #所屬命名空間labels: #標(biāo)簽controller: rs spec: #詳情strategy:type: Recreate #重建更新策略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

    kubectl apply -f pc-deployment.yaml
  • 創(chuàng)建deploy進(jìn)行驗(yàn)證
    變更鏡像
  • kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev

    觀察升級(jí)過程

    kubectl get pod -n dev -w

    一次性把所有的pod都停止了,然后重建創(chuàng)建

    3.2 滾動(dòng)更新

  • 編輯pc-deployment.yaml文件,在spec下添加更新策略
  • apiVersion: apps/v1 #版本號(hào) kind: Deployment #類型 metadata: #元數(shù)據(jù)name: pc-deployment #rs名稱namespace: dev #所屬命名空間labels: #標(biāo)簽controller: rs spec: #詳情strategy:type: RollingUpdate #滾動(dòng)更新rollingUpdate:maxUnavailable: 25%maxSurge: 25%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


    kubectl apply -f pc-deployment.yaml
  • 創(chuàng)建deploy進(jìn)行驗(yàn)證
    變更鏡像
  • kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n dev

    觀察升級(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

    #創(chuàng)建rs kubectl create -f pc-deployment.yaml --record #查看deploy,rs,pod內(nèi)容 kubectl get deploy,rs,pod -n dev

    進(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)

    kubectl rollout status deploy pc-deployment -n dev


    查看歷史升級(jí)信息

    kubectl rollout history deploy pc-deployment -n dev

    注意,kubectl create 時(shí)需要添加–record ,否則可能顯示為空


    回退版本

    #回退到版本1 kubectl rollout undo deploy pc-deployment --to-revision=1 -n dev

    可以看到第一個(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)

    kubectl rollout status deploy pc-deployment -n dev

    可以看到有一個(gè)pod創(chuàng)建,并且finish,三個(gè)副本等待更新。

    確保更新的pod沒問題之后,繼續(xù)更新

    kubectl rollout resume deploy pc-deployment -n dev


    稍等一下就更新完成了。

    6. 終止金絲雀發(fā)布

    請(qǐng)見:k8s金絲雀發(fā)布終止

    總結(jié)

    以上是生活随笔為你收集整理的Kubernetes(15):Pod控制器ReplicaSet和Deployment详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。