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 ~