主頁 > 作業系統 > 容器編排系統之ReplicaSet和Deployment控制器

容器編排系統之ReplicaSet和Deployment控制器

2020-12-18 06:25:25 作業系統

  前文我們了解了k8s上的Pod資源的生命周期、健康狀態和就緒狀態探測以及資源限制相關話題,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/14143610.html;今天我們來了解下Pod控制器相關話題;

  在k8s上控制器就是k8s的“大腦”,在聊k8s開篇時,我們說過控制器主要負責創建,管理k8s上的資源,如果對應資源不吻合用戶定義的資源狀態,它就會嘗試重啟或重建的方式讓其狀態和用戶定義的狀態吻合;在k8s上控制器的型別有很多,比如pod控制,service控制器,endpoint控制器等等;不同型別的控制器有著不同的功能和作用;比如pod控制器就是針對pod資源進行管理的控制器;單說pod控制器,它也有很多型別,根據pod里容器跑的應用程式來分類,可以分為有狀態應用和無狀態應用控制,從應用程式是否運行為守護行程我們可以將控制器分為,守護行程和非守護行程控制器;其中無狀態控制器中最常用的有ReplicaSet控制器和Deployment控制;有狀態應用控制器常用的有StatefulSet;守護行程控制器最常用的有daemonSet控制器;非守護行程控制器有job控制器,對Job型別的控制器,如果要周期性執行的有Cronjob控制器;

  1、ReplicaSet控制器

  ReplicaSet控制器的主要作用是確保Pod物件副本數量在任何時刻都能精準滿足用戶期望的數量;這種控制器啟動以后,它首先會查找集群中匹配其標簽選擇器的Pod資源物件,當活動pod數量與用戶期望的pod數量不吻合時,如果多了就洗掉,少了就創建;它創建新pod是靠我們在配置清單中定義的pod模板來創建新pod;

  示例:定義創建ReplicaSet控制器

[root@master01 ~]# cat ReplicaSet-controller-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: 
  name: replicaset-demo
  namespace: default
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine
        ports:
        - name: http
          containerPort: 80
[root@master01 ~]# 

  提示:定義ReplicaSet控制器,apiVersion欄位的值為apps/v1,kind為ReplicaSet,這兩個欄位都是固定的;后面的metadata中主要定義名稱和名稱空間;spec中主要定義replicas、selector、template;其中replicas這個欄位的值為一個整數,表示對應pod的副本數量;selector用于定義標簽選擇器;其值為一個物件,其中matchLabels欄位表示精確匹配標簽,這個欄位的值為一個字典;除了精確匹配標簽選擇器這種方式,還有matchExpressions表示使用匹配運算式,其值為一個物件;簡單說定義標簽選擇器,第一種是matchLabels,這種方式就是指定一個或多個標簽,每個標簽就是一個kvj鍵值對;后者matchExpressions是指定一個運算式,其值為一個物件,這個物件中主要定義key欄位,這個欄位定義key的名稱;operator定義運算子,values定義值;key和operator欄位的值型別都是字串,其中operator的值有In, NotIn, Exists和DoesNotExist;values是一個字串串列;其次就是定義pod模板,使用template欄位定義,該欄位的值為一個物件其中metadata欄位用于定義模板的元素據資訊,這個元資料資訊必須定義標簽屬性;通常這個標簽屬性和選擇器中的標簽相同;spec欄位用于定義pod模板的狀態,最重要的是定義pod里容器的名字,鏡像等等;

  應用資源配置清單

[root@master01 ~]# kubectl apply -f ReplicaSet-controller-demo.yaml
replicaset.apps/replicaset-demo created
[root@master01 ~]# kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
replicaset-demo   3         3         3       9s
[root@master01 ~]# kubectl get rs -o wide
NAME              DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES              SELECTOR
replicaset-demo   3         3         3       17s   nginx        nginx:1.14-alpine   app=nginx-pod
[root@master01 ~]# 

  提示:rs就是ReplicaSet的簡寫;從上面的資訊可以看到對應控制器已經創建;并且當前pod副本數量為3,用戶期望的數量也為3,有3個準備就緒;

  查看pod

[root@master01 ~]# kubectl get pod -L app
NAME                    READY   STATUS    RESTARTS   AGE     APP
replicaset-demo-rsl7q   1/1     Running   0          2m57s   nginx-pod
replicaset-demo-twknl   1/1     Running   0          2m57s   nginx-pod
replicaset-demo-vzdbb   1/1     Running   0          2m57s   nginx-pod
[root@master01 ~]# 

  提示:可以看到當前default名稱空間中創建了3個pod,其標簽為nginx-pod;

  測驗:更改其中一個pod的標簽為ngx,看看對應控制器是否會新建一個標簽為nginx-pod的pod呢?

[root@master01 ~]# kubectl get pod -L app                         
NAME                    READY   STATUS    RESTARTS   AGE     APP
replicaset-demo-rsl7q   1/1     Running   0          5m48s   nginx-pod
replicaset-demo-twknl   1/1     Running   0          5m48s   nginx-pod
replicaset-demo-vzdbb   1/1     Running   0          5m48s   nginx-pod
[root@master01 ~]# kubectl label pod/replicaset-demo-vzdbb app=ngx --overwrite
pod/replicaset-demo-vzdbb labeled
[root@master01 ~]# kubectl get pod -L app
NAME                    READY   STATUS    RESTARTS   AGE    APP
replicaset-demo-qv8tp   1/1     Running   0          4s     nginx-pod
replicaset-demo-rsl7q   1/1     Running   0          6m2s   nginx-pod
replicaset-demo-twknl   1/1     Running   0          6m2s   nginx-pod
replicaset-demo-vzdbb   1/1     Running   0          6m2s   ngx
[root@master01 ~]# 

  提示:可以看到當我們把其中一個pod的標簽更改為app=ngx后,對應控制器又會根據pod模板創建一個新pod;

  測驗:更改pod標簽為app=nginx-pod,看看對應控制器是否會洗掉一個pod呢?

[root@master01 ~]# kubectl get pod -L app
NAME                    READY   STATUS    RESTARTS   AGE     APP
replicaset-demo-qv8tp   1/1     Running   0          2m35s   nginx-pod
replicaset-demo-rsl7q   1/1     Running   0          8m33s   nginx-pod
replicaset-demo-twknl   1/1     Running   0          8m33s   nginx-pod
replicaset-demo-vzdbb   1/1     Running   0          8m33s   ngx
[root@master01 ~]# kubectl label pod/replicaset-demo-vzdbb app=nginx-pod --overwrite
pod/replicaset-demo-vzdbb labeled
[root@master01 ~]# kubectl get pod -L app
NAME                    READY   STATUS        RESTARTS   AGE     APP
replicaset-demo-qv8tp   0/1     Terminating   0          2m50s   nginx-pod
replicaset-demo-rsl7q   1/1     Running       0          8m48s   nginx-pod
replicaset-demo-twknl   1/1     Running       0          8m48s   nginx-pod
replicaset-demo-vzdbb   1/1     Running       0          8m48s   nginx-pod
[root@master01 ~]# kubectl get pod -L app
NAME                    READY   STATUS    RESTARTS   AGE     APP
replicaset-demo-rsl7q   1/1     Running   0          8m57s   nginx-pod
replicaset-demo-twknl   1/1     Running   0          8m57s   nginx-pod
replicaset-demo-vzdbb   1/1     Running   0          8m57s   nginx-pod
[root@master01 ~]# 

  提示:可以看到當集群中有多余用戶期望數量的pod標簽時,對應控制器會把多余的相同標簽的pod洗掉;從上面的測驗可以看到ReplicaSet控制器是依靠標簽選擇器來判斷集群中pod的數量是否和用戶定義的數量吻合,如果不吻合就嘗試洗掉或新建,讓對應pod數量精確滿足用戶期望pod數量;

   查看rs控制器的詳細資訊

[root@master01 ~]# kubectl describe rs replicaset-demo
Name:         replicaset-demo
Namespace:    default
Selector:     app=nginx-pod
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx-pod
  Containers:
   nginx:
    Image:        nginx:1.14-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  20m   replicaset-controller  Created pod: replicaset-demo-twknl
  Normal  SuccessfulCreate  20m   replicaset-controller  Created pod: replicaset-demo-vzdbb
  Normal  SuccessfulCreate  20m   replicaset-controller  Created pod: replicaset-demo-rsl7q
  Normal  SuccessfulCreate  15m   replicaset-controller  Created pod: replicaset-demo-qv8tp
  Normal  SuccessfulDelete  12m   replicaset-controller  Deleted pod: replicaset-demo-qv8tp
[root@master01 ~]# 

  擴展/縮減rs控制pod副本數量

[root@master01 ~]# kubectl scale rs replicaset-demo --replicas=6
replicaset.apps/replicaset-demo scaled
[root@master01 ~]# kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
replicaset-demo   6         6         6       32m
[root@master01 ~]# kubectl scale rs replicaset-demo --replicas=4
replicaset.apps/replicaset-demo scaled
[root@master01 ~]# kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
replicaset-demo   4         4         4       32m
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS        RESTARTS   AGE
replicaset-demo-5t9tt   0/1     Terminating   0          33s
replicaset-demo-j75hk   1/1     Running       0          33s
replicaset-demo-rsl7q   1/1     Running       0          33m
replicaset-demo-twknl   1/1     Running       0          33m
replicaset-demo-vvqfw   0/1     Terminating   0          33s
replicaset-demo-vzdbb   1/1     Running       0          33m
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
replicaset-demo-j75hk   1/1     Running   0          41s
replicaset-demo-rsl7q   1/1     Running   0          33m
replicaset-demo-twknl   1/1     Running   0          33m
replicaset-demo-vzdbb   1/1     Running   0          33m
[root@master01 ~]# 

  提示:scale也可以對控制器做擴展和縮減pod副本數量,除了以上使用命令的方式來變更對應pod副本數量;也可以直接在配置清單中修改replicas欄位,然后使用apply命令執行配置清單進行修改;

  修改配置清單中的replicas欄位的值來擴展pod副本數量

[root@master01 ~]# cat ReplicaSet-controller-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: 
  name: replicaset-demo
  namespace: default
spec:
  replicas: 7
  selector: 
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine
        ports:
        - name: http
          containerPort: 80
[root@master01 ~]# kubectl apply -f ReplicaSet-controller-demo.yaml
replicaset.apps/replicaset-demo configured
[root@master01 ~]# kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
replicaset-demo   7         7         7       35m
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
replicaset-demo-j75hk   1/1     Running   0          3m33s
replicaset-demo-k2n9g   1/1     Running   0          9s
replicaset-demo-n7fmk   1/1     Running   0          9s
replicaset-demo-q4dc6   1/1     Running   0          9s
replicaset-demo-rsl7q   1/1     Running   0          36m
replicaset-demo-twknl   1/1     Running   0          36m
replicaset-demo-vzdbb   1/1     Running   0          36m
[root@master01 ~]# 

  更新pod版本

  方式1修改資源配置清單中pod模板的版本,然后在使用apply命令來執行配置清單

[root@master01 ~]# cat ReplicaSet-controller-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: 
  name: replicaset-demo
  namespace: default
spec:
  replicas: 7
  selector: 
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.16-alpine
        ports:
        - name: http
          containerPort: 80
[root@master01 ~]# kubectl apply -f ReplicaSet-controller-demo.yaml
replicaset.apps/replicaset-demo configured
[root@master01 ~]# kubectl get rs -o wide
NAME              DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES              SELECTOR
replicaset-demo   7         7         7       55m   nginx        nginx:1.16-alpine   app=nginx-pod
[root@master01 ~]# 

  提示:從上面命令可以看到,它顯示的鏡像版本是1.16的版本;

  驗證:查看對應pod,看看對應pod中容器鏡像版本是否變成了1.16呢?

[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
replicaset-demo-j75hk   1/1     Running   0          25m
replicaset-demo-k2n9g   1/1     Running   0          21m
replicaset-demo-n7fmk   1/1     Running   0          21m
replicaset-demo-q4dc6   1/1     Running   0          21m
replicaset-demo-rsl7q   1/1     Running   0          57m
replicaset-demo-twknl   1/1     Running   0          57m
replicaset-demo-vzdbb   1/1     Running   0          57m
[root@master01 ~]# 

  提示:從pod創建的時間來看,pod沒有更新;

  測驗:洗掉一個pod看看對應pod里容器鏡像是否會更新呢?

[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
replicaset-demo-j75hk   1/1     Running   0          25m
replicaset-demo-k2n9g   1/1     Running   0          21m
replicaset-demo-n7fmk   1/1     Running   0          21m
replicaset-demo-q4dc6   1/1     Running   0          21m
replicaset-demo-rsl7q   1/1     Running   0          57m
replicaset-demo-twknl   1/1     Running   0          57m
replicaset-demo-vzdbb   1/1     Running   0          57m
[root@master01 ~]# kubectl delete pod/replicaset-demo-vzdbb 
pod "replicaset-demo-vzdbb" deleted
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS              RESTARTS   AGE
replicaset-demo-9wqj9   0/1     ContainerCreating   0          10s
replicaset-demo-j75hk   1/1     Running             0          26m
replicaset-demo-k2n9g   1/1     Running             0          23m
replicaset-demo-n7fmk   1/1     Running             0          23m
replicaset-demo-q4dc6   1/1     Running             0          23m
replicaset-demo-rsl7q   1/1     Running             0          58m
replicaset-demo-twknl   1/1     Running             0          58m
[root@master01 ~]# kubectl describe pod/replicaset-demo-9wqj9 |grep Image
    Image:          nginx:1.16-alpine
    Image ID:       docker-pullable://nginx@sha256:5057451e461dda671da5e951019ddbff9d96a751fc7d548053523ca1f848c1ad
[root@master01 ~]# 

  提示:可以看到我們洗掉了一個pod,對應控制器又新建了一個pod,對應新建的pod鏡像版本就成為了新版本的pod;從上面測驗情況可以看到,對于rs控制器當pod模板中的鏡像版本發生更改,如果k8s集群上對應pod數量和用戶定義的數量吻合,此時rs控制器不會更新pod;只有新建后的pod才會擁有新版本;也就說如果我們要rs來對pod版本更新,就得洗掉原有老的pod后才會更新;

  方式2使用命令更新pod版本

[root@master01 ~]# kubectl set image rs replicaset-demo  nginx=nginx:1.18-alpine
replicaset.apps/replicaset-demo image updated
[root@master01 ~]# kubectl get rs -o wide
NAME              DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES              SELECTOR
replicaset-demo   7         7         7       72m   nginx        nginx:1.18-alpine   app=nginx-pod
[root@master01 ~]# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
replicaset-demo-9wqj9   1/1     Running   0          13m
replicaset-demo-j75hk   1/1     Running   0          40m
replicaset-demo-k2n9g   1/1     Running   0          36m
replicaset-demo-n7fmk   1/1     Running   0          36m
replicaset-demo-q4dc6   1/1     Running   0          36m
replicaset-demo-rsl7q   1/1     Running   0          72m
replicaset-demo-twknl   1/1     Running   0          72m
[root@master01 ~]# 

  提示:對于rs控制器,不管用命令還是修改資源配置清單中pod模板中鏡像版本,如果有和用戶期望數量的pod,它是不會自動更新pod版本的;只有手動洗掉老版本pod,對應新版本pod才會被創建;

  2、deployment控制器

  對于deployment控制來說,它的定義方式和rs控制都差不多,但deploy控制器的功能要比rs強大,它可以實作滾動更新,用戶手動定義更新策略;其實deploy控制器是在rs控制器的基礎上來管理pod;也就說我們在創建deploy控制器時,它自動會創建一個rs控制器;其中使用deployment控制器創建的pod名稱是由deploy控制器名稱加上“-”pod模板hash名稱加上“-”隨機字串;而對應rs控制器的名稱恰好就是deploy控制器名稱加“-”pod模板hash;即pod名稱就為rs控制器名稱加“-”隨機字串;

  示例:創建deployment控制器

[root@master01 ~]# cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deploy-demo
  namespace: default
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: ngx-dep-pod
  template:
    metadata:
      labels:
        app: ngx-dep-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine
        ports:
        - name: http
          containerPort: 80
[root@master01 ~]# 

  應用配置清單

[root@master01 ~]# kubectl apply -f deploy-demo.yaml
deployment.apps/deploy-demo created
[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           10s   nginx        nginx:1.14-alpine   app=ngx-dep-pod
[root@master01 ~]# 

  驗證:查看是否有rs控制器創建?

[root@master01 ~]# kubectl get rs
NAME                     DESIRED   CURRENT   READY   AGE
deploy-demo-6d795f958b   3         3         3       57s
replicaset-demo          7         7         7       84m
[root@master01 ~]# 

  提示:可以看到有一個deploy-demo-6d795f958b的rs控制器被創建;

  驗證:查看pod,看看對應pod名稱是否有rs控制器名稱加“-”一串隨機字串?

[root@master01 ~]# kubectl  get pod
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-6d795f958b-bppjr   1/1     Running   0          2m16s
deploy-demo-6d795f958b-mxwkn   1/1     Running   0          2m16s
deploy-demo-6d795f958b-sh76g   1/1     Running   0          2m16s
replicaset-demo-9wqj9          1/1     Running   0          26m
replicaset-demo-j75hk          1/1     Running   0          52m
replicaset-demo-k2n9g          1/1     Running   0          49m
replicaset-demo-n7fmk          1/1     Running   0          49m
replicaset-demo-q4dc6          1/1     Running   0          49m
replicaset-demo-rsl7q          1/1     Running   0          85m
replicaset-demo-twknl          1/1     Running   0          85m
[root@master01 ~]# 

  提示:可以看到有3個pod的名稱是deploy-demo-6d795f958b-加隨機字串;

  更新pod版本

[root@master01 ~]# cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deploy-demo
  namespace: default
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: ngx-dep-pod
  template:
    metadata:
      labels:
        app: ngx-dep-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.16-alpine
        ports:
        - name: http
          containerPort: 80
[root@master01 ~]# kubectl apply -f deploy-demo.yaml
deployment.apps/deploy-demo configured
[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           5m45s   nginx        nginx:1.16-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
deploy-demo-95cc58f4d-45l5c   1/1     Running   0          43s
deploy-demo-95cc58f4d-6bmb6   1/1     Running   0          45s
deploy-demo-95cc58f4d-7d5r5   1/1     Running   0          29s
replicaset-demo-9wqj9         1/1     Running   0          30m
replicaset-demo-j75hk         1/1     Running   0          56m
replicaset-demo-k2n9g         1/1     Running   0          53m
replicaset-demo-n7fmk         1/1     Running   0          53m
replicaset-demo-q4dc6         1/1     Running   0          53m
replicaset-demo-rsl7q         1/1     Running   0          89m
replicaset-demo-twknl         1/1     Running   0          89m
[root@master01 ~]# 

  提示:可以看到deploy控制器只要更改了pod模板中鏡像版本,對應pod會自動更新;

  使用命令更新pod版本

[root@master01 ~]# kubectl set image deploy deploy-demo nginx=nginx:1.18-alpine
deployment.apps/deploy-demo image updated
[root@master01 ~]# kubectl get deploy
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-demo   3/3     1            3           9m5s
[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     1            3           9m11s   nginx        nginx:1.18-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           9m38s   nginx        nginx:1.18-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
deploy-demo-567b54cd6-6h97c   1/1     Running   0          28s
deploy-demo-567b54cd6-j74t4   1/1     Running   0          27s
deploy-demo-567b54cd6-wcccx   1/1     Running   0          49s
replicaset-demo-9wqj9         1/1     Running   0          34m
replicaset-demo-j75hk         1/1     Running   0          60m
replicaset-demo-k2n9g         1/1     Running   0          56m
replicaset-demo-n7fmk         1/1     Running   0          56m
replicaset-demo-q4dc6         1/1     Running   0          56m
replicaset-demo-rsl7q         1/1     Running   0          92m
replicaset-demo-twknl         1/1     Running   0          92m
[root@master01 ~]# 

  提示:可以看到deploy控制器,只要修改了pod模板中鏡像的版本,對應pod就會隨之滾動更新到我們指定的版本;

  查看rs歷史版本

[root@master01 ~]# kubectl get rs -o wide
NAME                     DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES              SELECTOR
deploy-demo-567b54cd6    3         3         3       3m50s   nginx        nginx:1.18-alpine   app=ngx-dep-pod,pod-template-hash=567b54cd6
deploy-demo-6d795f958b   0         0         0       12m     nginx        nginx:1.14-alpine   app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-95cc58f4d    0         0         0       7m27s   nginx        nginx:1.16-alpine   app=ngx-dep-pod,pod-template-hash=95cc58f4d
replicaset-demo          7         7         7       95m     nginx        nginx:1.18-alpine   app=nginx-pod
[root@master01 ~]# 

  提示:deploy控制器的更新pod版本操作,它會記錄rs的所有歷史版本;因為只要pod模板的hash值發生變化,對應的rs就會重新被創建一遍,不同于rs控制器,歷史版本的rs上沒有pod運行,只有當前版本的rs上才會運行pod;

  查看更新歷史記錄

[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

[root@master01 ~]# 

  提示:這里可以看到有3個版本,沒有記錄對應的原因;這是因為我們在更新pod版本是沒有記錄;要想記錄器更新原因,可以在對應名后面加--record選項即可;

  示例:記錄更新操作命令到更新歷史記錄

[root@master01 ~]# kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record 
deployment.apps/deploy-demo image updated
[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true

[root@master01 ~]# kubectl apply -f deploy-demo-nginx-1.16.yaml --record
deployment.apps/deploy-demo configured
[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
3         <none>
4         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true
5         kubectl apply --filename=deploy-demo-nginx-1.16.yaml --record=true

[root@master01 ~]# 

  提示:可以看到更新操作時加上--record選項后,再次查看更新歷史記錄,就能顯示對應的更新命令;

  回滾到上一個版本

[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           33m   nginx        nginx:1.16-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get rs -o wide    
NAME                     DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES              SELECTOR
deploy-demo-567b54cd6    0         0         0       24m    nginx        nginx:1.18-alpine   app=ngx-dep-pod,pod-template-hash=567b54cd6
deploy-demo-6d795f958b   0         0         0       33m    nginx        nginx:1.14-alpine   app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-95cc58f4d    3         3         3       28m    nginx        nginx:1.16-alpine   app=ngx-dep-pod,pod-template-hash=95cc58f4d
replicaset-demo          7         7         7       116m   nginx        nginx:1.18-alpine   app=nginx-pod
[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
3         <none>
4         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true
5         kubectl apply --filename=deploy-demo-nginx-1.16.yaml --record=true

[root@master01 ~]# kubectl rollout undo deploy/deploy-demo
deployment.apps/deploy-demo rolled back
[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
3         <none>
5         kubectl apply --filename=deploy-demo-nginx-1.16.yaml --record=true
6         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true

[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           34m   nginx        nginx:1.14-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get rs -o wide
NAME                     DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES              SELECTOR
deploy-demo-567b54cd6    0         0         0       26m    nginx        nginx:1.18-alpine   app=ngx-dep-pod,pod-template-hash=567b54cd6
deploy-demo-6d795f958b   3         3         3       35m    nginx        nginx:1.14-alpine   app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-95cc58f4d    0         0         0       29m    nginx        nginx:1.16-alpine   app=ngx-dep-pod,pod-template-hash=95cc58f4d
replicaset-demo          7         7         7       118m   nginx        nginx:1.18-alpine   app=nginx-pod
[root@master01 ~]# 

  提示:可以看到執行了kubectl rollout undo deploy/deploy-demo命令后,對應版本從1.16就回滾到1.14的版本了;對應更新歷史記錄也把1.14版本更新為當前最新記錄;

  回滾到指定歷史記錄版本

[root@master01 ~]# kubectl rollout history deploy/deploy-demo
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
3         <none>
5         kubectl apply --filename=deploy-demo-nginx-1.16.yaml --record=true
6         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true

[root@master01 ~]# kubectl rollout undo deploy/deploy-demo --to-revision=3
deployment.apps/deploy-demo rolled back
[root@master01 ~]# kubectl rollout history deploy/deploy-demo             
deployment.apps/deploy-demo 
REVISION  CHANGE-CAUSE
5         kubectl apply --filename=deploy-demo-nginx-1.16.yaml --record=true
6         kubectl set image deploy deploy-demo nginx=nginx:1.14-alpine --record=true
7         <none>

[root@master01 ~]# kubectl get deploy -o wide
NAME          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES              SELECTOR
deploy-demo   3/3     3            3           42m   nginx        nginx:1.18-alpine   app=ngx-dep-pod
[root@master01 ~]# kubectl get rs -o wide
NAME                     DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES              SELECTOR
deploy-demo-567b54cd6    3         3         3       33m    nginx        nginx:1.18-alpine   app=ngx-dep-pod,pod-template-hash=567b54cd6
deploy-demo-6d795f958b   0         0         0       42m    nginx        nginx:1.14-alpine   app=ngx-dep-pod,pod-template-hash=6d795f958b
deploy-demo-95cc58f4d    0         0         0       36m    nginx        nginx:1.16-alpine   app=ngx-dep-pod,pod-template-hash=95cc58f4d
replicaset-demo          7         7         7       125m   nginx        nginx:1.18-alpine   app=nginx-pod
[root@master01 ~]# 

  提示:指定要回滾到某個歷史記錄的版本,可以使用--to-revision選項來指定歷史記錄的編號;

  查看deploy控制器的詳細資訊

[root@master01 ~]# kubectl describe deploy deploy-demo
Name:                   deploy-demo
Namespace:              default
CreationTimestamp:      Thu, 17 Dec 2020 23:40:11 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 7
Selector:               app=ngx-dep-pod
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=ngx-dep-pod
  Containers:
   nginx:
    Image:        nginx:1.18-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deploy-demo-567b54cd6 (3/3 replicas created)
Events:
  Type    Reason             Age                 From                   Message
  ----    ------             ----                ----                   -------
  Normal  ScalingReplicaSet  58m                 deployment-controller  Scaled down replica set deploy-demo-6d795f958b to 1
  Normal  ScalingReplicaSet  58m                 deployment-controller  Scaled up replica set deploy-demo-95cc58f4d to 3
  Normal  ScalingReplicaSet  58m                 deployment-controller  Scaled down replica set deploy-demo-6d795f958b to 0
  Normal  ScalingReplicaSet  55m                 deployment-controller  Scaled up replica set deploy-demo-567b54cd6 to 1
  Normal  ScalingReplicaSet  54m                 deployment-controller  Scaled down replica set deploy-demo-95cc58f4d to 2
  Normal  ScalingReplicaSet  38m                 deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 1
  Normal  ScalingReplicaSet  38m                 deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 2
  Normal  ScalingReplicaSet  38m                 deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 2
  Normal  ScalingReplicaSet  37m                 deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 1
  Normal  ScalingReplicaSet  37m                 deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 0
  Normal  ScalingReplicaSet  33m (x2 over 58m)   deployment-controller  Scaled up replica set deploy-demo-95cc58f4d to 1
  Normal  ScalingReplicaSet  33m (x2 over 58m)   deployment-controller  Scaled up replica set deploy-demo-95cc58f4d to 2
  Normal  ScalingReplicaSet  33m (x2 over 58m)   deployment-controller  Scaled down replica set deploy-demo-6d795f958b to 2
  Normal  ScalingReplicaSet  29m (x3 over 64m)   deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 3
  Normal  ScalingReplicaSet  22m (x14 over 54m)  deployment-controller  (combined from similar events): Scaled down replica set deploy-demo-6d795f958b to 2
[root@master01 ~]# 

  提示:查看deploy控制器的詳細資訊,可以看到對應pod模板,回滾的程序,以及默認更新策略等等資訊;

  自定義滾動更新策略

[root@master01 ~]# cat deploy-demo-nginx-1.14.yaml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deploy-demo
  namespace: default
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: ngx-dep-pod
  template:
    metadata:
      labels:
        app: ngx-dep-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine
        ports:
        - name: http
          containerPort: 80
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 1
  minReadySeconds: 5
[root@master01 ~]# 

  提示:定義滾動更新策略需要使用strategy這個欄位,這個欄位的值是一個物件,其中type是指定更新策略,其策略有兩種,第一種是Recreate,這種策略更新方式是新建一個新版pod,然后再洗掉一個舊版pod以這種方式滾動更新;第二種是RollingUpdate,這種策略是用于我們手動指定的策略;其中maxSurge表示最大允許超出用戶期望的pod數量(即更新時允許新建超出用戶期望的pod數量),maxUnavailable表示最大允許少于用于期望的pod數量(即更新時可以一次洗掉幾個舊版pod);最后minReadySeconds欄位不是定義更新策略的,它是spec中的一個欄位,用于限定pod最小就緒時長;以上更新策略表示,使用RollingUpdate型別策略,并指定最大新建pod超出用戶期望pod數量為2個,最大允許少于用戶期望pod數量為1個;pod最小就緒時間為5秒;

  應用配置清單

[root@master01 ~]# kubectl apply -f deploy-demo-nginx-1.14.yaml
deployment.apps/deploy-demo configured
[root@master01 ~]# kubectl describe deploy/deploy-demo
Name:                   deploy-demo
Namespace:              default
CreationTimestamp:      Thu, 17 Dec 2020 23:40:11 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 8
Selector:               app=ngx-dep-pod
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        5
RollingUpdateStrategy:  1 max unavailable, 2 max surge
Pod Template:
  Labels:  app=ngx-dep-pod
  Containers:
   nginx:
    Image:        nginx:1.14-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deploy-demo-6d795f958b (3/3 replicas created)
Events:
  Type    Reason             Age                 From                   Message
  ----    ------             ----                ----                   -------
  Normal  ScalingReplicaSet  47m                 deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 1
  Normal  ScalingReplicaSet  47m                 deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 1
  Normal  ScalingReplicaSet  42m (x2 over 68m)   deployment-controller  Scaled up replica set deploy-demo-95cc58f4d to 1
  Normal  ScalingReplicaSet  42m (x2 over 68m)   deployment-controller  Scaled up replica set deploy-demo-95cc58f4d to 2
  Normal  ScalingReplicaSet  42m (x2 over 68m)   deployment-controller  Scaled down replica set deploy-demo-6d795f958b to 2
  Normal  ScalingReplicaSet  31m (x14 over 64m)  deployment-controller  (combined from similar events): Scaled down replica set deploy-demo-6d795f958b to 2
  Normal  ScalingReplicaSet  41s (x4 over 73m)   deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 3
  Normal  ScalingReplicaSet  41s (x2 over 47m)   deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 2
  Normal  ScalingReplicaSet  41s (x2 over 47m)   deployment-controller  Scaled up replica set deploy-demo-6d795f958b to 2
  Normal  ScalingReplicaSet  34s (x2 over 47m)   deployment-controller  Scaled down replica set deploy-demo-567b54cd6 to 0
[root@master01 ~]# 

  提示:可以看到對應deploy控制器的更新策略已經更改為我們定義的策略;為了能夠看出更新的效果,我們這里先手動把pod數量調整為10個;

  擴展pod副本數量

[root@master01 ~]# kubectl scale deploy/deploy-demo --replicas=10
deployment.apps/deploy-demo scaled
[root@master01 ~]# kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-6d795f958b-5bdfw   1/1     Running   0          3m33s
deploy-demo-6d795f958b-5zr7r   1/1     Running   0          8s
deploy-demo-6d795f958b-9mc7k   1/1     Running   0          8s
deploy-demo-6d795f958b-czwdp   1/1     Running   0          3m33s
deploy-demo-6d795f958b-jfrnc   1/1     Running   0          8s
deploy-demo-6d795f958b-jw9n8   1/1     Running   0          3m33s
deploy-demo-6d795f958b-mbrlw   1/1     Running   0          8s
deploy-demo-6d795f958b-ph99t   1/1     Running   0          8s
deploy-demo-6d795f958b-wzscg   1/1     Running   0          8s
deploy-demo-6d795f958b-z5mnf   1/1     Running   0          8s
replicaset-demo-9wqj9          1/1     Running   0          100m
replicaset-demo-j75hk          1/1     Running   0          126m
replicaset-demo-k2n9g          1/1     Running   0          123m
replicaset-demo-n7fmk          1/1     Running   0          123m
replicaset-demo-q4dc6          1/1     Running   0          123m
replicaset-demo-rsl7q          1/1     Running   0          159m
replicaset-demo-twknl          1/1     Running   0          159m
[root@master01 ~]# 

  查看更新程序

[root@master01 ~]# kubectl get pod -w
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-6d795f958b-5bdfw   1/1     Running   0          5m18s
deploy-demo-6d795f958b-5zr7r   1/1     Running   0          113s
deploy-demo-6d795f958b-9mc7k   1/1     Running   0          113s
deploy-demo-6d795f958b-czwdp   1/1     Running   0          5m18s
deploy-demo-6d795f958b-jfrnc   1/1     Running   0          113s
deploy-demo-6d795f958b-jw9n8   1/1     Running   0          5m18s
deploy-demo-6d795f958b-mbrlw   1/1     Running   0          113s
deploy-demo-6d795f958b-ph99t   1/1     Running   0          113s
deploy-demo-6d795f958b-wzscg   1/1     Running   0          113s
deploy-demo-6d795f958b-z5mnf   1/1     Running   0          113s
replicaset-demo-9wqj9          1/1     Running   0          102m
replicaset-demo-j75hk          1/1     Running   0          128m
replicaset-demo-k2n9g          1/1     Running   0          125m
replicaset-demo-n7fmk          1/1     Running   0          125m
replicaset-demo-q4dc6          1/1     Running   0          125m
replicaset-demo-rsl7q          1/1     Running   0          161m
replicaset-demo-twknl          1/1     Running   0          161m
deploy-demo-578d6b6f94-qhc9j   0/1     Pending   0          0s
deploy-demo-578d6b6f94-qhc9j   0/1     Pending   0          0s
deploy-demo-578d6b6f94-95srs   0/1     Pending   0          0s
deploy-demo-6d795f958b-mbrlw   1/1     Terminating   0          4m16s
deploy-demo-578d6b6f94-95srs   0/1     Pending       0          0s
deploy-demo-578d6b6f94-qhc9j   0/1     ContainerCreating   0          0s
deploy-demo-578d6b6f94-95srs   0/1     ContainerCreating   0          0s
deploy-demo-578d6b6f94-bht84   0/1     Pending             0          0s
deploy-demo-578d6b6f94-bht84   0/1     Pending             0          0s
deploy-demo-578d6b6f94-bht84   0/1     ContainerCreating   0          0s
deploy-demo-6d795f958b-mbrlw   0/1     Terminating         0          4m17s
deploy-demo-6d795f958b-mbrlw   0/1     Terminating         0          4m24s
deploy-demo-6d795f958b-mbrlw   0/1     Terminating         0          4m24s
deploy-demo-578d6b6f94-qhc9j   1/1     Running             0          15s
deploy-demo-578d6b6f94-95srs   1/1     Running             0          16s
deploy-demo-578d6b6f94-bht84   1/1     Running             0          18s
deploy-demo-6d795f958b-ph99t   1/1     Terminating         0          4m38s
deploy-demo-6d795f958b-jfrnc   1/1     Terminating         0          4m38s
deploy-demo-578d6b6f94-lg6vk   0/1     Pending             0          0s
deploy-demo-578d6b6f94-g9c8x   0/1     Pending             0          0s
deploy-demo-578d6b6f94-lg6vk   0/1     Pending             0          0s
deploy-demo-578d6b6f94-g9c8x   0/1     Pending             0          0s
deploy-demo-578d6b6f94-lg6vk   0/1     ContainerCreating   0          0s
deploy-demo-578d6b6f94-g9c8x   0/1     ContainerCreating   0          0s
deploy-demo-6d795f958b-ph99t   0/1     Terminating         0          4m38s
deploy-demo-6d795f958b-jfrnc   0/1     Terminating         0          4m38s
deploy-demo-6d795f958b-5zr7r   1/1     Terminating         0          4m43s
deploy-demo-578d6b6f94-4rpx9   0/1     Pending             0          0s
deploy-demo-578d6b6f94-4rpx9   0/1     Pending             0          0s
deploy-demo-578d6b6f94-4rpx9   0/1     ContainerCreating   0          0s
deploy-demo-6d795f958b-5zr7r   0/1     Terminating         0          4m43s
deploy-demo-6d795f958b-ph99t   0/1     Terminating         0          4m44s
deploy-demo-6d795f958b-ph99t   0/1     Terminating         0          4m44s
deploy-demo-6d795f958b-jfrnc   0/1     Terminating         0          4m44s
deploy-demo-6d795f958b-jfrnc   0/1     Terminating         0          4m44s
deploy-demo-578d6b6f94-g9c8x   1/1     Running             0          12s
deploy-demo-6d795f958b-5zr7r   0/1     Terminating         0          4m51s
deploy-demo-6d795f958b-5zr7r   0/1     Terminating         0          4m51s
deploy-demo-578d6b6f94-lg6vk   1/1     Running             0          15s
deploy-demo-6d795f958b-9mc7k   1/1     Terminating         0          4m56s
deploy-demo-578d6b6f94-4lbwg   0/1     Pending             0          0s
deploy-demo-578d6b6f94-4lbwg   0/1     Pending             0          0s
deploy-demo-578d6b6f94-4lbwg   0/1     ContainerCreating   0          0s
deploy-demo-578d6b6f94-4rpx9   1/1     Running             0          13s
deploy-demo-6d795f958b-9mc7k   0/1     Terminating         0          4m57s
deploy-demo-578d6b6f94-4lbwg   1/1     Running             0          2s
deploy-demo-6d795f958b-wzscg   1/1     Terminating         0          4m58s
deploy-demo-578d6b6f94-fhkk9   0/1     Pending             0          0s
deploy-demo-578d6b6f94-fhkk9   0/1     Pending             0          0s
deploy-demo-578d6b6f94-fhkk9   0/1     ContainerCreating   0          0s
deploy-demo-6d795f958b-wzscg   0/1     Terminating         0          4m59s
deploy-demo-578d6b6f94-fhkk9   1/1     Running             0          2s
deploy-demo-6d795f958b-z5mnf   1/1     Terminating         0          5m2s
deploy-demo-578d6b6f94-sfpz4   0/1     Pending             0          1s
deploy-demo-578d6b6f94-sfpz4   0/1     Pending             0          1s
deploy-demo-6d795f958b-czwdp   1/1     Terminating         0          8m28s
deploy-demo-578d6b6f94-sfpz4   0/1     ContainerCreating   0          1s
deploy-demo-578d6b6f94-5bs6z   0/1     Pending             0          0s
deploy-demo-578d6b6f94-5bs6z   0/1     Pending             0          0s
deploy-demo-578d6b6f94-5bs6z   0/1     ContainerCreating   0          0s
deploy-demo-6d795f958b-czwdp   0/1     Terminating         0          8m28s
deploy-demo-6d795f958b-z5mnf   0/1     Terminating         0          5m4s
deploy-demo-578d6b6f94-sfpz4   1/1     Running             0          2s
deploy-demo-6d795f958b-5bdfw   1/1     Terminating         0          8m29s
deploy-demo-6d795f958b-9mc7k   0/1     Terminating         0          5m4s
deploy-demo-6d795f958b-9mc7k   0/1     Terminating         0          5m4s
deploy-demo-578d6b6f94-5bs6z   1/1     Running             0          1s
deploy-demo-6d795f958b-5bdfw   0/1     Terminating         0          8m30s
deploy-demo-6d795f958b-czwdp   0/1     Terminating         0          8m36s
deploy-demo-6d795f958b-czwdp   0/1     Terminating         0          8m36s
deploy-demo-6d795f958b-5bdfw   0/1     Terminating         0          8m36s
deploy-demo-6d795f958b-5bdfw   0/1     Terminating         0          8m36s
deploy-demo-6d795f958b-wzscg   0/1     Terminating         0          5m11s
deploy-demo-6d795f958b-wzscg   0/1     Terminating         0          5m11s
deploy-demo-6d795f958b-jw9n8   1/1     Terminating         0          8m38s
deploy-demo-6d795f958b-jw9n8   0/1     Terminating         0          8m38s
deploy-demo-6d795f958b-z5mnf   0/1     Terminating         0          5m14s
deploy-demo-6d795f958b-z5mnf   0/1     Terminating         0          5m14s
deploy-demo-6d795f958b-jw9n8   0/1     Terminating         0          8m46s
deploy-demo-6d795f958b-jw9n8   0/1     Terminating         0          8m46s

  提示:使用-w選項可以一直跟蹤查看pod變化程序;從上面的監控資訊可以看到,在更新時,首先是將三個pod標記為pending狀態,然后先洗掉一個pod,然后再創建兩個pod;然后又創建一個,再洗掉3個,一次進行;不管怎么洗掉和新建,對應新舊pod的數量最少要有9個,最大不超過12個;

  使用暫停更新實作金絲雀發布

[root@master01 ~]# kubectl set image deploy/deploy-demo nginx=nginx:1.14-alpine && kubectl rollout pause deploy/deploy-demo 
deployment.apps/deploy-demo image updated
deployment.apps/deploy-demo paused
[root@master01 ~]# 

  提示:以上命令會根據我們定義的更新策略,先洗掉一個pod,然后再創建3個新版pod,然后更新操作就暫停了;此時對應pod只更新了1個,然后新建了2個新pod,總共就有12個pod;

  查看pod情況

[root@master01 ~]# kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
deploy-demo-6d795f958b-df77k   1/1     Running   0          87s
deploy-demo-6d795f958b-tll8b   1/1     Running   0          87s
deploy-demo-6d795f958b-zbhwp   1/1     Running   0          87s
deploy-demo-fb957b9b-44l6g     1/1     Running   0          3m21s
deploy-demo-fb957b9b-7q6wh     1/1     Running   0          3m38s
deploy-demo-fb957b9b-d45rg     1/1     Running   0          3m27s
deploy-demo-fb957b9b-j7p2j     1/1     Running   0          3m38s
deploy-demo-fb957b9b-mkpz6     1/1     Running   0          3m38s
deploy-demo-fb957b9b-qctnv     1/1     Running   0          3m21s
deploy-demo-fb957b9b-rvrtf     1/1     Running   0          3m27s
deploy-demo-fb957b9b-wf254     1/1     Running   0          3m12s
deploy-demo-fb957b9b-xclhz     1/1     Running   0          3m22s
replicaset-demo-9wqj9          1/1     Running   0          135m
replicaset-demo-j75hk          1/1     Running   0          161m
replicaset-demo-k2n9g          1/1     Running   0          158m
replicaset-demo-n7fmk          1/1     Running   0          158m
replicaset-demo-q4dc6          1/1     Running   0          158m
replicaset-demo-rsl7q          1/1     Running   0          3h14m
replicaset-demo-twknl          1/1     Running   0          3h14m
[root@master01 ~]# kubectl get pod|grep "^deploy.*" |wc -l
12
[root@master01 ~]# 

  提示:之所以多兩個是因為我們在更新策略中定義允許最大超出用戶期望2個pod;

  恢復更新

[root@master01 ~]# kubectl rollout resume deploy/deploy-demo && kubectl rollout status deploy/deploy-demo
deployment.apps/deploy-demo resumed
Waiting for deployment "deploy-demo" rollout to finish: 3 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 6 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 out of 10 new replicas have been updated...
Waiting for deployment "deploy-demo" rollout to finish: 9 of 10 updated replicas are available...
Waiting for deployment "deploy-demo" rollout to finish: 9 of 10 updated replicas are available...
deployment "deploy-demo" successfully rolled out
[root@master01 ~]# 

  提示:resume表示恢復剛才暫停的更新操作;status是用來查看對應更新程序;

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/236326.html

標籤:其他

上一篇:CentOS8 部署squid代理服務器

下一篇:widnows上用vs2017編譯linux程式鏈接lib的問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more