承接上文,塊存儲的CSI要比對象存儲復雜一些,但總的處理邏輯還是一致的。下面以華為fusionstorage的CSI為例進行介紹,該插件支持了多個后端存儲,如fusionstorage和oceanstor。下面是CSI插件與后端存儲(fusionstorage)交互用到的配置文件。其中pools
為事先創建好的存儲池,parameters
為所有k8s的node節點的hostname:ip
對,用於執行attach塊存儲操作。
csi.json: |
{
"backends": [
{
"storage": "fusionstorage-san",
"name": "***",
"url": "https://*.*.*.*:28443",
"user": "***",
"password": "***",
"pools": ["***"],
"parameters": {"SCSI": {"***": "*.*.*.*"}}
}
]
}
如上圖所示,Node上的CSI容器掛載了Node的/dev
,/etc
,/var/lib/kubelet
目錄。整體掛載流程為:在后端存儲創建一個卷(如果不存在),並將其attach到node節點的/dev目錄下(具體的attach動作由iSCSI客戶端,NFS,FC等方式完成);由於容器掛載了/dev目錄,在容器中直接格式化該塊存儲並掛載到/var/lib/kubelet中的pod目錄即可。/etc目錄只用於在csi容器中獲取node節點的hostname(PS:在容器中掛載node節點的/dev和/etc目錄是比較危險的,如果容器損壞了這些目錄,可能導致node節點的系統錯誤)。
創建並掛載卷的調用過程如下(下載):
參考: