kubernetes k8s container ReplicaSet Deployment Rolling Update Kubectl Create Service

For K8S Beginner EP 11:[探究] 更新機制 Rolling Update vs. Recreate

K8S預設就是Rolling Update

先說一個重要的觀念:「若沒有任何設定,K8S預設將以Rolling Update策略執行更新!」

Rolling Update vs. Recreate

Rolling Update又名「滾動更新」,顧名思義,K8S提供一種滾動的方式來更新Pod,讓服務在不中斷 (或僅極少的瞬斷) 的方式完成更新作業。

示意圖如下:

Recreate又名「重新建立」,就像傳統的更新作業,K8S將把既有的Pod刪除,直接以新的Pod取而代之,在這段期間,服務將中斷,直到第一個Pod成功啟動至可以提供服務為止。

使用Recreate策略部署

步驟1:YAML檔內容如下,在Spec區段放入strategy標籤,其內容指定為type: Recreate。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-server-replicaset
  labels:
    app: frontend
    env: production
spec:
  selector:
    matchLabels:
      app: frontend
  replicas: 3
  strategy:
    type: Recreate
  template:
    metadata:
      name: nginx-server
      labels:
        app: frontend
    spec:
      containers:
        - name: nginx-server
          image: nginx;1.23

步驟2:使用kubectl set指令調整Pod的Image版本:

$ kubectl set image deployment.apps/nginx-server-replicaset nginx-server=nginx:1.24.0

步驟3:使用kubectl describe來看一下Events,可以發現K8S一次停止所有Pod,並重新部署新的3個Pod。

Name:               nginx-server-replicaset
Namespace:          default
CreationTimestamp:  Sun, 23 Apr 2023 20:09:48 +0800
Labels:             app=frontend
                    env=production
Annotations:        deployment.kubernetes.io/revision: 2
Selector:           app=frontend
Replicas:           3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:       Recreate
MinReadySeconds:    0
Pod Template:
  Labels:  app=frontend
  Containers:
   nginx-server:
    # Image版本更新為1.24.0
    Image:        nginx:1.24.0
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-server-replicaset-55bc549986 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set nginx-server-replicaset-67b95b8b9c to 3
  # 停掉3個Pod
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled down replica set nginx-server-replicaset-67b95b8b9c to 0 from 3
  # 啟動3個Pod
  Normal  ScalingReplicaSet  16s   deployment-controller  Scaled up replica set nginx-server-replicaset-55bc549986 to 3

使用RollingUpdate策略部署

步驟1:YAML檔內容如下,在Spec區段放入strategy標籤,其內容指定為RollingUpdate。

  • maxSurge:每次新建/部署的Pod數量
  • maxUnavailable:每次無法提供服務 (或刪除/暫停/移除) Pod的數量
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-server-replicaset
  labels:
    app: frontend
    env: production
spec:
  selector:
    matchLabels:
      app: frontend
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      name: nginx-server
      labels:
        app: frontend
    spec:
      containers:
        - name: nginx-server
          image: nginx

步驟2:使用kubectl set指令調整Pod的Image版本:

$ kubectl set image deployment.apps/nginx-server-replicaset nginx-server=nginx:1.24.0

步驟3:使用kubectl describe來看一下Events,K8S一次停止一個Pod,並重新部署一個新的Pod,直到全部更新完成。

Name:                   nginx-server-replicaset
Namespace:              default
CreationTimestamp:      Sun, 23 Apr 2023 20:40:23 +0800
Labels:                 app=frontend
                        env=production
Annotations:            deployment.kubernetes.io/revision: 2
Selector:               app=frontend
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  app=frontend
  Containers:
   nginx-server:
    Image:        nginx:1.24.0
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-server-replicaset-55bc549986 (3/3 replicas created)
# K8S依序一個一個Pod更新
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  50s   deployment-controller  Scaled up replica set nginx-server-replicaset-67b95b8b9c to 3
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled up replica set nginx-server-replicaset-55bc549986 to 1
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled down replica set nginx-server-replicaset-67b95b8b9c to 2 from 3
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled up replica set nginx-server-replicaset-55bc549986 to 2 from 1
  Normal  ScalingReplicaSet  10s   deployment-controller  Scaled down replica set nginx-server-replicaset-67b95b8b9c to 1 from 2
  Normal  ScalingReplicaSet  10s   deployment-controller  Scaled up replica set nginx-server-replicaset-55bc549986 to 3 from 2
  Normal  ScalingReplicaSet  7s    deployment-controller  Scaled down replica set nginx-server-replicaset-67b95b8b9c to 0 from 1

~ END ~


, ,

Related posts

Latest posts