參考文檔:
- Ceph Block Device:http://docs.ceph.com/docs/master/rbd/
- CEPH ISCSI GATEWAY:http://docs.ceph.com/docs/master/rbd/iscsi-overview/
- USING AN ISCSI GATEWAY:https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/block_device_guide/using_an_iscsi_gateway
- 參考1:https://ceph.com/planet/ceph%E7%9A%84iscsi-gateway/
- 參考2:http://blog.51cto.com/devingeng/2125656
- 參考3:https://blog.csdn.net/hedongho/article/details/80573989
- 參考4:https://www.jianshu.com/p/a6d03fe5290e
- 參考5,LIO iSCSI Target:https://blog.csdn.net/shajc0504/article/details/40928923
- CEPH ISCSI三種網關:http://xiaqunfeng.cc/2018/02/28/ceph-iscsi%E7%BD%91%E5%85%B3/
- tgt方式掛載ceph rbd:https://my.oschina.net/renguijiayi/blog/340666
- tgtadm使用(tgt方式):https://blog.csdn.net/chenyulancn/article/details/52993806
-
iscsiadm使用:https://boke.wsfnk.com/archives/360.html
一.TGT && LIO
1. Ceph Block框架

2. Ceph iSCSI基本框架

iSCSI gateway的實現主要有TGT && LIO兩種方式。
3. TGT
TGT:Linux target framework,為創建、維護SCSI target 驅動(包括iSCSI、FC、SRP等)提供支持。
- 工作在用戶空間;
- 在Linux 2.6.38 版本后(含),內核集成了 Linux-IO Target。
在ceph集成原生iscsi之前,通常使用基於用戶空間的"scsi-target-utils"套件實現tgt。
基於centos7.x系列,安裝"scsi-target-utils"套件后,iscsi並不支持ceph rbd后端存儲(通過"tgtadm --lld iscsi --mode system --op show"查看),主要原因是redhat針對套件屏蔽了支持ceph rbd后端存儲的代碼。
解決方案:通過"rbd map xxx"將ceph rbd掛載到本地后,再通過iscsi tgt的"direct-store"模式發布ceph塊存儲。
方案缺點:"rbd map xxx"掛載ceph rbd是通過"ceph rbd kernel module"的形式,tgt在用戶空間實現,導致發布的ceph rbd在內核態與用戶態之間頻繁切換,影響性能。
4. LIO
LIO:Linux-IO Target,用軟件實現各種SCIS Target。
- 工作在內核空間;
- 支持較多傳輸協議,如Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10), SRP (Mellanox InfiniBand,linux3.3), USB等;
- 對 iSCSI RFC 規范的支持非常好,包括完整的錯誤恢復都有支持;
- 從內核 3.17 開始引入用戶態后端支持,即 TCMU(Target Core Module in Userspace)
- 在Linux 2.6.38 版本后(含),內核集成了 Linux-IO Target。
本文主要介紹基於LIO的ceph原生iscsi 實現方式,LIO利用用戶空間直通(即TCMU)與ceph的librbd庫進行交互(tcmu-runner處理LIO TCM后端存儲的用戶空間端的守護進程,在內核之上多了一個用戶態的驅動層,這樣只需要根據tcmu的標准來對接接口即可,而不用去直接與內核進行交互),並將rbd image暴露給iSCSI客戶端。
二.環境准備
1. 內核/軟件要求(iscsi gateway)
- A running Ceph Luminous or later storage cluster,本文采用:13.2.1 mimic (stable);
- RHEL/CentOS 7.5; Linux kernel v4.16 or newer; or the Ceph iSCSI client test kernel,本文采用:CentOS 7.5 with Linux kernel v4.18.8-1.el7.elrepo.x86_64;
-
The following packages must be installed from your Linux distribution's software repository:
targetcli-2.1.fb47 or newer package,本文采用:2.1.fb47;
python-rtslib-2.1.fb64 or newer package,本文采用:2.1.fb64-3;
tcmu-runner-1.3.0 or newer package,本文采用:1.3.0-0.4.2;
ceph-iscsi-config-2.4 or newer package,本文采用:2.5-1;
ceph-iscsi-cli-2.5 or newer package,本文采用:2.5-10。
以上rpm包並不能直接下載,整理本文采用的rpm包如下,鏈接:https://pan.baidu.com/s/1i-0GLqxjMv3P3c3YYoyhiQ 密碼:ncxv
2. 安裝要求(iscsi gateway)
- ntp已部署,selinux已禁用;
- 除ceph集群需要開放的端口外,另開放tcp 3260(iscsi通信)與tcp 5000(rbd-target-api)端口,本文不啟用firewalld或iptables;
- ceph集群已部署,可參考:https://www.cnblogs.com/netonline/p/9367802.html;
- 如果iscsi gateway與osd節點沒有融合部署,需要復制ceph的配置文件(即/etc/ceph/目錄下相關文件)到iscsi gateway所在節點,本文采用融合部署。
3. 主機
| Hostname |
IP |
Service |
Remark |
| ceph01 |
public:172.30.200.57 cluster:192.30.200.57 |
centos7.5 with kernel v4.18.7-1 |
|
| ceph02 |
public:172.30.200.58 cluster:192.30.200.58 |
centos7.5 with kernel v4.18.7-1 |
|
| ceph03 |
public:172.30.200.59 cluster:192.30.200.59 |
centos7.5 with kernel v4.18.7-1 |
|
| ceph-client |
172.30.200.50 |
iscsi-initiator-utils v6.2.0.874-7 device-mapper-multipath v0.4.9-119 |
4. 修改ceph集群配置參數(option)
針對ceph-mon或osd節點,並沒有特殊的iscsi-gateway參數選項,但降低若干默認的檢測osd宕機時間,可以有效降低initiator的連接超時。
# 可在ceph-mon節點修改ceph.conf文件后分發到所有節點,如: [root@ceph01 ~]# su - cephde [cephde@ceph01 ~]$ cd cephcluster/ [cephde@ceph01 cephcluster]$ cat ceph.conf # 新增參數 [osd] osd client watch timeout = 15 osd heartbeat grace = 20 osd heartbeat interval = 5 # 分發,需要重啟服務 [cephde@ceph01 cephcluster]$ ceph-deploy admin ceph01 ceph02 ceph03 # 通過ceph-deply節點,在線修改參數,如下: [cephde@ceph01 cephcluster]$ sudo ceph tell osd.* config set osd_client_watch_timeout 15 [cephde@ceph01 cephcluster]$ sudo ceph tell osd.* config set osd_heartbeat_grace 20 [cephde@ceph01 cephcluster]$ sudo ceph tell osd.* config set osd_heartbeat_interval 5
三.iSCSI Gateway
1. 安裝iscsi gateway
# 為了多路徑高可用,iscsi gateway在多osd節點部署,下面以ceph01節點為例,其余節點類似,必要時根據節點做調整; # 下載必需的軟件后,利用”yum localinstall *”統一安裝,可解決依賴問題 [root@ceph01 ~]# cd ~/ceph-iscsi/ [root@ceph01 ceph-iscsi]# yum localinstall * -y
2. 配置iscsi-gateway.cfg
# 在osd節點/etc/ceph/目錄下創建iscsi-gateway.cfg文件,所有iscsi-gateway節點配置內容相同,以ceph01節點為例; # iscsi-gateway.cfg文件中,只需要根據實際情況修改trusted_ip_list,其是每個iscsi網關上的ip地址列表,用於管理操作,如目標創建,LUN導出等; # trusted_ip_list可與用於iSCSI數據的ip相同,但條件允許時推薦使用分離的IP [root@ceph01 ~]# touch /etc/ceph/iscsi-gateway.cfg [root@ceph01 ~]# vim /etc/ceph/iscsi-gateway.cfg [config] # Name of the Ceph storage cluster. A suitable Ceph configuration file allowing # access to the Ceph storage cluster from the gateway node is required, if not # colocated on an OSD node. cluster_name = ceph # Place a copy of the ceph cluster's admin keyring in the gateway's /etc/ceph # drectory and reference the filename here gateway_keyring = ceph.client.admin.keyring # API settings. # The API supports a number of options that allow you to tailor it to your # local environment. If you want to run the API under https, you will need to # create cert/key files that are compatible for each iSCSI gateway node, that is # not locked to a specific node. SSL cert and key files *must* be called # 'iscsi-gateway.crt' and 'iscsi-gateway.key' and placed in the '/etc/ceph/' directory # on *each* gateway node. With the SSL files in place, you can use 'api_secure = true' # to switch to https mode. # To support the API, the bear minimum settings are: api_secure = false # Additional API configuration options are as follows, defaults shown. # api_user = admin # api_password = admin # api_port = 5001 trusted_ip_list = 172.30.200.57,172.30.200.58,172.30.200.59
3. 創建rbd pool
# rbd-target-api依賴於rbd-target-gw,rbd-target-gw服務依賴於”rbd”池的提前建立,且pool的名字必須是”rbd”; [root@ceph01 ~]# ceph osd pool create rbd 256 # 創建pool后需要啟動pool的屬性,如塊存儲池”rbd”,屬性關鍵字在最后 [root@ceph01 ~]# ceph osd pool application enable rbd rbd

# 查看pool,或”ceph osd lspools”,” ceph osd pool ls“,”rados df”等 [root@ceph01 ~]# ceph osd pool get rbd all

4. 啟動iscsi-gateway api服務
# 服務需要在所有iscsi-gateway節點啟動,以ceph01節點為例; # 在啟動”rbd-target-api”服務的同時,會啟動”rbd-target-gw”服務; # 注意提前創建”rbd” pool,rbd-target-api依賴於rbd-target-gw,rbd-target-gw服務依賴於”rbd”池 [root@ceph01 ~]# systemctl daemon-reload [root@ceph01 ~]# systemctl enable rbd-target-api [root@ceph01 ~]# systemctl start rbd-target-api [root@ceph01 ~]# systemctl status rbd-target-api ; systemctl status rbd-target-gw

5. 創建iscsi-target與rbd image
iscsi-gateway命令行工具gwcli用於創建/配置iscsi-target與rbd image;其余較低級別命令行工具,如targetcli或rbd等,可用於查詢配置,但不能用於修改gwcli所做的配置。
創建iscsi-target與rbd image在1個節點操作即可,以下操作在ceph01節點完成。
1)gwcli
# 進入gwcli命令行工具后,通過”ls”可查看目錄,通過”cd”可切換目錄 [root@ceph01 ~]# gwcli Warning: Could not load preferences file /root/.gwcli/prefs.bin. /> ls

2)創建iscsi-target
# 在iscsi-target目錄下創建iscsi-target; # iscsi-target命名規則:iqn.yyyy-mm.<reversed domain name>:identifier,即iqn.年-月.反轉域名:target-name,這里沒有域名,采用ip地址替代; # 在新創建的iscsi-target下,同步生成gateway,host-groups,hosts目錄 /> cd /iscsi-target /iscsi-target> create iqn.2018-09.172.30.200.5x:iscsi-gw /iscsi-target> ls

3)創建iscsi-gateway
# 在新創建的iscsi-target下同步生成gateway目錄下創建iscsi-gateway; # iscsi-gateway的ip采用用於iscsi數據的ip,也可與trusted_ip_list設置的ip相同,建議采用前者; # iscsi-gateway 的名字同主機hostname; # 為了多路徑ha,iscsi-gateway至少配置2個; # 如果沒有使用指定版本的OS或者內核,或者采用ceph-iscsi-test內核時,可在創建iscsi-gateway命令后帶上”skipchecks=true”,跳過內核檢測 /iscsi-target> cd iqn.2018-09.172.30.200.5x:iscsi-gw/gateways /iscsi-target...i-gw/gateways> create ceph01 172.30.200.57 /iscsi-target...i-gw/gateways> create ceph02 172.30.200.58 /iscsi-target...i-gw/gateways> create ceph03 172.30.200.59 /iscsi-target...i-gw/gateways> ls

4)創建rbd image
# 在命令行根目錄的disks目錄下創建image; # 創建image時,需要指定pool,image-name與size /iscsi-target...i-gw/gateways> cd /disks /disks> create pool=rbd image=disk01 size=10G /disks> ls

6. 設置initiator
# 在新創建的iscsi-target下同步生成hosts目錄下設置initiator; # initiator-name同iscsi-target命名類似,或在已有initiator客戶端的情況下,采用客戶端默認的initiator-name,centos系統可查看”/etc/iscsi/initiatorname.iscsi”文件獲取; # 創建initiator-name后,自動進入initiator-name目錄 /disks> cd /iscsi-target/iqn.2018-09.172.30.200.5x:iscsi-gw/hosts /iscsi-target...scsi-gw/hosts> create iqn.2018-09.172.30.200.50:iscsi-initiator /iscsi-target...csi-initiator> ls

# 設置CHAP認證(必須),否則iscsi-target會拒絕initiator的登陸請求; # 在新建的initiator-name目錄下設置認證 /iscsi-target...csi-initiator> auth chap=iscsiname/iscsipassword /iscsi-target...csi-initiator> ls

7. 添加image到initiator
# 在新建的initiator-name目錄下向initiator添加image; # 添加成功后,對應initiator下有可被掛載的lun設備; # 此時多台iscsi-gateway主機iscsi-gateway ip的tcp 3260端口被監聽 /iscsi-target...csi-initiator> disk add rbd.disk01 /iscsi-target...csi-initiator> ls

# 查看全局目錄層級,cluster目錄針對ceph集群; # disk與iscsi-target目錄針對iscsi-target與rbd image的創建與配置; # 同時可通過targetcli命令行工具或者ceph的rbd命令查詢已完成的配置 /iscsi-target...csi-initiator> cd / /> ls

四.iSCSI initiator
查看官網,iscsi initiator目前支持linux,windows與vmware esx,這里只針對linux做驗證。
1. 安裝initiator與multipath工具
# iscsi-initiator-utils是通用initiator套件; # device-mapper-multipath是多路徑工具 [root@ceph-client ~]# yum install iscsi-initiator-utils device-mapper-multipath -y
2. 設置multipath服務
# 啟用multipath服務,生成”/etc/multipath.conf”文件 [root@ceph-client ~]# mpathconf --enable --with_multipathd y # 在”/etc/multipath.conf”文件新增配置,針對LIO后端存儲設置多路徑ha [root@ceph-client ~]# vim /etc/multipath.conf devices { device { vendor "LIO-ORG" hardware_handler "1 alua" path_grouping_policy "failover" path_selector "queue-length 0" failback 60 path_checker tur prio alua prio_args exclusive_pref_bit fast_io_fail_tmo 25 no_path_retry queue } } # 重新加載multinpath服務 [root@ceph-client ~]# systemctl reload multipathd
3. iscsi discovery
1)設置chap認證
# 開啟initiator的chap認證,並設置username/password,與iscsi-target設置保持一致; # CHAP Settings部分,涉及57/61/62行 [root@ceph-client ~]# vim /etc/iscsi/iscsid.conf node.session.auth.authmethod = CHAP node.session.auth.username = iscsiname node.session.auth.password = iscsipassword
2)設置initiatoe-name
# 設置initiator-name,保持與iscsi-target設置的initiator-name一致 [root@ceph-client ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2018-09.172.30.200.50:iscsi-initiator
3)發現iscsi-target
# 發現iscsi存儲:iscsiadm -m discovery -t st -p ISCSI_IP,ISCSI_IP默認采用3260端口; # 查看iscsi發現記錄:iscsiadm -m node # 刪除iscsi發現記錄:iscsiadm -m node -o delete -T LUN_NAME -p ISCSI_IP [root@ceph-client ~]# iscsiadm -m discovery -t st -p 172.30.200.57

4)登陸iscsi-target
# 登錄iscsi存儲:iscsiadm -m node -T LUN_NAME -p ISCSI_IP -l # 登出iscsi存儲:iscsiadm -m node -T LUN_NAME -p ISCSI_IP -u # 顯示會話情況:iscsiadm -m session [root@ceph-client ~]# iscsiadm -m node -T iqn.2018-09.172.30.200.5x:iscsi-gw -l

# 1個后端存儲,通過3條路徑連接 [root@ceph-client ~]# multipath -ll

# 通過多路徑連接后端存儲,生成多個盤符; # 通過multipath服務匯聚,生成盤符/dev/mapper/mpathx,mount時間直接使用; # 或:lsscsi [root@ceph-client ~]# fdisk -l

4. mount驗證
# 創建分區,分區類型與大小默認即可; # 保存退出后會有1個報錯,可忽略 [root@ceph-client ~]# fdisk /dev/mapper/mpatha Command (m for help): n Select (default p): Partition number (1-4, default 1): First sector (8192-20971519, default 8192): Last sector, +sectors or +size{K,M,G} (8192-20971519, default 20971519): Command (m for help): w # 格式化分區 [root@ceph-client ~]# mkfs.xfs /dev/mapper/mpatha1 # 掛載分區 [root@ceph-client ~]# mount /dev/mapper/mpatha1 /mnt # 查看掛載情況 [root@ceph-client ~]# df -Th

5. 設置開機啟動掛載
# filesystem parameters列設置掛載時間; # noatime:禁止更新文件與目錄的inode訪問時間,以獲得更快的訪問速度; # _netdev:標識文件系統位於網絡上,防止網絡啟動前掛載 [root@ceph-client ~]# vim /etc/fstab # rbd /dev/mapper/mpatha1 /mnt xfs noatime,_netdev 0 0
五.iSCSI Gateway Monitoring
ceph提供了1個監控導出的rbd image的性能的工具gwtop。
gwtop類似top,可顯示通過iSCSI導出到客戶端的rbd image的聚合性能指標,度量值取自Performance Metrics Domain Agent (PMDA)。Linux-IO target (LIO) PMDA信息列出每個導出的rbd image與客戶端的連接,以及關聯的I/O值。
1. 安裝gwtop
# 在已部署iscsi-gateway的節點安裝,以ceph01節點為例; # pcp是性能采集工具,pcp-pmda-lio是agent [root@ceph01 ~]# yum install ceph-iscsi-tools pcp pcp-pmda-lio -y # 啟動服務 [root@ceph01 ~]# systemctl enable pmcd [root@ceph01 ~]# systemctl start pmcd [root@ceph01 ~]# systemctl status pmcd

# 注冊pcp-pmda-lio agent [root@ceph01 ~]# cd /var/lib/pcp/pmdas/lio [root@ceph01 lio]# ./Install

2. gwtop輸出樣例
# 在client列中,”(CON)”表示initiator已連接到iscsi-gateway,”-multi-”表示多client連接到單rbd image; # 可以通過在client寫入數據,如”dd”命令查看gwtop的輸出 [root@ceph01 lio]# gwtop

