阿里雲《雲原生》公開課筆記 第六章 應用編排與管理:Deployment

課程文字:https://edu.aliyun.com/lesson_1651_18354?spm=5176.10731542.0.0.349620behMwqhU#_18354

Deployment:管理部署發佈的控制器

主要作用

  • 定義一種pod的期望數量
  • 配置pod發佈方式
  • 更新中發生問題,可以一鍵回滾

Deployment的yaml文件

image

  • kubectl get deployment 命令可查看deployment總體情況
  • kubectl get pod可以查看到部署的情況:Pod 的 ownerReferences 即 Pod 所屬的 controller 資源,並不是 Deployment,而是一個 ReplicaSet。這個 ReplicaSet 的 name,其實是 nginx-deployment 加上 pod.template-hash,所有的 Pod 都是 ReplicaSet 創建出來的,而 ReplicaSet 它對應的某一個具體的 Deployment.template 版本。

更新鏡像

  • kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
  • kubectl 後面有一個 set image 固定寫法,這裏指的是設定鏡像;其次是一個 deployment.v1.apps,這裏也是一個固定寫法,表明要操作的資源類型,deployment 是資源名、v1 是資源版本、apps 是資源組,這裏也可以簡寫爲 deployment 或者 deployment.apps,比如說寫爲 deployment 的時候,默認將使用 apps 組 v1 版本。
  • 更新的 deployment 的 name,nginx-deployment;再往後的 nginx 其實指的是 template,也就是 Pod 中的 container.name;這裏我們可以注意到:一個 Pod 中,其實可能存在多個 container,需要指定想要更新的鏡像的 container.name,就是 nginx。
    image

快速回滾

image

  • 回滾的時候,其實是創建了 3 箇舊版本的 pod,而並非把先前的 3 個 pod 恢復。
  • 發佈會新建replicaSet,回滾不會

DeploymentStatus

image

  • Processing 指的是 Deployment 正在處於擴容和發佈中。Processing 狀態的 deployment,它所有的 replicas 及 Pod 副本全部達到最新版本,而且是 available,這樣的話,就可以進入 complete 狀態。而 complete 狀態如果發生了一些擴縮容的話,也會進入 processing 這個處理工作狀態。

Deployment和ReplicaSet的關係

image

Deployment控制器

image

  • 原理:所有的控制器都是通過 Informer 中的 Event 做一些 Handler 和 Watch。這個地方 Deployment 控制器,其實是關注 Deployment 和 ReplicaSet 中的 event,收到事件後會加入到隊列中。而 Deployment controller 從隊列中取出來之後,它的邏輯會判斷 Check Paused,這個 Paused 其實是 Deployment 是否需要新的發佈,如果 Paused 設置爲 true 的話,就表示這個 Deployment 只會做一個數量上的維持,不會做新的發佈。
    • Check paused 爲 Yes 也就是 true 的話,那麼只會做 Sync replicas。也就是說把 replicas sync 同步到對應的 ReplicaSet 中,最後再 Update Deployment status,那麼 controller 這一次的 ReplicaSet 就結束了。
    • paused 爲 false 的話,它就會做 Rollout,也就是通過 Create 或者是 Rolling 的方式來做更新,更新的方式其實也是通過 Create/Update/Delete 這種 ReplicaSet 來做實現的。

ReplicaSet控制器

image

  • 當 Deployment 分配 ReplicaSet 之後,ReplicaSet 控制器本身也是從 Informer 中 watch 一些事件,這些事件包含了 ReplicaSet 和 Pod 的事件。從隊列中取出之後,ReplicaSet controller 的邏輯很簡單,就只管理副本數。也就是說如果 controller 發現 replicas 比 Pod 數量大的話,就會擴容,而如果發現實際數量超過期望數量的話,就會刪除 Pod。

spec字段解析

  • MinReadySeconds:Deployment 會根據 Pod ready 來看 Pod 是否可用,但是如果設置了 MinReadySeconds 之後,比如設置爲 30 秒,那 Deployment 就一定會等到 Pod ready 超過 30 秒之後才認爲 Pod 是 available 的。Pod available 的前提條件是 Pod ready,但是 ready 的 Pod 不一定是 available 的,它一定要超過 MinReadySeconds 之後,纔會判斷爲 available;
  • revisionHistoryLimit:保留歷史 revision,即保留歷史 ReplicaSet 的數量,默認值爲 10 個。這裏可以設置爲一個或兩個,如果回滾可能性比較大的話,可以設置數量超過 10;
  • paused:paused 是標識,Deployment 只做數量維持,不做新的發佈,這裏在 Debug 場景可能會用到;
  • progressDeadlineSeconds:前面提到當 Deployment 處於擴容或者發佈狀態時,它的 condition 會處於一個 processing 的狀態,processing 可以設置一個超時時間。如果超過超時時間還處於 processing,那麼 controller 將認爲這個 Pod 會進入 failed 的狀態。

升級策略字段

  • Deployment 在 RollingUpdate 中主要提供了兩個策略,一個是 MaxUnavailable,另一個是 MaxSurge。這兩個字段解析的意思,可以看下圖中詳細的 comment,或者簡單解釋一下:
    • MaxUnavailable:滾動過程中最多有多少個 Pod 不可用;
    • MaxSurge:滾動過程中最多存在多少個 Pod 超過預期 replicas 數量。
  • 比如當用戶的資源足夠,且更注重發佈過程中的可用性,可設置 MaxUnavailable 較小、MaxSurge 較大。但如果用戶的資源比較緊張,可以設置 MaxSurge 較小,甚至設置爲 0,這裏要注意的是 MaxSurge 和 MaxUnavailable 不能同時爲 0。
    • 兩者同時爲 0 的話,MaxSurge 保證不能新擴 Pod,而 MaxUnavailable 不能保證 ReplicaSet 中有 Pod 是 available 的,這樣就會產生問題。所以說這兩個值不能同時爲 0。用戶可以根據自己的實際場景來設置對應的、合適的值。

自測題目

https://gitchat.csdn.net/columnTopic/5d75e21809afba1228a0522c

通過 Deployment 不能實現以下功能:(單選題)C

  • A. 應用擴縮容
  • B. 應用發佈回滾
  • C. 應用重啓
  • D. 應用副本數量維持

一個 Deployment 中,哪些 labels/selector 必須一致:(單選題)C

  • A. deployment.Labels 與 deployment.Spec.Template.Labels一致
  • B. deployment.Labels 與 deployment.Spec.Selector 一致
  • C. deployment.Spec.Selector 與 deployment.Spec.Template.Labels 一致
  • D. deployment.Labels、deployment.Spec.Selector、deployment.Spec.Template.Labels 三者都要一致

創建 Deployment 描述文件中寫的 template,用處不包括:(單選題)D

  • A. 聲明 Pod 的掛載目錄
  • B. 計算 ReplicaSet 的 hash
  • C. 指定鏡像版本
  • D. 指定期望數量

以下哪個明顯不是 deployment 擴容出來的 pod name ?(單選題)B

  • A. nginx-deployment-77964d65f-5h52m
  • B. nginx-deployment-676cc869
  • C. nginx-deployment-6987cdb55b-r4tnr
  • D. nginx-deployment-5c689d88bb-vqf4b

以下關於 revision 歷史版本說法正確的是:(單選題)B

  • A. 使用 deployment 可以 rollout 回滾到任何一個歷史上的版本
  • B. pod-template-hash 標識了 pod 的 revision 版本
  • C. revisionHistoryLimit 字段不設置默認沒有數量限制
  • D. 更新了 deployment 任意字段,最新 revision 會發生變化

以下關於 paused 說法錯誤的是:(單選題)D

  • A. 可以在 deployment 發佈的過程中修改 paused 字段
  • B. paused 默認值爲 false
  • C. paused 不可以用來暫停擴縮容操作
  • D. deployment controller 在發佈出現問題時會自動設置 paused

關於 MaxUnavailable 以下說法正確的是:(單選題)B

  • A. MaxUnavailable 不可以設置爲 0,否則無法發佈 (可以設置爲0,必須刪除舊的,創建新的)
  • B. MaxUnavailable 可以設置超過 replicas
  • C. MaxUnavailable 可以和 MaxSurge 同時設置爲 0 (不可以同時爲0)
  • D. MaxUnavailable 可以設置超過 100% (升級更新的字段,最多100%)

Deployment 與 ReplicaSet 的關係與以下哪組資源最像?(單選題)C

  • A. Pod 與 Node
  • B. Pod 與 Container
  • C. ReplicaSet 與 Pod
  • D. Deployment 與 Pod

指定 Deployment 回滾到某個歷史版本執行成功的過程中,不會發生以下哪些事件:(多選題)BC

  • A. Pod 創建和銷燬
  • B. ReplicaSet 創建和銷燬
  • C. Deployment 期望數量變化
  • D. Deployment template 變化

以下關於 Deployment 的說法正確的有哪些?(多選題)AC

  • A. Deployment 下 running 的 Pod 數量可能大於 replicas 數量
  • B. Deployment 更新鏡像時一定會創建一個 ReplicaSet
  • C. Deployment 回滾時會創建一個 ReplicaSet
  • D. 滾動發佈的時候 MaxUnavailable 和 MaxSurge 可以同時設爲 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章