<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      K8s Pod 控制器介紹及應(yīng)用示例

      Kubernetes 官方文檔Pod 控制器

      Pod控制器介紹

      Pod是kubernetes的最小管理單元,在kubernetes中,按照pod的創(chuàng)建方式可以將其分為兩類(lèi):

      • 自主式pod:kubernetes直接創(chuàng)建出來(lái)的Pod,這種pod刪除后就沒(méi)有了,也不會(huì)重建

      • 控制器創(chuàng)建的pod:kubernetes通過(guò)控制器創(chuàng)建的pod,這種pod刪除了之后還會(huì)自動(dòng)重建

      什么是Pod控制器

      Pod控制器是管理pod的中間層,使用Pod控制器之后,只需要告訴Pod控制器,想要多少個(gè)什么樣的Pod就可以了,它會(huì)創(chuàng)建出滿(mǎn)足條件的Pod并確保每一個(gè)Pod資源處于用戶(hù)期望的目標(biāo)狀態(tài)。如果Pod資源在運(yùn)行中出現(xiàn)故障,它會(huì)基于指定策略重新編排Pod。

      在kubernetes中,有很多類(lèi)型的pod控制器,每種都有自己的適合的場(chǎng)景,常見(jiàn)的有下面這些:

      • ReplicationController:比較原始的pod控制器,已經(jīng)被廢棄,由ReplicaSet替代

      • ReplicaSet:保證副本數(shù)量一直維持在期望值,并支持pod數(shù)量擴(kuò)縮容,鏡像版本升級(jí)

      • Deployment:通過(guò)控制ReplicaSet來(lái)控制Pod,并支持滾動(dòng)升級(jí)、回退版本

      • Horizontal Pod Autoscaler:可以根據(jù)集群負(fù)載自動(dòng)水平調(diào)整Pod的數(shù)量,實(shí)現(xiàn)削峰填谷

      • DaemonSet:在集群中的指定Node上運(yùn)行且僅運(yùn)行一個(gè)副本,一般用于守護(hù)進(jìn)程類(lèi)的任務(wù)

      • Job:它創(chuàng)建出來(lái)的pod只要完成任務(wù)就立即退出,不需要重啟或重建,用于執(zhí)行一次性任務(wù)

      • Cronjob:它創(chuàng)建的Pod負(fù)責(zé)周期性任務(wù)控制,不需要持續(xù)后臺(tái)運(yùn)行

      • StatefulSet:管理有狀態(tài)應(yīng)用

      ReplicaSet(RS)

      ReplicaSet的主要作用是保證一定數(shù)量的pod正常運(yùn)行,它會(huì)持續(xù)監(jiān)聽(tīng)這些Pod的運(yùn)行狀態(tài),一旦Pod發(fā)生故障,就會(huì)重啟或重建。同時(shí)它還支持對(duì)pod數(shù)量的擴(kuò)縮容和鏡像版本的升降級(jí)。

      ReplicaSet的資源清單文件:

      apiVersion: apps/v1 # 版本號(hào)
      kind: ReplicaSet # 類(lèi)型       
      metadata: # 元數(shù)據(jù)
        name: # rs名稱(chēng) 
        namespace: # 所屬命名空間 
        labels: #標(biāo)簽
          controller: rs
      spec: # 詳情描述
        replicas: 3 # 副本數(shù)量
        selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
          matchLabels:      # Labels匹配規(guī)則
            app: nginx-pod
          matchExpressions: # Expressions匹配規(guī)則
            - {key: app, operator: In, values: [nginx-pod]}
        template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
              ports:
              - containerPort: 80
      

      在這里面,需要新了解的配置項(xiàng)就是spec下面幾個(gè)選項(xiàng):

      • replicas:指定副本數(shù)量,其實(shí)就是當(dāng)前rs創(chuàng)建出來(lái)的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所使用的模板板,里面其實(shí)就是前一章學(xué)過(guò)的pod的定義

      創(chuàng)建ReplicaSet

      創(chuàng)建pc-replicaset.yaml文件,內(nèi)容如下:

      apiVersion: apps/v1
      kind: ReplicaSet   
      metadata:
        name: pc-replicaset
        namespace: dev
      spec:
        replicas: 3
        selector: 
          matchLabels:
            app: nginx-pod
        template:
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
      
      # 創(chuàng)建rs
      [root@k8s-master01 ~]# kubectl create -f pc-replicaset.yaml
      replicaset.apps/pc-replicaset created
      
      # 查看rs
      # DESIRED:期望副本數(shù)量  
      # CURRENT:當(dāng)前副本數(shù)量  
      # READY:已經(jīng)準(zhǔn)備好提供服務(wù)的副本數(shù)量
      [root@k8s-master01 ~]# kubectl get rs pc-replicaset -n dev -o wide
      NAME          DESIRED   CURRENT READY AGE   CONTAINERS   IMAGES             SELECTOR
      pc-replicaset 3         3       3     22s   nginx        nginx:1.18.0       app=nginx-pod
      
      # 查看當(dāng)前控制器創(chuàng)建出來(lái)的pod
      # 這里發(fā)現(xiàn)控制器創(chuàng)建出來(lái)的pod的名稱(chēng)是在控制器名稱(chēng)后面拼接了-xxxxx隨機(jī)碼
      [root@k8s-master01 ~]# kubectl get pod -n dev
      NAME                          READY   STATUS    RESTARTS   AGE
      pc-replicaset-6vmvt   1/1     Running   0          54s
      pc-replicaset-fmb8f   1/1     Running   0          54s
      pc-replicaset-snrk2   1/1     Running   0          54s
      

      擴(kuò)縮容

      # 編輯rs的副本數(shù)量,修改spec:replicas: 6即可
      [root@k8s-master01 ~]# kubectl edit rs pc-replicaset -n dev
      replicaset.apps/pc-replicaset edited
      
      # 查看pod
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                          READY   STATUS    RESTARTS   AGE
      pc-replicaset-6vmvt   1/1     Running   0          114m
      pc-replicaset-cftnp   1/1     Running   0          10s
      pc-replicaset-fjlm6   1/1     Running   0          10s
      pc-replicaset-fmb8f   1/1     Running   0          114m
      pc-replicaset-s2whj   1/1     Running   0          10s
      pc-replicaset-snrk2   1/1     Running   0          114m
      
      # 當(dāng)然也可以直接使用命令實(shí)現(xiàn)
      # 使用scale命令實(shí)現(xiàn)擴(kuò)縮容, 后面--replicas=n直接指定目標(biāo)數(shù)量即可
      [root@k8s-master01 ~]# kubectl scale rs pc-replicaset --replicas=2 -n dev
      replicaset.apps/pc-replicaset scaled
      
      # 命令運(yùn)行完畢,立即查看,發(fā)現(xiàn)已經(jīng)有4個(gè)開(kāi)始準(zhǔn)備退出了
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                       READY   STATUS        RESTARTS   AGE
      pc-replicaset-6vmvt   0/1     Terminating   0          118m
      pc-replicaset-cftnp   0/1     Terminating   0          4m17s
      pc-replicaset-fjlm6   0/1     Terminating   0          4m17s
      pc-replicaset-fmb8f   1/1     Running       0          118m
      pc-replicaset-s2whj   0/1     Terminating   0          4m17s
      pc-replicaset-snrk2   1/1     Running       0          118m
      
      #稍等片刻,就只剩下2個(gè)了
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                       READY   STATUS    RESTARTS   AGE
      pc-replicaset-fmb8f   1/1     Running   0          119m
      pc-replicaset-snrk2   1/1     Running   0          119m
      

      鏡像升級(jí)

      # 編輯rs的容器鏡像 - image: nginx:1.182
      [root@k8s-master01 ~]# kubectl edit rs pc-replicaset -n dev
      replicaset.apps/pc-replicaset edited
      
      # 再次查看,發(fā)現(xiàn)鏡像版本已經(jīng)變更了
      [root@k8s-master01 ~]# kubectl get rs -n dev -o wide
      NAME                DESIRED  CURRENT   READY   AGE    CONTAINERS   IMAGES        ...
      pc-replicaset       2        2         2       140m   nginx         nginx:1.182  ...
      
      # 同樣的道理,也可以使用命令完成這個(gè)工作
      # kubectl set image rs rs名稱(chēng) 容器=鏡像版本 -n namespace
      [root@k8s-master01 ~]# kubectl set image rs pc-replicaset nginx=nginx:1.18.0  -n dev
      replicaset.apps/pc-replicaset image updated
      
      # 再次查看,發(fā)現(xiàn)鏡像版本已經(jīng)變更了
      [root@k8s-master01 ~]# kubectl get rs -n dev -o wide
      NAME                 DESIRED  CURRENT   READY   AGE    CONTAINERS   IMAGES            ...
      pc-replicaset        2        2         2       145m   nginx        nginx:1.18.0 ... 
      

      刪除ReplicaSet

      # 使用kubectl delete命令會(huì)刪除此RS以及它管理的Pod
      # 在kubernetes刪除RS前,會(huì)將RS的replicasclear調(diào)整為0,等待所有的Pod被刪除后,在執(zhí)行RS對(duì)象的刪除
      [root@k8s-master01 ~]# kubectl delete rs pc-replicaset -n dev
      replicaset.apps "pc-replicaset" deleted
      [root@k8s-master01 ~]# kubectl get pod -n dev -o wide
      No resources found in dev namespace.
      
      # 如果希望僅僅刪除RS對(duì)象(保留Pod),可以使用kubectl delete命令時(shí)添加--cascade=false選項(xiàng)(不推薦)。
      [root@k8s-master01 ~]# kubectl delete rs pc-replicaset -n dev --cascade=false
      replicaset.apps "pc-replicaset" deleted
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                  READY   STATUS    RESTARTS   AGE
      pc-replicaset-cl82j   1/1     Running   0          75s
      pc-replicaset-dslhb   1/1     Running   0          75s
      
      # 也可以使用yaml直接刪除(推薦)
      [root@k8s-master01 ~]# kubectl delete -f pc-replicaset.yaml
      replicaset.apps "pc-replicaset" deleted
      

      Deployment(Deploy)

      為了更好的解決服務(wù)編排的問(wèn)題,kubernetes在V1.2版本開(kāi)始,引入了Deployment控制器。值得一提的是,這種控制器并不直接管理pod,而是通過(guò)管理ReplicaSet來(lái)簡(jiǎn)介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加強(qiáng)大。

      Deployment主要功能有下面幾個(gè):

      • 支持ReplicaSet的所有功能

      • 支持發(fā)布的停止、繼續(xù)

      • 支持滾動(dòng)升級(jí)和回滾版本

      Deployment的資源清單文件:

      apiVersion: apps/v1 # 版本號(hào)
      kind: Deployment # 類(lèi)型       
      metadata: # 元數(shù)據(jù)
        name: # rs名稱(chēng) 
        namespace: # 所屬命名空間 
        labels: #標(biāo)簽
          controller: deploy
      spec: # 詳情描述
        replicas: 3 # 副本數(shù)量
        revisionHistoryLimit: 3 # 保留歷史版本
        paused: false # 暫停部署,默認(rèn)是false
        progressDeadlineSeconds: 600 # 部署超時(shí)時(shí)間(s),默認(rèn)是600
        strategy: # 策略
          type: RollingUpdate # 滾動(dòng)更新策略
          rollingUpdate: # 滾動(dòng)更新
            maxSurge: 30% # 最大額外可以存在的副本數(shù),可以為百分比,也可以為整數(shù)
            maxUnavailable: 30% # 最大不可用狀態(tài)的 Pod 的最大值,可以為百分比,也可以為整數(shù)
        selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
          matchLabels:      # Labels匹配規(guī)則
            app: nginx-pod
          matchExpressions: # Expressions匹配規(guī)則
            - {key: app, operator: In, values: [nginx-pod]}
        template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
              ports:
              - containerPort: 80
      

      創(chuàng)建deployment

      創(chuàng)建pc-deployment.yaml,內(nèi)容如下:

      apiVersion: apps/v1
      kind: Deployment      
      metadata:
        name: pc-deployment
        namespace: dev
      spec: 
        replicas: 3
        selector:
          matchLabels:
            app: nginx-pod
        template:
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
      
      # 創(chuàng)建deployment
      [root@k8s-master01 ~]# kubectl create -f pc-deployment.yaml --record=true
      deployment.apps/pc-deployment created
      
      # 查看deployment
      # UP-TO-DATE 最新版本的pod的數(shù)量
      # AVAILABLE  當(dāng)前可用的pod的數(shù)量
      [root@k8s-master01 ~]# kubectl get deploy pc-deployment -n dev
      NAME            READY   UP-TO-DATE   AVAILABLE   AGE
      pc-deployment   3/3     3            3           15s
      
      # 查看rs
      # 發(fā)現(xiàn)rs的名稱(chēng)是在原來(lái)deployment的名字后面添加了一個(gè)10位數(shù)的隨機(jī)串
      [root@k8s-master01 ~]# kubectl get rs -n dev
      NAME                       DESIRED   CURRENT   READY   AGE
      pc-deployment-6696798b78   3         3         3       23s
      
      # 查看pod
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-6696798b78-d2c8n   1/1     Running   0          107s
      pc-deployment-6696798b78-smpvp   1/1     Running   0          107s
      pc-deployment-6696798b78-wvjd8   1/1     Running   0          107s
      

      擴(kuò)縮容

      # 變更副本數(shù)量為5個(gè)
      [root@k8s-master01 ~]# kubectl scale deploy pc-deployment --replicas=5  -n dev
      deployment.apps/pc-deployment scaled
      
      # 查看deployment
      [root@k8s-master01 ~]# kubectl get deploy pc-deployment -n dev
      NAME            READY   UP-TO-DATE   AVAILABLE   AGE
      pc-deployment   5/5     5            5           2m
      
      # 查看pod
      [root@k8s-master01 ~]#  kubectl get pods -n dev
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-6696798b78-d2c8n   1/1     Running   0          4m19s
      pc-deployment-6696798b78-jxmdq   1/1     Running   0          94s
      pc-deployment-6696798b78-mktqv   1/1     Running   0          93s
      pc-deployment-6696798b78-smpvp   1/1     Running   0          4m19s
      pc-deployment-6696798b78-wvjd8   1/1     Running   0          4m19s
      
      # 編輯deployment的副本數(shù)量,修改spec:replicas: 4即可
      [root@k8s-master01 ~]# kubectl edit deploy pc-deployment -n dev
      deployment.apps/pc-deployment edited
      
      # 查看pod
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-6696798b78-d2c8n   1/1     Running   0          5m23s
      pc-deployment-6696798b78-jxmdq   1/1     Running   0          2m38s
      pc-deployment-6696798b78-smpvp   1/1     Running   0          5m23s
      pc-deployment-6696798b78-wvjd8   1/1     Running   0          5m23s
      

      鏡像更新

      deployment支持兩種更新策略:重建更新滾動(dòng)更新,可以通過(guò)strategy指定策略類(lèi)型,支持兩個(gè)屬性:

      strategy:指定新的Pod替換舊的Pod的策略, 支持兩個(gè)屬性:
        type:指定策略類(lèi)型,支持兩種策略
          Recreate:在創(chuàng)建出新的Pod之前會(huì)先殺掉所有已存在的Pod
          RollingUpdate:滾動(dòng)更新,就是殺死一部分,就啟動(dòng)一部分,在更新過(guò)程中,存在兩個(gè)版本Pod
        rollingUpdate:當(dāng)type為RollingUpdate時(shí)生效,用于為RollingUpdate設(shè)置參數(shù),支持兩個(gè)屬性:
          maxUnavailable:用來(lái)指定在升級(jí)過(guò)程中不可用Pod的最大數(shù)量,默認(rèn)為25%。
          maxSurge: 用來(lái)指定在升級(jí)過(guò)程中可以超過(guò)期望的Pod的最大數(shù)量,默認(rèn)為25%。
      

      重建更新

      1. 編輯pc-deployment.yaml,在spec節(jié)點(diǎn)下添加更新策略
      spec:
        strategy: # 策略
          type: Recreate # 重建更新
      
      1. 創(chuàng)建deploy進(jìn)行驗(yàn)證
      # 變更鏡像
      [root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.182 -n dev
      deployment.apps/pc-deployment image updated
      
      # 觀察升級(jí)過(guò)程
      [root@k8s-master01 ~]#  kubectl get pods -n dev -w
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-5d89bdfbf9-65qcw   1/1     Running   0          31s
      pc-deployment-5d89bdfbf9-w5nzv   1/1     Running   0          31s
      pc-deployment-5d89bdfbf9-xpt7w   1/1     Running   0          31s
      
      pc-deployment-5d89bdfbf9-xpt7w   1/1     Terminating   0          41s
      pc-deployment-5d89bdfbf9-65qcw   1/1     Terminating   0          41s
      pc-deployment-5d89bdfbf9-w5nzv   1/1     Terminating   0          41s
      
      pc-deployment-675d469f8b-grn8z   0/1     Pending       0          0s
      pc-deployment-675d469f8b-hbl4v   0/1     Pending       0          0s
      pc-deployment-675d469f8b-67nz2   0/1     Pending       0          0s
      
      pc-deployment-675d469f8b-grn8z   0/1     ContainerCreating   0          0s
      pc-deployment-675d469f8b-hbl4v   0/1     ContainerCreating   0          0s
      pc-deployment-675d469f8b-67nz2   0/1     ContainerCreating   0          0s
      
      pc-deployment-675d469f8b-grn8z   1/1     Running             0          1s
      pc-deployment-675d469f8b-67nz2   1/1     Running             0          1s
      pc-deployment-675d469f8b-hbl4v   1/1     Running             0          2s
      

      滾動(dòng)更新

      1. 編輯pc-deployment.yaml,在spec節(jié)點(diǎn)下添加更新策略
      spec:
        strategy: # 策略
          type: RollingUpdate # 滾動(dòng)更新策略
          rollingUpdate:
            maxSurge: 25% 
            maxUnavailable: 25%
      
      1. 創(chuàng)建deploy進(jìn)行驗(yàn)證
      # 變更鏡像
      [root@k8s-master01 ~]# kubectl set image deployment pc-deployment nginx=nginx:1.183 -n dev 
      deployment.apps/pc-deployment image updated
      
      # 觀察升級(jí)過(guò)程
      [root@k8s-master01 ~]# kubectl get pods -n dev -w
      NAME                           READY   STATUS    RESTARTS   AGE
      pc-deployment-c848d767-8rbzt   1/1     Running   0          31m
      pc-deployment-c848d767-h4p68   1/1     Running   0          31m
      pc-deployment-c848d767-hlmz4   1/1     Running   0          31m
      pc-deployment-c848d767-rrqcn   1/1     Running   0          31m
      
      pc-deployment-966bf7f44-226rx   0/1     Pending             0          0s
      pc-deployment-966bf7f44-226rx   0/1     ContainerCreating   0          0s
      pc-deployment-966bf7f44-226rx   1/1     Running             0          1s
      pc-deployment-c848d767-h4p68    0/1     Terminating         0          34m
      
      pc-deployment-966bf7f44-cnd44   0/1     Pending             0          0s
      pc-deployment-966bf7f44-cnd44   0/1     ContainerCreating   0          0s
      pc-deployment-966bf7f44-cnd44   1/1     Running             0          2s
      pc-deployment-c848d767-hlmz4    0/1     Terminating         0          34m
      
      pc-deployment-966bf7f44-px48p   0/1     Pending             0          0s
      pc-deployment-966bf7f44-px48p   0/1     ContainerCreating   0          0s
      pc-deployment-966bf7f44-px48p   1/1     Running             0          0s
      pc-deployment-c848d767-8rbzt    0/1     Terminating         0          34m
      
      pc-deployment-966bf7f44-dkmqp   0/1     Pending             0          0s
      pc-deployment-966bf7f44-dkmqp   0/1     ContainerCreating   0          0s
      pc-deployment-966bf7f44-dkmqp   1/1     Running             0          2s
      pc-deployment-c848d767-rrqcn    0/1     Terminating         0          34m
      
      # 至此,新版本的pod創(chuàng)建完畢,就版本的pod銷(xiāo)毀完畢
      # 中間過(guò)程是滾動(dòng)進(jìn)行的,也就是邊銷(xiāo)毀邊創(chuàng)建
      

      滾動(dòng)更新的過(guò)程:

      鏡像更新中rs的變化

      # 查看rs,發(fā)現(xiàn)原來(lái)的rs的依舊存在,只是pod數(shù)量變?yōu)榱?,而后又新產(chǎn)生了一個(gè)rs,pod數(shù)量為4
      # 其實(shí)這就是deployment能夠進(jìn)行版本回退的奧妙所在,后面會(huì)詳細(xì)解釋
      [root@k8s-master01 ~]# kubectl get rs -n dev
      NAME                       DESIRED   CURRENT   READY   AGE
      pc-deployment-6696798b78   0         0         0       7m37s
      pc-deployment-6696798b11   0         0         0       5m37s
      pc-deployment-c848d76789   4         4         4       72s
      

      版本回退

      deployment支持版本升級(jí)過(guò)程中的暫停、繼續(xù)功能以及版本回退等諸多功能,下面具體來(lái)看.

      kubectl rollout: 版本升級(jí)相關(guān)功能,支持下面的選項(xiàng):

      • status 顯示當(dāng)前升級(jí)狀態(tài)

      • history 顯示 升級(jí)歷史記錄

      • pause 暫停版本升級(jí)過(guò)程

      • resume 繼續(xù)已經(jīng)暫停的版本升級(jí)過(guò)程

      • restart 重啟版本升級(jí)過(guò)程

      • undo 回滾到上一級(jí)版本(可以使用--to-revision回滾到指定版本)

      # 查看當(dāng)前升級(jí)版本的狀態(tài)
      [root@k8s-master01 ~]# kubectl rollout status deploy pc-deployment -n dev
      deployment "pc-deployment" successfully rolled out
      
      # 查看升級(jí)歷史記錄
      [root@k8s-master01 ~]# kubectl rollout history deploy pc-deployment -n dev
      deployment.apps/pc-deployment
      REVISION  CHANGE-CAUSE
      1         kubectl create --filename=pc-deployment.yaml --record=true
      2         kubectl create --filename=pc-deployment.yaml --record=true
      3         kubectl create --filename=pc-deployment.yaml --record=true
      # 可以發(fā)現(xiàn)有三次版本記錄,說(shuō)明完成過(guò)兩次升級(jí)
      
      # 版本回滾
      # 這里直接使用--to-revision=1回滾到了1版本, 如果省略這個(gè)選項(xiàng),就是回退到上個(gè)版本,就是2版本
      [root@k8s-master01 ~]# kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev
      deployment.apps/pc-deployment rolled back
      
      # 查看發(fā)現(xiàn),通過(guò)nginx鏡像版本可以發(fā)現(xiàn)到了第一版
      [root@k8s-master01 ~]# kubectl get deploy -n dev -o wide
      NAME            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         
      pc-deployment   4/4     4            4           74m   nginx        nginx:1.18.0   
      
      # 查看rs,發(fā)現(xiàn)第一個(gè)rs中有4個(gè)pod運(yùn)行,后面兩個(gè)版本的rs中pod為運(yùn)行
      # 其實(shí)deployment之所以可是實(shí)現(xiàn)版本的回滾,就是通過(guò)記錄下歷史rs來(lái)實(shí)現(xiàn)的,
      # 一旦想回滾到哪個(gè)版本,只需要將當(dāng)前版本pod數(shù)量降為0,然后將回滾版本的pod提升為目標(biāo)數(shù)量就可以了
      [root@k8s-master01 ~]# kubectl get rs -n dev
      NAME                       DESIRED   CURRENT   READY   AGE
      pc-deployment-6696798b78   4         4         4       78m
      pc-deployment-966bf7f44    0         0         0       37m
      pc-deployment-c848d767     0         0         0       71m
      

      金絲雀發(fā)布

      Deployment控制器支持控制更新過(guò)程中的控制,如“暫停(pause)”或“繼續(xù)(resume)”更新操作。

      比如有一批新的Pod資源創(chuàng)建完成后立即暫停更新過(guò)程,此時(shí),僅存在一部分新版本的應(yīng)用,主體部分還是舊的版本。然后,再篩選一小部分的用戶(hù)請(qǐng)求路由到新版本的Pod應(yīng)用,繼續(xù)觀察能否穩(wěn)定地按期望的方式運(yùn)行。確定沒(méi)問(wèn)題之后再繼續(xù)完成余下的Pod資源滾動(dòng)更新,否則立即回滾更新操作。這就是所謂的金絲雀發(fā)布。

      # 更新deployment的版本,并配置暫停deployment
      [root@k8s-master01 ~]#  kubectl set image deploy pc-deployment nginx=nginx:1.184 -n dev && kubectl rollout pause deployment pc-deployment  -n dev
      deployment.apps/pc-deployment image updated
      deployment.apps/pc-deployment paused
      
      #觀察更新?tīng)顟B(tài)
      [root@k8s-master01 ~]# kubectl rollout status deploy pc-deployment -n dev 
      Waiting for deployment "pc-deployment" rollout to finish: 2 out of 4 new replicas have been updated...
      
      # 監(jiān)控更新的過(guò)程,可以看到已經(jīng)新增了一個(gè)資源,但是并未按照預(yù)期的狀態(tài)去刪除一個(gè)舊的資源,就是因?yàn)槭褂昧藀ause暫停命令
      
      [root@k8s-master01 ~]# kubectl get rs -n dev -o wide
      NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         
      pc-deployment-5d89bdfbf9   3         3         3       19m     nginx        nginx:1.18.0   
      pc-deployment-675d469f8b   0         0         0       14m     nginx        nginx:1.182   
      pc-deployment-6c9f56fcfb   2         2         2       3m16s   nginx        nginx:1.184   
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-5d89bdfbf9-rj8sq   1/1     Running   0          7m33s
      pc-deployment-5d89bdfbf9-ttwgg   1/1     Running   0          7m35s
      pc-deployment-5d89bdfbf9-v4wvc   1/1     Running   0          7m34s
      pc-deployment-6c9f56fcfb-996rt   1/1     Running   0          3m31s
      pc-deployment-6c9f56fcfb-j2gtj   1/1     Running   0          3m31s
      
      # 確保更新的pod沒(méi)問(wèn)題了,繼續(xù)更新
      [root@k8s-master01 ~]# kubectl rollout resume deploy pc-deployment -n dev
      deployment.apps/pc-deployment resumed
      
      # 查看最后的更新情況
      [root@k8s-master01 ~]# kubectl get rs -n dev -o wide
      NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         
      pc-deployment-5d89bdfbf9   0         0         0       21m     nginx        nginx:1.18.0   
      pc-deployment-675d469f8b   0         0         0       16m     nginx        nginx:1.182   
      pc-deployment-6c9f56fcfb   4         4         4       5m11s   nginx        nginx:1.184   
      
      [root@k8s-master01 ~]# kubectl get pods -n dev
      NAME                             READY   STATUS    RESTARTS   AGE
      pc-deployment-6c9f56fcfb-7bfwh   1/1     Running   0          37s
      pc-deployment-6c9f56fcfb-996rt   1/1     Running   0          5m27s
      pc-deployment-6c9f56fcfb-j2gtj   1/1     Running   0          5m27s
      pc-deployment-6c9f56fcfb-rf84v   1/1     Running   0          37s
      

      刪除Deployment

      # 刪除deployment,其下的rs和pod也將被刪除
      [root@k8s-master01 ~]# kubectl delete -f pc-deployment.yaml
      deployment.apps "pc-deployment" deleted
      

      Horizontal Pod Autoscaler(HPA)

      在前面,已經(jīng)可以實(shí)現(xiàn)通過(guò)手工執(zhí)行kubectl scale命令實(shí)現(xiàn)Pod擴(kuò)容或縮容,但是這顯然不符合Kubernetes的定位目標(biāo)--自動(dòng)化、智能化。 Kubernetes期望可以實(shí)現(xiàn)通過(guò)監(jiān)測(cè)Pod的使用情況,實(shí)現(xiàn)pod數(shù)量的自動(dòng)調(diào)整,于是就產(chǎn)生了Horizontal Pod Autoscaler(HPA)這種控制器。

      HPA可以獲取每個(gè)Pod利用率,然后和HPA中定義的指標(biāo)進(jìn)行對(duì)比,同時(shí)計(jì)算出需要伸縮的具體值,最后實(shí)現(xiàn)Pod的數(shù)量的調(diào)整。其實(shí)HPA與之前的Deployment一樣,也屬于一種Kubernetes資源對(duì)象,它通過(guò)追蹤分析RC控制的所有目標(biāo)Pod的負(fù)載變化情況,來(lái)確定是否需要針對(duì)性地調(diào)整目標(biāo)Pod的副本數(shù),這是HPA的實(shí)現(xiàn)原理。

      接下來(lái),做一個(gè)實(shí)驗(yàn)

      1 安裝metrics-server

      metrics-server可以用來(lái)收集集群中的資源使用情況

      # 安裝git
      [root@k8s-master01 ~]# yum install git -y
      # 獲取metrics-server, 注意使用的版本
      [root@k8s-master01 ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
      # 修改deployment, 注意修改的是鏡像和初始化參數(shù)
      [root@k8s-master01 ~]# cd /root/metrics-server/deploy/1.8+/
      [root@k8s-master01 1.8+]# vim metrics-server-deployment.yaml
      按圖中添加下面選項(xiàng)
      hostNetwork: true
      image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
      args:
      - --kubelet-insecure-tls
      - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
      

      # 安裝metrics-server
      [root@k8s-master01 1.8+]# kubectl apply -f ./
      
      # 查看pod運(yùn)行情況
      [root@k8s-master01 1.8+]# kubectl get pod -n kube-system
      metrics-server-6b976979db-2xwbj   1/1     Running   0          90s
      
      # 使用kubectl top node 查看資源使用情況
      [root@k8s-master01 1.8+]# kubectl top node
      NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
      k8s-master01   289m         14%    1582Mi          54%       
      k8s-node01     81m          4%     1195Mi          40%       
      k8s-node02     72m          3%     1211Mi          41%  
      [root@k8s-master01 1.8+]# kubectl top pod -n kube-system
      NAME                              CPU(cores)   MEMORY(bytes)
      coredns-6955765f44-7ptsb          3m           9Mi
      coredns-6955765f44-vcwr5          3m           8Mi
      etcd-master                       14m          145Mi
      ...
      # 至此,metrics-server安裝完成
      

      2 準(zhǔn)備deployment和servie

      創(chuàng)建pc-hpa-pod.yaml文件,內(nèi)容如下:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        namespace: dev
      spec:
        strategy: # 策略
          type: RollingUpdate # 滾動(dòng)更新策略
        replicas: 1
        selector:
          matchLabels:
            app: nginx-pod
        template:
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
              resources: # 資源配額
                limits:  # 限制資源(上限)
                  cpu: "1" # CPU限制,單位是core數(shù)
                requests: # 請(qǐng)求資源(下限)
                  cpu: "100m"  # CPU限制,單位是core數(shù)
      
      # 創(chuàng)建service
      [root@k8s-master01 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev
      
      # 查看
      [root@k8s-master01 1.8+]# kubectl get deployment,pod,svc -n dev
      NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/nginx   1/1     1            1           47s
      
      NAME                         READY   STATUS    RESTARTS   AGE
      pod/nginx-7df9756ccc-bh8dr   1/1     Running   0          47s
      
      NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
      service/nginx   NodePort   10.101.18.29   <none>        80:31830/TCP   35s
      

      3 部署HPA

      創(chuàng)建pc-hpa.yaml文件,內(nèi)容如下:

      apiVersion: autoscaling/v1
      kind: HorizontalPodAutoscaler
      metadata:
        name: pc-hpa
        namespace: dev
      spec:
        minReplicas: 1  #最小pod數(shù)量
        maxReplicas: 10 #最大pod數(shù)量
        targetCPUUtilizationPercentage: 3 # CPU使用率指標(biāo)
        scaleTargetRef:   # 指定要控制的nginx信息
          apiVersion: apps/v1
          kind: Deployment
          name: nginx
      
      # 創(chuàng)建hpa
      [root@k8s-master01 1.8+]# kubectl create -f pc-hpa.yaml
      horizontalpodautoscaler.autoscaling/pc-hpa created
      
      # 查看hpa
          [root@k8s-master01 1.8+]# kubectl get hpa -n dev
      NAME     REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      pc-hpa   Deployment/nginx   0%/3%     1         10        1          62s
      

      4 測(cè)試

      使用壓測(cè)工具對(duì)service地址172.16.5.4:31830進(jìn)行壓測(cè),然后通過(guò)控制臺(tái)查看hpa和pod的變化

      hpa變化

      [root@k8s-master01 ~]# kubectl get hpa -n dev -w
      NAME   REFERENCE      TARGETS  MINPODS  MAXPODS  REPLICAS  AGE
      pc-hpa  Deployment/nginx  0%/3%   1     10     1      4m11s
      pc-hpa  Deployment/nginx  0%/3%   1     10     1      5m19s
      pc-hpa  Deployment/nginx  22%/3%   1     10     1      6m50s
      pc-hpa  Deployment/nginx  22%/3%   1     10     4      7m5s
      pc-hpa  Deployment/nginx  22%/3%   1     10     8      7m21s
      pc-hpa  Deployment/nginx  6%/3%   1     10     8      7m51s
      pc-hpa  Deployment/nginx  0%/3%   1     10     8      9m6s
      pc-hpa  Deployment/nginx  0%/3%   1     10     8      13m
      pc-hpa  Deployment/nginx  0%/3%   1     10     1      14m
      

      deployment變化

      [root@k8s-master01 ~]# kubectl get deployment -n dev -w
      NAME    READY   UP-TO-DATE   AVAILABLE   AGE
      nginx   1/1     1            1           11m
      nginx   1/4     1            1           13m
      nginx   1/4     1            1           13m
      nginx   1/4     1            1           13m
      nginx   1/4     4            1           13m
      nginx   1/8     4            1           14m
      nginx   1/8     4            1           14m
      nginx   1/8     4            1           14m
      nginx   1/8     8            1           14m
      nginx   2/8     8            2           14m
      nginx   3/8     8            3           14m
      nginx   4/8     8            4           14m
      nginx   5/8     8            5           14m
      nginx   6/8     8            6           14m
      nginx   7/8     8            7           14m
      nginx   8/8     8            8           15m
      nginx   8/1     8            8           20m
      nginx   8/1     8            8           20m
      nginx   1/1     1            1           20m
      

      pod變化

      [root@k8s-master01 ~]# kubectl get pods -n dev -w
      NAME                     READY   STATUS    RESTARTS   AGE
      nginx-7df9756ccc-bh8dr   1/1     Running   0          11m
      nginx-7df9756ccc-cpgrv   0/1     Pending   0          0s
      nginx-7df9756ccc-8zhwk   0/1     Pending   0          0s
      nginx-7df9756ccc-rr9bn   0/1     Pending   0          0s
      nginx-7df9756ccc-cpgrv   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-8zhwk   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-rr9bn   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-m9gsj   0/1     Pending             0          0s
      nginx-7df9756ccc-g56qb   0/1     Pending             0          0s
      nginx-7df9756ccc-sl9c6   0/1     Pending             0          0s
      nginx-7df9756ccc-fgst7   0/1     Pending             0          0s
      nginx-7df9756ccc-g56qb   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-m9gsj   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-sl9c6   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-fgst7   0/1     ContainerCreating   0          0s
      nginx-7df9756ccc-8zhwk   1/1     Running             0          19s
      nginx-7df9756ccc-rr9bn   1/1     Running             0          30s
      nginx-7df9756ccc-m9gsj   1/1     Running             0          21s
      nginx-7df9756ccc-cpgrv   1/1     Running             0          47s
      nginx-7df9756ccc-sl9c6   1/1     Running             0          33s
      nginx-7df9756ccc-g56qb   1/1     Running             0          48s
      nginx-7df9756ccc-fgst7   1/1     Running             0          66s
      nginx-7df9756ccc-fgst7   1/1     Terminating         0          6m50s
      nginx-7df9756ccc-8zhwk   1/1     Terminating         0          7m5s
      nginx-7df9756ccc-cpgrv   1/1     Terminating         0          7m5s
      nginx-7df9756ccc-g56qb   1/1     Terminating         0          6m50s
      nginx-7df9756ccc-rr9bn   1/1     Terminating         0          7m5s
      nginx-7df9756ccc-m9gsj   1/1     Terminating         0          6m50s
      nginx-7df9756ccc-sl9c6   1/1     Terminating         0          6m50s
      

      DaemonSet(DS)

      DaemonSet類(lèi)型的控制器可以保證在集群中的每一臺(tái)(或指定)節(jié)點(diǎn)上都運(yùn)行一個(gè)副本。一般適用于日志收集、節(jié)點(diǎn)監(jiān)控等場(chǎng)景。也就是說(shuō),如果一個(gè)Pod提供的功能是節(jié)點(diǎn)級(jí)別的(每個(gè)節(jié)點(diǎn)都需要且只需要一個(gè)),那么這類(lèi)Pod就適合使用DaemonSet類(lèi)型的控制器創(chuàng)建。

      DaemonSet控制器的特點(diǎn):

      • 每當(dāng)向集群中添加一個(gè)節(jié)點(diǎn)時(shí),指定的 Pod 副本也將添加到該節(jié)點(diǎn)上

      • 當(dāng)節(jié)點(diǎn)從集群中移除時(shí),Pod 也就被垃圾回收了

      下面先來(lái)看下DaemonSet的資源清單文件

      apiVersion: apps/v1 # 版本號(hào)
      kind: DaemonSet # 類(lèi)型       
      metadata: # 元數(shù)據(jù)
        name: # rs名稱(chēng) 
        namespace: # 所屬命名空間 
        labels: #標(biāo)簽
          controller: daemonset
      spec: # 詳情描述
        revisionHistoryLimit: 3 # 保留歷史版本
        updateStrategy: # 更新策略
          type: RollingUpdate # 滾動(dòng)更新策略
          rollingUpdate: # 滾動(dòng)更新
            maxUnavailable: 1 # 最大不可用狀態(tài)的 Pod 的最大值,可以為百分比,也可以為整數(shù)
        selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
          matchLabels:      # Labels匹配規(guī)則
            app: nginx-pod
          matchExpressions: # Expressions匹配規(guī)則
            - {key: app, operator: In, values: [nginx-pod]}
        template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
              ports:
              - containerPort: 80
      

      創(chuàng)建pc-daemonset.yaml,內(nèi)容如下:

      apiVersion: apps/v1
      kind: DaemonSet      
      metadata:
        name: pc-daemonset
        namespace: dev
      spec: 
        selector:
          matchLabels:
            app: nginx-pod
        template:
          metadata:
            labels:
              app: nginx-pod
          spec:
            containers:
            - name: nginx
              image: nginx:1.18.0
      
      # 創(chuàng)建daemonset
      [root@k8s-master01 ~]# kubectl create -f  pc-daemonset.yaml
      daemonset.apps/pc-daemonset created
      
      # 查看daemonset
      [root@k8s-master01 ~]#  kubectl get ds -n dev -o wide
      NAME        DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE   AGE   CONTAINERS   IMAGES         
      pc-daemonset   2        2        2      2           2        24s   nginx        nginx:1.18.0   
      
      # 查看pod,發(fā)現(xiàn)在每個(gè)Node上都運(yùn)行一個(gè)pod
      [root@k8s-master01 ~]#  kubectl get pods -n dev -o wide
      NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE    
      pc-daemonset-9bck8   1/1     Running   0          37s   10.244.1.43   node1     
      pc-daemonset-k224w   1/1     Running   0          37s   10.244.2.74   node2      
      
      # 刪除daemonset
      [root@k8s-master01 ~]# kubectl delete -f pc-daemonset.yaml
      daemonset.apps "pc-daemonset" deleted
      

      Job

      Job,主要用于負(fù)責(zé)批量處理(一次要處理指定數(shù)量任務(wù))短暫的一次性(每個(gè)任務(wù)僅運(yùn)行一次就結(jié)束)任務(wù)。Job特點(diǎn)如下:

      • 當(dāng)Job創(chuàng)建的pod執(zhí)行成功結(jié)束時(shí),Job將記錄成功結(jié)束的pod數(shù)量
      • 當(dāng)成功結(jié)束的pod達(dá)到指定的數(shù)量時(shí),Job將完成執(zhí)行

      Job的資源清單文件:

      apiVersion: batch/v1 # 版本號(hào)
      kind: Job # 類(lèi)型       
      metadata: # 元數(shù)據(jù)
        name: # rs名稱(chēng) 
        namespace: # 所屬命名空間 
        labels: #標(biāo)簽
          controller: job
      spec: # 詳情描述
        completions: 1 # 指定job需要成功運(yùn)行Pods的次數(shù)。默認(rèn)值: 1
        parallelism: 1 # 指定job在任一時(shí)刻應(yīng)該并發(fā)運(yùn)行Pods的數(shù)量。默認(rèn)值: 1
        activeDeadlineSeconds: 30 # 指定job可運(yùn)行的時(shí)間期限,超過(guò)時(shí)間還未結(jié)束,系統(tǒng)將會(huì)嘗試進(jìn)行終止。
        backoffLimit: 6 # 指定job失敗后進(jìn)行重試的次數(shù)。默認(rèn)是6
        manualSelector: true # 是否可以使用selector選擇器選擇pod,默認(rèn)是false
        selector: # 選擇器,通過(guò)它指定該控制器管理哪些pod
          matchLabels:      # Labels匹配規(guī)則
            app: counter-pod
          matchExpressions: # Expressions匹配規(guī)則
            - {key: app, operator: In, values: [counter-pod]}
        template: # 模板,當(dāng)副本數(shù)量不足時(shí),會(huì)根據(jù)下面的模板創(chuàng)建pod副本
          metadata:
            labels:
              app: counter-pod
          spec:
            restartPolicy: Never # 重啟策略只能設(shè)置為Never或者OnFailure
            containers:
            - name: counter
              image: busybox:1.30
              command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]
      
      關(guān)于重啟策略設(shè)置的說(shuō)明:
          如果指定為OnFailure,則job會(huì)在pod出現(xiàn)故障時(shí)重啟容器,而不是創(chuàng)建pod,failed次數(shù)不變
          如果指定為Never,則job會(huì)在pod出現(xiàn)故障時(shí)創(chuàng)建新的pod,并且故障pod不會(huì)消失,也不會(huì)重啟,failed次數(shù)加1
          如果指定為Always的話(huà),就意味著一直重啟,意味著job任務(wù)會(huì)重復(fù)去執(zhí)行了,當(dāng)然不對(duì),所以不能設(shè)置為Always
      

      創(chuàng)建pc-job.yaml,內(nèi)容如下:

      apiVersion: batch/v1
      kind: Job      
      metadata:
        name: pc-job
        namespace: dev
      spec:
        manualSelector: true
        selector:
          matchLabels:
            app: counter-pod
        template:
          metadata:
            labels:
              app: counter-pod
          spec:
            restartPolicy: Never
            containers:
            - name: counter
              image: busybox:1.30
              command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
      
      # 創(chuàng)建job
      [root@k8s-master01 ~]# kubectl create -f pc-job.yaml
      job.batch/pc-job created
      
      # 查看job
      [root@k8s-master01 ~]# kubectl get job -n dev -o wide  -w
      NAME     COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES         SELECTOR
      pc-job   0/1           21s        21s   counter      busybox:1.30   app=counter-pod
      pc-job   1/1           31s        79s   counter      busybox:1.30   app=counter-pod
      
      # 通過(guò)觀察pod狀態(tài)可以看到,pod在運(yùn)行完畢任務(wù)后,就會(huì)變成Completed狀態(tài)
      [root@k8s-master01 ~]# kubectl get pods -n dev -w
      NAME           READY   STATUS     RESTARTS      AGE
      pc-job-rxg96   1/1     Running     0            29s
      pc-job-rxg96   0/1     Completed   0            33s
      
      # 接下來(lái),調(diào)整下pod運(yùn)行的總數(shù)量和并行數(shù)量 即:在spec下設(shè)置下面兩個(gè)選項(xiàng)
      #  completions: 6 # 指定job需要成功運(yùn)行Pods的次數(shù)為6
      #  parallelism: 3 # 指定job并發(fā)運(yùn)行Pods的數(shù)量為3
      #  然后重新運(yùn)行job,觀察效果,此時(shí)會(huì)發(fā)現(xiàn),job會(huì)每次運(yùn)行3個(gè)pod,總共執(zhí)行了6個(gè)pod
      [root@k8s-master01 ~]# kubectl get pods -n dev -w
      NAME           READY   STATUS    RESTARTS   AGE
      pc-job-684ft   1/1     Running   0          5s
      pc-job-jhj49   1/1     Running   0          5s
      pc-job-pfcvh   1/1     Running   0          5s
      pc-job-684ft   0/1     Completed   0          11s
      pc-job-v7rhr   0/1     Pending     0          0s
      pc-job-v7rhr   0/1     Pending     0          0s
      pc-job-v7rhr   0/1     ContainerCreating   0          0s
      pc-job-jhj49   0/1     Completed           0          11s
      pc-job-fhwf7   0/1     Pending             0          0s
      pc-job-fhwf7   0/1     Pending             0          0s
      pc-job-pfcvh   0/1     Completed           0          11s
      pc-job-5vg2j   0/1     Pending             0          0s
      pc-job-fhwf7   0/1     ContainerCreating   0          0s
      pc-job-5vg2j   0/1     Pending             0          0s
      pc-job-5vg2j   0/1     ContainerCreating   0          0s
      pc-job-fhwf7   1/1     Running             0          2s
      pc-job-v7rhr   1/1     Running             0          2s
      pc-job-5vg2j   1/1     Running             0          3s
      pc-job-fhwf7   0/1     Completed           0          12s
      pc-job-v7rhr   0/1     Completed           0          12s
      pc-job-5vg2j   0/1     Completed           0          12s
      
      # 刪除job
      [root@k8s-master01 ~]# kubectl delete -f pc-job.yaml
      job.batch "pc-job" deleted
      

      CronJob(CJ)

      CronJob控制器以Job控制器資源為其管控對(duì)象,并借助它管理pod資源對(duì)象,Job控制器定義的作業(yè)任務(wù)在其控制器資源創(chuàng)建之后便會(huì)立即執(zhí)行,但CronJob可以以類(lèi)似于Linux操作系統(tǒng)的周期性任務(wù)作業(yè)計(jì)劃的方式控制其運(yùn)行時(shí)間點(diǎn)重復(fù)運(yùn)行的方式。也就是說(shuō),CronJob可以在特定的時(shí)間點(diǎn)(反復(fù)的)去運(yùn)行job任務(wù)

      CronJob的資源清單文件:

      apiVersion: batch/v1beta1 # 版本號(hào)
      kind: CronJob # 類(lèi)型       
      metadata: # 元數(shù)據(jù)
        name: # rs名稱(chēng) 
        namespace: # 所屬命名空間 
        labels: #標(biāo)簽
          controller: cronjob
      spec: # 詳情描述
        schedule: # cron格式的作業(yè)調(diào)度運(yùn)行時(shí)間點(diǎn),用于控制任務(wù)在什么時(shí)間執(zhí)行
        concurrencyPolicy: # 并發(fā)執(zhí)行策略,用于定義前一次作業(yè)運(yùn)行尚未完成時(shí)是否以及如何運(yùn)行后一次的作業(yè)
        failedJobHistoryLimit: # 為失敗的任務(wù)執(zhí)行保留的歷史記錄數(shù),默認(rèn)為1
        successfulJobHistoryLimit: # 為成功的任務(wù)執(zhí)行保留的歷史記錄數(shù),默認(rèn)為3
        startingDeadlineSeconds: # 啟動(dòng)作業(yè)錯(cuò)誤的超時(shí)時(shí)長(zhǎng)
        jobTemplate: # job控制器模板,用于為cronjob控制器生成job對(duì)象;下面其實(shí)就是job的定義
          metadata:
          spec:
            completions: 1
            parallelism: 1
            activeDeadlineSeconds: 30
            backoffLimit: 6
            manualSelector: true
            selector:
              matchLabels:
                app: counter-pod
              matchExpressions: 規(guī)則
                - {key: app, operator: In, values: [counter-pod]}
            template:
              metadata:
                labels:
                  app: counter-pod
              spec:
                restartPolicy: Never 
                containers:
                - name: counter
                  image: busybox:1.30
                  command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 20;done"]
      
      需要重點(diǎn)解釋的幾個(gè)選項(xiàng):
      schedule: cron表達(dá)式,用于指定任務(wù)的執(zhí)行時(shí)間
          */1    *      *    *     *
          <分鐘> <小時(shí)> <日> <月份> <星期>
      
          分鐘 值從 0 到 59.
          小時(shí) 值從 0 到 23.
          日 值從 1 到 31.
          月 值從 1 到 12.
          星期 值從 0 到 6, 0 代表星期日
          多個(gè)時(shí)間可以用逗號(hào)隔開(kāi); 范圍可以用連字符給出;*可以作為通配符; /表示每...
      concurrencyPolicy:
          Allow:   允許Jobs并發(fā)運(yùn)行(默認(rèn))
          Forbid:  禁止并發(fā)運(yùn)行,如果上一次運(yùn)行尚未完成,則跳過(guò)下一次運(yùn)行
          Replace: 替換,取消當(dāng)前正在運(yùn)行的作業(yè)并用新作業(yè)替換它
      

      創(chuàng)建pc-cronjob.yaml,內(nèi)容如下:

      apiVersion: batch/v1beta1
      kind: CronJob
      metadata:
        name: pc-cronjob
        namespace: dev
        labels:
          controller: cronjob
      spec:
        schedule: "*/1 * * * *"
        jobTemplate:
          metadata:
          spec:
            template:
              spec:
                restartPolicy: Never
                containers:
                - name: counter
                  image: busybox:1.30
                  command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]
      
      # 創(chuàng)建cronjob
      [root@k8s-master01 ~]# kubectl create -f pc-cronjob.yaml
      cronjob.batch/pc-cronjob created
      
      # 查看cronjob
      [root@k8s-master01 ~]# kubectl get cronjobs -n dev
      NAME         SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
      pc-cronjob   */1 * * * *   False     0        <none>          6s
      
      # 查看job
      [root@k8s-master01 ~]# kubectl get jobs -n dev
      NAME                    COMPLETIONS   DURATION   AGE
      pc-cronjob-1592587800   1/1           28s        3m26s
      pc-cronjob-1592587860   1/1           28s        2m26s
      pc-cronjob-1592587920   1/1           28s        86s
      
      # 查看pod
      [root@k8s-master01 ~]# kubectl get pods -n dev
      pc-cronjob-1592587800-x4tsm   0/1     Completed   0          2m24s
      pc-cronjob-1592587860-r5gv4   0/1     Completed   0          84s
      pc-cronjob-1592587920-9dxxq   1/1     Running     0          24s
      
      
      # 刪除cronjob
      [root@k8s-master01 ~]# kubectl  delete -f pc-cronjob.yaml
      cronjob.batch "pc-cronjob" deleted
      
      posted @ 2025-04-24 10:00  講文張字  閱讀(471)  評(píng)論(0)    收藏  舉報(bào)
      返回頂部
      主站蜘蛛池模板: 91老肥熟女九色老女人| 精品国产精品中文字幕| 国产成人亚洲老熟女精品| 成人午夜福利精品一区二区| 中文字幕日韩精品人妻| 草草浮力影院| 中文在线а√天堂| 青青青爽在线视频观看| 白嫩少妇激情无码| 自拍偷自拍亚洲精品播放| 福利一区二区在线播放 | 国产精品成人网址在线观看| 麻豆精品国产熟妇aⅴ一区| 国产精品中文av专线| 噜噜综合亚洲av中文无码| 国产精品中文字幕视频| 久艹视频免费看| 少妇午夜福利一区二区三区 | 安义县| 国内熟妇与亚洲洲熟妇妇| 精品视频在线观看免费观看| 乐东| 五月综合激情婷婷六月| 亚洲欧美色一区二区三区| 中文字幕亚洲人妻系列| 日韩熟女乱综合一区二区| 欧美人禽zozo动人物杂交| 日韩熟妇中文色在线视频 | 亚洲精品国产免费av| 国产麻豆放荡av激情演绎| 免费无码高H视频在线观看| 精品无码国产自产拍在线观看蜜| 亚洲综合国产精品第一页| 亚洲另类欧美综合久久图片区| 久久精品国产久精国产| 热99久久这里只有精品| 中文字幕有码无码AV| 丰满的少妇一区二区三区| 无遮无挡爽爽免费视频| 久久久久无码精品亚洲日韩| 日韩美女亚洲性一区二区|