通過 iSCSI 的 Ceph - 或站在吊床上滑雪

我們(切夫沃多夫)有誰不喜歡「職業極端」嗎?

這不太可能——否則我們就不會對這款極其有趣和可笑的產品著迷了。

許多參與 Ceph 開發的人都遇到過一種不太常見(甚至非常罕見)但有時很常見的情況 - 透過 iSCSI 或 FC 連接 Ceph。為了什麼?嗯,例如,將 Ceph 中的映像提供給由於某種原因尚未虛擬化的 Windows 或 Solaris 伺服器。或在虛擬化的平台上,但透過不支援 Ceph 的虛擬機器管理程式 - 而且,正如我們所知,這樣的平台有很多。例如?例如,HyperV 或 ESXi 都被廣泛使用。如果出現將 Ceph 中的影像提供給客戶機器的任務,這將變成一項非常令人興奮的任務。

因此,假設:

  1. 已運行的 Ceph 集群
  2. 需要透過 iSCSI 提供的現有映像
  3. 池名稱 我的泳池、圖像名稱 我的形象

我們開始吧?

首先,當我們談論 FC 或 iSCSI 時,我們有啟動器和目標這樣的實體。 Target其實就是一個伺服器,Initiator就是一個客戶端。我們的任務是以最少的努力向發起者提供 Ceph 影像。這意味著我們需要部署目標。但是在哪裡、在哪台計算機上呢?

幸運的是,在 Ceph 叢集中我們至少有一個元件,它的 IP 位址是固定的,並且配置了一個最重要的 Ceph 元件,而這個元件就是監視器。因此,我們在監視器上安裝 iSCSI 目標(同時安裝啟動器,至少用於測試)。我在 CentOS 上這樣做了,但該解決方案也適用於任何其他發行版 - 只需以您的發行版可接受的方式安裝軟體包即可。

# yum -y install iscsi-initiator-utils targetcli

安裝這些軟體包的用途是什麼?

  • 目標命令列 — Linux 核心內建的用於管理 SCSI 目標的實用程序
  • iscsi 啟動器實用程式 — 包含用於管理 Linux 核心內建 iSCSI 啟動器的實用程式的軟體包

為了透過 iSCSI 向啟動器提供映像,有兩個選項:使用目標的用戶空間後端或將映像作為作業系統可見的區塊裝置連接並透過 iSCSI 將其匯出。我們將採用第二種方式——用戶空間後端仍處於「實驗」狀態,尚未完全準備好投入生產使用。此外,和他在一起時,你們可以談論很多關於他的缺點,也可以爭論(哦,多麼可怕!)。

如果我們使用任何具有較長支援週期的穩定發行版,那麼我們的核心就是一些非常古老的版本。例如在CentOS7中是3.10.*,在CentOS8中是4.19。我們對核心至少 5.3(最有可能是 5.4)及更新版本感興趣。為什麼?因為預設情況下,Ceph 鏡像啟用了一組與舊核心不相容的選項。這意味著我們將儲存庫與我們發行版的新核心連接起來(例如,對於 CentOS 來說是 elrepo),安裝新核心並重新啟動系統以使用新核心:

  • 連接到實驗所選的監視器
  • 根據說明連接 elrepo 儲存庫 — elrepo.org/tiki/tiki-index.php
  • 安裝核心:yum -y —enablerepo=elrepo-kernel install kernel-ml
  • 使用監視器重新啟動伺服器(我們有三個監視器,對嗎?)

將映像掛載為區塊設備

# rbd map mypool/myimage
/dev/rbd0

剩下的就是配置目標。在這個例子中,我將以所謂的演示模式配置目標 - 無需身份驗證,每個人都可見且可訪問。在生產環境中,您可能需要配置身份驗證 - 但這對於今天的只是為了好玩的練習來說有點超出範圍。

我們建立一個名為 disk1 的後端,與檔案 /dev/rbd/mypool/myimage 關聯。指定的檔案是 udev 守護程式自動建立的到 /dev/rbd0 的符號連結。我們使用符號鏈接,因為 rbd 設備名稱會根據 Ceph 映像安裝到主機的順序而改變。

讓我們創建一個後端:

# targetcli /backstores/block create disk1 /dev/rbd/mypool/myimage

建立 iSCSI 目標:

# targetcli /iscsi create iqn.2020-01.demo.ceph:mypool

我們將後端作為 LUN 連接到目標:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/luns create /backstores/block/disk1

我們正在微調演示模式的目標:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute demo_mode_write_protect=0
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute generate_node_acls=1
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute cache_dynamic_acls=1

儲存配置:

# targetcli saveconfig

檢查目標是否存在:

# iscsiadm -m discovery -t st -p 127.0.0.1:3260
127.0.0.1:3260,1 iqn.2020-01.demo.ceph:mypool

連結目標:

# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (multiple)
Login to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] successful.

如果您正確完成了所有操作,伺服器上就會出現一個新磁碟,它看起來像一個 SCSI 設備,但實際上是來自 Ceph 的映像,可透過 iSCSI 目標存取。為了避免啟動問題,最好從本機啟動器中刪除映射磁碟和偵測到的目標:

# iscsiadm -m node --logout
# iscsiadm -m discoverydb -o delete -t st -p 127.0.0.1:3260

剩下的就是保留配置,以便影像自動連接,並在連接後啟動目標。啟動目標包括兩個步驟-連接 RBD 和實際啟動目標。

首先,讓我們設定 RBD 映像到主機的自動連線。這是透過在 /etc/ceph/rbdmap 檔案中新增一行來完成的:

# cat /etc/ceph/rbdmap
# RbdDevice Parameters
mypool/myimage id=admin
# systemctl enable rbdmap

恢復目標配置稍微複雜一些 - 我們需要為 systemd 編寫一個單元來恢復配置:

# cat /usr/lib/systemd/system/scsi-target.service
[Unit] Description=Start iSCSI target

之後=網路在線.目標rbdmap.服務
之前=remote-fs-pre.target
想要=網路在線.目標遠端檔案系統預.目標

[服務] 類型=oneshot
退出後保留=是
ExecStart=/bin/targetcli restoreconfig [安裝] WantedBy=multi-user.target

# systemctl守護進程重新加載
# systemctl 啟用 scsi 目標

最後的測試是再次重新啟動我們的顯示器(它現在是一個 iSCSI 目標)。要注意的是,如果我們沒有用指令清除啟動器的基礎 iscsiadm -n discoverydb -o 刪除... 那麼最終您可能會遇到伺服器無法載入或需要很長時間才能載入的情況。

還剩下什麼?

在我們要提交目標的伺服器上設定啟動器。

如何保證我們的目標的容錯能力?

您也可以類似地在其他顯示器上配置目標並設定多路徑(VMware 可以理解並支援此功能,但 Hyper-V 則不行,因為它需要 SCSI 鎖定)。由於核心中的 Ceph 客戶端不使用緩存,因此這完全可行。另一種選擇是從三個元件建立叢集資源—一個專用的 IP 地址 目標和服務 rbdmap 和 scsi-target,並透過叢集工具(誰說起搏器?)管理此資源。

而不是後面的

如你所見,這篇文章有點像個笑話 - 但在其中我試圖「快速地通過例子」同時考慮幾個相當流行的主題 - iSCSI 目標,它不一定導出 Ceph 鏡像 - 但例如導出 LVM 卷,使用 iSCSI 啟動器的基礎知識(如何掃描目標,如何連接到目標,斷開連接,從數據庫中刪除有關目標的記錄),為 systemd

我希望即使你不完全重複整個實驗,至少本文中的某些內容對你有用。

來源: www.habr.com

添加評論