如下是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