<track id="awmdf"></track><acronym id="awmdf"></acronym>
    <pre id="awmdf"><strike id="awmdf"></strike></pre>
    <p id="awmdf"></p>
    <td id="awmdf"><option id="awmdf"></option></td>
          1. <object id="awmdf"><label id="awmdf"></label></object>

            智匯華云 | 通過iscsi為容器提供存儲

            來源:微信公眾號 更新時間:2022-02-07
            將遠端的存儲通過iscsi協議為容器提供塊存儲,是一種通用的容器存儲解決方案。本期智匯華云將通過kubernetes中的in-tree方式來演示該例子,并分析其中的細節。iSCSI協議是C/S架構,client是iSCSI initiator,server端為iSCSI target。iSCSI協議的主要功能是利用TCP/IP網絡,在主機系統(可稱為initiator)和目標存儲設備(稱為target)之間進行大量的數據封裝和可靠傳輸過程。主要分成兩個組成部分,分別為iSCSI服務器端和iSCSI客戶端

            將遠端的存儲通過iscsi協議為容器提供塊存儲,是一種通用的容器存儲解決方案。本期智匯華云將通過kubernetes中的in-tree方式來演示該例子,并分析其中的細節。

            /upload/image/20220208/d8769de4cc4b4f0b6b0123c2a6852adf.jpeg

            /upload/image/20220208/99d81f066a245a7a86d51c20008374d4.png

            iSCSI協議是C/S架構,client是iSCSI initiator,server端為iSCSI target。iSCSI協議的主要功能是利用TCP/IP網絡,在主機系統(可稱為initiator)和目標存儲設備(稱為target)之間進行大量的數據封裝和可靠傳輸過程。主要分成兩個組成部分,分別為iSCSI服務器端和iSCSI客戶端

            iSCSI服務器端 (iSCSI Target)

            iSCSI服務器端為iSCSI target,這是I/O操作的執行者。主要是為了導出一個或多個塊設備供啟動者(initiator)使用,可以通過硬件和軟件的方式來實現。在Linux中可以使用scsi-target-utils軟件包來模擬實現。在使用iSCSI時,會在 iSCSI 儲存設備上去建立 LUN(Logical Unit Number)來提供給具備 iSCSI Initiator 功能的主機來存取 數據的。LUN 好比是個“邏輯單位磁碟”,物理上通常是由數個實體磁碟( RAID 或 LVM 技術的技術實現)所組成。LUN ID由iSCSI目標設備(Target)分配。iSCSI 啟動端(Initiator)設備當前支持在每個目標設備(Target)中導出最多256個LUN。即最大支持16個target。

            iSCSI target設備名稱采用如下格式來命名:iqn..[:],需要事先進行配置,保證唯一性。

            iSCSI客戶端 (iSCSI Initiator)

            iSCSI客戶端為iSCSI initiator,這是I/O操作的發起者。是I/O操作的發起者,需要通過發現過程請求遠端快設備。在Linux系統中可以通過軟件來模擬,需要安裝iSCSI設備驅動。如iscsi-initiator-utils。

            實驗

            可以通過iSCSI將遠程的磁盤分區映射到本地之后就可以像使用本地磁盤一樣,將該遠程盤進行格式化以及掛載操作,給容器使用。

            我們通過 scsi-target-utils來實現iSCSI target,將主機上的/dev/sdb磁盤分區作為Lun,如下圖所示

            WechatIMG439.jpeg

            之后在kubernetes的node節點上需要事先安裝iscsi-initiator-utils,并且設置對應的initiatorname,如果開啟了acl認證,需要將node節點的initiatorname添加到acl里面。

            之后創建一個pod,其中指定一個存在的iscsi lun對接信息如下

            /upload/image/20220208/b2843e46dd933bbd45a31fdaa92d79d5.png

            之后可以看到遠程的卷被成功的掛載到node上,被容器所使用

            Volume.iscsi說明

            pod的spec中可以在volumes.iscsi中指定對接信息包括如下

            WechatIMG443.png

            源碼分析

            掛載階段

            pod調度到某個node上,之后由kubelet中的volumemanager完成對于volume attach&mount操作,核心代碼位于kubernetes/pkg/volume/iscsi目錄下,在volume掛載的過程中,會首先調用WaitForAttach()完成掛載流程,SetUpDevice()掛載到某個容器所對應的目錄。iscsiAttacher.WaitForAttach()流程如圖所示:

            WechatIMG444.jpeg

            Step1: 通過iscsiadm -m iface -l b. InitIface -o show獲取對應的iscsiTransport,如果不額外指定的話b. InitIface為default,iscsiTransport為tcp.

            Step2: 如果pod的定義中指定iscsi.initiatorName ,則需要cloneIface(), 指定iscsi.initiatorName需要與node的不一致,這樣當開啟ACL initiatorName控制的時候,pod可以運行在不同的節點上。

            Step3: 基于iqn號獲取lock,主要解決的場景為相同target下不同volume同時掛載或者login與logout操作并發進行,這個鎖引入的目的主要是為了后面volume在Detach的時候,需要根據isSessionBusy來判斷是否需要logout,斷開node與target的所有鏈接。

            Step4:GetISCSIPortalHostMapForTarget主要根據target iqn獲取到login到該target上的scsi hosts number, 返回的結構為

            WechatIMG445.png

            通過這個map的引入后面用于判斷是否需要login,還是直接通過scanOneLun()來發現接入的Lun,避免沒有必要的login操作。scanOneLun之后會發現掛載到node上的device。

            Step5: 根據volomeMode的類型是直接的PersistentVolumeBlock還是PersistentVolumeFileSystem模式,二者的區別在于是否需要對device進行格式化,創建文件系統,之后創建globalPDPath目錄,目錄位置采用如下格式

            /var/lib/kubelet/plugins/kubernetes.io/iscsi/ /{ifaceName}/{portal-some_iqn-lun-lun_id},之后持久化的iscsi disk元數據到globalPDPath目錄下iscsi.json,元數據主要用于DetachVolume的時候會涉及到,內容如下所示: 

            WechatIMG446.png

            在WaitForAttach 階段完成了device遠端掛載、格式化以及掛載到globalPDPath目錄下,SetUpDevice流程較為簡單主要是將globalPDPath mount –bind到容器對應的目錄,之后對目錄進行SetVolumeOwnership()操作。

            WechatIMG447.png

            卸載階段

            pod銷毀的時候,會由kubelet完成volume的umount&detach操作,核心代碼位于kubernetes/pkg/volume/iscsi目錄下,主要完成umount node上的掛載信息,之后根據globalPDPath目錄下iscsi.json元數據信息來完成TearDownDevice斷開device,之后清理掉globalPDPath。

            WechatIMG448.png

            Step1: 根據mntPath掛載點信息獲得device盤符,之后Unmount()掉掛載點信息

            Step2:loadISCSI中根據mntPath獲得該iscsi掛載信息的元數據信息,其中包括iqn iface volName initiatorName等信息

            Step3: deleteDevices()中通過對device進行echo 1> delete操作,刪除掉盤符

            Step4:基于iqn獲取targetLocks.LockKey,之后判斷該target在node上是否存在其他的盤掛載,如果沒有存在,則進行iscsi logout操作,斷開node與target之后的連接

            總結

            In-tree下的iscsi方式為容器提供iscsi的存儲類似于靜態供應,需要事先系統管理員創建好后端的iscsi存儲,之后容器提供指定對應的配置來使用。對于已經存在支持iscsi協議掛載的后端存儲,并且不具備動態功能csi插件的場景下具有一定的使用場景。

            在線咨詢
            400-808-4000
            免費試用
            中文字幕二区亚洲综合