備戰CKA每日一題——第3天

  • 2019 年 11 月 25 日
  • 筆記

昨日考題

在Kubernetes PVC+PV體系下通過CSI實現的volume plugins動態創建pv到pv可被pod使用有哪些組件需要參與?

A. PersistentVolumeController + CSI-Provisoner + CSI controller pluginB. AttachDetachController + CSI-Attacher + CSI controller pluginC. Kubelet + CSI node plugin

昨日答案

ABC

昨日解析

k8s中,利用PVC 描述Pod 所希望使用的持久化存儲的大小,可讀寫許可權等,一般由開發人員去創建;利用PV描述具體存儲類型,存儲地址,掛載目錄等,一般由運維人員去提前創建。而不是直接在pod里寫上volume的資訊。一來可以使得開發運維職責分明,二來利用PVC、PV機制,可以很好擴展支援市面上不同的存儲實現,如k8s v1.10版本對Local Persistent Volume的支援。

我們試著理一下Pod創建到volume可用的整體流程。

用戶提交請求創建pod,PersistentVolumeController發現這個pod聲明使用了PVC,那就會幫它找一個PV配對。

沒有現成的PV,就去找對應的StorageClass,幫它新創建一個PV,然後和PVC完成綁定。

新創建的PV,還只是一個API 對象,需要經過「兩階段處理」,才能變成宿主機上的「持久化 Volume」真正被使用:

第一階段由運行在master上的AttachDetachController負責,為這個PV完成 Attach 操作,為宿主機掛載遠程磁碟;

第二階段是運行在每個節點上kubelet組件的內部,把第一步attach的遠程磁碟 mount 到宿主機目錄。這個控制循環叫VolumeManagerReconciler,運行在獨立的Goroutine,不會阻塞kubelet主控制循環。

完成這兩步,PV對應的「持久化 Volume」就準備好了,POD可以正常啟動,將「持久化 Volume」掛載在容器內指定的路徑。

k8s支援編寫自己的存儲插件FlexVolume 與 CSI。不管哪種方式,都需要經過「兩階段處理」,FlexVolume相比CSI局限性大,一般我們採用CSI方式對接存儲。

CSI 插件體系的設計思想把這個Provision階段(動態創建PV),以及 Kubernetes 里的一部分存儲管理功能,從主幹程式碼里剝離出來,做成了幾個單獨的組件。這些組件會通過 Watch API 監聽 Kubernetes 里與存儲相關的事件變化,比如 PVC 的創建,來執行具體的存儲管理動作。

上圖中CSI這套存儲插件體系中三個獨立的外部組件(External Components),即:Driver Registrar、External Provisioner 和 External Attacher,對應的是從 Kubernetes 項目裡面剝離出來的部分存儲管理功能。

我們需要實現Custom Components這一個二進位,會以gRpc方式提供三個服務:CSI Identity、CSI Controller、CSI Node。

Driver Registrar 組件,負責將插件註冊到 kubelet 裡面;Driver Registrar調用CSI Identity 服務來獲取插件資訊;External Provisioner 組件監聽APIServer 里的 PVC 對象。當一個 PVC 被創建時,它就會調用 CSI Controller 的 CreateVolume 方法,創建對應 PV;

External Attacher 組件負責Attach階段。Mount階段由kubelet里的VolumeManagerReconciler控制循環直接調用CSI Node服務完成。

兩階段完成後,kubelet將mount參數傳遞給docker,創建、啟動容器。

整體流程如下圖:

今日考題

通過單個命令創建一個deployment並暴露Service。deployment和Service名稱為cka-1120,使用nginx鏡像, deployment擁有2個pod