You are currently viewing Kubernetes Deployment 紀錄

Kubernetes Deployment 紀錄

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 可以是 RecreateRollingUpdateRollingUpdate是默認值。

重新建立 Deployment

.spec.strategy.type==Recreate,所有現有的 Pods 在建立新 Pods 之前被殺死。

滾動更新 Deployment

Deployment 會在 .spec.strategy.type==RollingUpdate時,采取 滾動更新 的方式更新 Pods。
可以指定 maxUnavailablemaxSurge 來控制滾動更新操作。

最大不可用

.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=ProgressingStatus=FalseReason=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 副本:

[[email protected] ~]# 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 更新過程:

[[email protected] ~]# 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 的詳細事件資訊:

[[email protected] ~]# kubectl describe deployment/nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sun, 19 Jul 2020 14:24:31 +0800
Labels:                 <none>
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 的歷史紀錄:

[[email protected] ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

說明:
可以指定 --record 標志來寫入在資源注釋kubernetes.io/change-cause中執行的命令。

指定查看某版本的詳細資訊:

[[email protected] ~]# 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:        <none>
    Mounts:     <none>
  Volumes:      <none>

撤銷本次發布,回滾到上一次部屬版本:

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

Beck Yeh

熱愛學習於 Linux 與 程式設計 在網站中分享各式各樣學習到的新知識

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料