如下是rook爲一個pod準備可用塊存儲的過程:node
1. rook operator運行,而且在k8s每臺機器上運行一個rook agent的pod;app
2. 用戶建立一個pvc,並指定storageclass使用rook.io/block provisionor;函數
3. operator provisionor的Provision()函數被調用,用以在集羣中建立一個block image。此時,Provision階段已完成,pvc/pv被考慮綁定到一塊兒;同步
4. 當消費該pvc的pod被建立時,kubelet將會調用Rook Flexvolume的Mount()函數,用以消費預約的存儲;io
ps:kubelet調用的Mount()是一個阻塞型的函數,只有在driver的mapping/mounting操做完成且agent同步了該操做後,纔會繼續往下執行。class
5. 隨後,agent將會按照CRD的描述建立一個volume並attach到該物理機上;(?The agent then creates a volume attach CRD that represents the attachment of the cluster volume to the node. )集羣
6. 接着,agent將volume map到本地機器上,並更新CRD的狀態以及設備的路徑值(例如/dev/rbd0)配置
7. 控制權接着轉交給driver,若是mapping可以成功執行,則driver將把指定的設備mount到指定的路徑上。若在配置文件中還指明瞭文件系統的類型,則driver還會對該捲進行文件系統格式化操做。map
8. driver將反饋kubelet Mount()操做已成功 im