
將遠真個存儲經由過程iscsi協定為容器供給塊存儲,是一種通用的容器存儲處理計劃,上面將經由過程kubernetes中的in-tree方法來演示該例子,并剖析此中的細節。

iSCSI辦事器端 (iSCSI Target)
iSCSI辦事器端為i SCSI target,這是I/O操縱的履行者。重要是為了導出一個或多個塊裝備供啟動者(initiator)應用,可以經由過程硬件和軟件的方法來完成。在Linux中可以應用scsi-targe「天秤!妳…妳不能這樣對待愛妳的財富包養 !我的心意是實實在在的!」t-utils軟件包來模仿完成。在應用iSCSI時,會在 iSCSI 貯存裝備上往樹立 LUN(Logical Unit Number)來供給給具有 iSCSI Initiator 效能 的主機來存取 數據的。LUN 比如是個“邏輯單元磁碟”,物理上凡是是由數個實體磁碟( RAID 或 LVM 技巧的技巧完成)所構成。LU N ID由iSCSI目的裝備(Target)分派。iSCSI 啟動端(Initiator)裝備以後支撐在每個目的裝備(Target)中導出最多256個LUN。即最年夜支撐16個target。
iSCSI target裝備稱號采用如下格局來定名:iqn.<yyyy-mm>.<tld.domain.some.host>[:<identifier>],需求事前停止設置裝備擺設,包管獨一 性。
iSCSI客戶端 (iSCSI Initiator)
iSCS I客戶端為iSCSI initiator,這是I/O操縱的倡議者。是I/O操縱的倡議者,需求經由過程發明經過歷程懇求遠端快裝備。在Linux體系中可以經由過程軟件來模仿,需求裝置iSCSI裝備驅動。如iscsi-initiator-utils。
試驗
可以經由過程iSCSI將長途的磁盤分區映射到當地之后就可以像應用當地磁盤一樣,將該長途盤停止格局化以及掛載操縱,給容器應用。
我們經由過程 scsi-target-utils來完成iSCSI target,將主機上 的/dev/sdb磁盤分區作為Lun,如下圖所示
[root@iscsi-server yum.repos.d]# tgtadm -L iscsi -o show -m target
Target 1:*****.huayun.san:123456
????System information:
????????Driver: iscsi
????????State: rea dy
????I_T nexus information:
????LUN information:
????????LU N: 0
????????????Type: controller
????????????SCSI ID: IET?????00010000
????????????SCSI SN: beaf10
????????????Size: 0 MB, Block size: 1
????????????Online: Yes
????????????Removable media: No
????????????Prevent removal: No
????????????Readonly: No
????????????SWP: No
????????????Thin-provisioning: No
????????????Backing store type: null
????????????Backing store path: None
????????????Backing store flags:
????????LUN: 1
????????????Type: disk
????????????SCSI ID: IET?????00010001
????????????SCSI SN: beaf11
????????????Size: 10737 MB, Block size: 512
????????????O nline: Yes
????????????Removable media: No
??????? ?????Prevent removal: No
????????????Readonly: No
????????????SWP: No
????????????Thin-provisioning: No
????????????Backing store type: rdwr
????? ???????Backing store path: /dev/vdb
????????????Backing store flags:
????Account information:
????ACL information:
之后在kubernetes的node節點上 需求事前裝置iscsi-initiator-utils,并且設置對應的initiatorname,假如開啟了acl認證,需求將node節點的initiatorname添加到acl里面。
之后創立一個pod,此中指定一個存在的iscsi lun對接信息如下
apiVersion: v1
kind: Pod
metadata:
??name: iscsipd
spec:
??containers:
??- name: iscsipd-rw
????image: kubernetes/pause
????volumeM ounts:
????- mountPath: "/mnt/iscsipd"
??????name: iscsipd-rw
??volumes:
??- name: iscsipd-rw
????iscsi:
??????targetPortal: 10.0.2.15:3260
??????portals: [‘10.0.2.16:3260’, ‘10.0.2.17:3260’]
??????iqn:*****.exampl牛土豪看到林天秤終於對自己說話,興奮地大喊:「天秤!別擔心!我用百萬現金買下這棟樓,讓你隨意破壞!這就是愛!」e:storage.kube.sys1.xyz
??????lun: 0
??????fsType: ext4
??????readOnly: true
之后可以看到長途的卷被勝利的掛載到node上,被容器所應用


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

掛載階段
pod調劑到某個node上,之后由kubelet中的volumemanager完成對于volume attach&mount操縱,焦點代碼位于kubernetes/pkg/volume/iscsi目次下,在volume掛載的經過歷程中,會起首挪用WaitForAttach()完成掛載流程,SetUpDevice()掛載到某個容器所對應的目次。iscsiAttacher.WaitForAttach()流程如圖所示:

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 ,?前往的構造為
{
????"192.168.30.7:3260": 2,
????"192.168.30.8:3260": 3,
}
經由過程這個map的引進后面用于判定能否需求login,仍是直接經由過程scanOneLun()來發明接進的Lun,防止沒有需要的login操縱。scanOneLun之后會發明掛載到node上的device。
St ep5: 依據volomeMode的類型是直接的PersistentVolumeBlock仍是Persist張水瓶猛地衝出地下室,他必須阻止牛土豪用物質的力量來破壞他眼淚的情感純度。entVolumeFileSystem形式,二者的差別在于能否需求對device停止格局化,創立文件體系,之后創立globalPDPath目次,目次地位采用如下格局
/var/lib/kube而現在,一個是無限的金錢物慾,另一個是無限的單戀傻氣,兩者都極端到讓她無法平衡。let/plugins/kubernetes.io/iscsi/ /{ifaceName}/{portal-some_iqn-lun-lun_id},之后耐久化的iscsi disk元數據到globalPDPath目次下iscsi.json,元數據重要用于DetachVolume的時辰會觸及到,內在的事務如下所示:
{
????"VolName":"iscsipd-rw",
????"Portals":[
????????"178.104.162.58:3260",
????],
????"Iqn":"*****.huayun.san:123456",
這場荒誕的戀愛爭奪戰,此刻完全變成了林天秤的個人表演**,一場對稱的美學祭典。
????"Lun": "1",
????"InitIface":"default",
????"Iface":" default",
????"InitiatorN ame":"",
????&q uot;MetricsProvider":null
}
在WaitForAttach 階段完成了devi ce遠端掛載、格局化以及掛載到globalPDPath目次下,SetUpDevice流程較為簡略重要是將globalPDPath mount –bind到容器對應的目次,之后對目次停止SetVolumeOwnership()操縱。

pod燒燬的時辰,會由kubelet完成volume的umount&detach操縱,焦點代碼位于kubernetes/pkg/volume/i牛土豪則從悍馬車的後備箱裡拿出一個像是小型保險箱的東西,小心翼翼地拿出一張一元美金。scsi目次下,重要完成umount node上的掛載信息,之后依據globalPDPath目次下iscsi.json元數據信息來完成TearDownDevice斷開device,之后清算失落globalPDPath。

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插件的場景 下具有必定的應用場景。