Table of Contents
Deployments
建立 Deployment
下面是 Deployment 示例。建立一個 ReplicaSet 展開 2 個 nginx
Pods:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17-alpine
ports:
- containerPort: 80
更新 Deployment
Deployment 更新策略
.spec.strategy
策略指定用於用新 Pods 替換舊 Pods 的策略。
.spec.strategy.type
可以是 Recreate
或 RollingUpdate
。RollingUpdate
是默認值。
重新建立 Deployment
當 .spec.strategy.type==Recreate
,所有現有的 Pods 在建立新 Pods 之前被殺死。
滾動更新 Deployment
Deployment 會在 .spec.strategy.type==RollingUpdate
時,采取 滾動更新 的方式更新 Pods。
可以指定 maxUnavailable
和 maxSurge
來控制滾動更新操作。
最大不可用
.spec.strategy.rollingUpdate.maxUnavailable
,表示在更新過程中不可用的 Pods 數量,默認值為 25%。
該值可以是絕對數字(例如:5)或所需 Pods 的百分比(例如:10%)。
如果 .spec.strategy.rollingUpdate.maxSurge
為 0,則該值不能為 0。
例如,當此值設置為 30% 時,滾動更新開始時會立即將舊 ReplicaSet 向下擴展到期望 Pods 的70%。
新 Pods 準備就緒後,可以縮放舊 ReplicaSet 進一步向下,然後向上擴展新的 ReplicaSet ,確保可用的 Pods 總數在更新期間,任何時候 Pods 都至少為總量的 70% 。
最大增量
.spec.strategy.rollingUpdate.maxSurge
是設定可以超過 deployment 所設定副本 Pods 數量的最大值,默認值為 25%。
該值可以是絕對數(例如,5)或所需 Pods 的百分比(例如,10%)。
如果 MaxUnavailable
0,則值不能為 0。
例如,當此值設置為 30% 時,啟動滾動更新後,會立即展開新的 ReplicaSet ,以便新舊 Pod 的總數不超過所需的 130%。一旦舊 Pods 被殺死,新的 ReplicaSet 可以進一步擴展,確保更新期間任何時間運行的 Pods 總數最多為所需 Pods 總數的130%。
Deployment 失敗等待時間
.spec.progressDeadlineSeconds
是一個可選欄位,用於指定在系統報告 Deployment 失敗進行之前系統需要等待秒數失敗的,條件包含Type=Progressing
、 Status=False
、 Reason=ProgressDeadlineExceeded
,默認值為 600s。
在此期間部署控制器將繼續重試部署, 將來,一旦實現自動回滾功能,Deployment 控制器將在觀察到這種情況後立即回滾Deployment。
如果指定,則此欄位需要大於 .spec.minReadySeconds
。
NOTE:
Kubernetes 除已報告為 Reason = ProgressDeadlineExceeded 的狀態外,對已停止的 Deployment 不執行任何操作。
較高級別的協調者可以利用它並採取相應的措施,例如,將 Deployment 回滾到其先前版本。NOTE:
如果您暫停部署,Kubernetes 不會在指定的期限內檢查進度。
您可以在部署過程中安全地暫停部署並繼續執行,而不會觸發超出期限的條件。
最小就緒時間
.spec.minReadySeconds
是一個可選字段,用於指定新創建的 Pod 在沒有任意容器崩潰情況下的最小就緒時間,以便將其視為可用。默認值為 0(Pod 在準備就緒後立即將被視為可用)。了解有關何時 Pod 被視為已準備就緒,參考容器探針。
Deployment 更新方法
說明:
僅當 Deployment Pod 模板(即.spec.template
)時,才會自動觸發 Deployment 更新,
其他更新(如 scaling Deployment ),則不會觸發更新。
已經運行的 Pod 副本:
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-784f598b6c-c96kp 0/1 ContainerCreating 0 3s
nginx-deployment-784f598b6c-lfn7p 0/1 ContainerCreating 0 3s
可以使用以下方式更新 Deploymeny 的設定:
kubectl set image deployment/nginx-deployment nginx=nginx:1.18-alpine
kubectl edit deployment/nginx-deployment
查看 Deployment 更新過程:
[root@master ~]# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out
Deployment 更新示意圖:
flowchart TB
subgraph 1
a1([Deploymnet]) --> a2([RS old])
a2 --> a3([appv1-1])
a2 --> a4([appv1-2])
end
subgraph 2
b1([Deploymnet]) --> b2([RS old])
b1 --> b3([RS new])
b2 --> b4([appv1-1])
b3 --> b5([appv2-1])
end
subgraph 3
c1([Deploymnet]) --> c2([RS old])
c1 --> c3([RS new])
c3 --> c4([appv2-1])
c3 --> c5([appv2-2])
end
1 --> 2
2 --> 3
下面列出 nginx-deployment 的詳細事件資訊:
[root@master ~]# kubectl describe deployment/nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Sun, 19 Jul 2020 14:24:31 +0800
Labels:
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
...
NewReplicaSet: nginx-deployment-559fdddb7b (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-784f598b6c to 2
Normal ScalingReplicaSet 20m deployment-controller Scaled up replica set nginx-deployment-559fdddb7b to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-784f598b6c to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-559fdddb7b to 2
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-784f598b6c to 0
Deployment Rollout
確認 rollout 的歷史紀錄:
[root@master ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1
2
說明:
可以指定--record
標志來寫入在資源注釋kubernetes.io/change-cause
中執行的命令。
指定查看某版本的詳細資訊:
[root@master ~]# kubectl rollout history deployment/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=559fdddb7b
Containers:
nginx:
Image: nginx:1.18-alpine
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
撤銷本次發布,回滾到上一次部屬版本:
kubectl rollout undo deployment.v1.apps/nginx-deployment
指定回滾到某個版本:
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
暫停和恢復 Deployment
對於複雜的設定修改,為了避免頻繁觸發更新,可以先暫停 Deployment 的更新操作,等待修改完成後再恢復。
暫停:
kubectl rollout pause deployment.v1.apps/nginx-deployment
恢復:
kubectl rollout resume deployment.v1.apps/nginx-deployment