Gibt es unter uns (Ceph-Nutzern) wirklich jemanden, der "professionellen Extremismus" nicht mag?
Wahrscheinlich nicht â sonst wĂŒrden wir uns nicht mit diesem Ă€uĂerst interessanten und unterhaltsamen Produkt beschĂ€ftigen.
Viele, die sich mit Ceph auseinandergesetzt haben, sind auf einen eher seltenen (eigentlich sehr seltenen), aber manchmal gefragten Anwendungsfall gestoĂen â Ceph ĂŒber iSCSI oder FC anzuschlieĂen. Warum? Nun, beispielsweise, um ein Image von Ceph auf einen Server mit Windows oder Solaris zu bringen, der aus irgendeinem Grund noch nicht virtualisiert ist. Oder auf einen virtualisierten, aber ĂŒber einen Hypervisor, der Ceph nicht unterstĂŒtzt â und davon gibt es bekanntermaĂen viele. Zum Beispiel? Nun, zum Beispiel HyperV oder ESXi, die weit verbreitet sind. Und wenn die Aufgabe besteht, ein Image von Ceph an eine virtuelle Maschine zu ĂŒbermitteln, wird dies zu einer recht spannenden Herausforderung.
Also, gegeben:
- ein bereits funktionierender Ceph-Cluster
- ein bereits vorhandenes Image, das ĂŒber iSCSI bereitgestellt werden muss
- Name des Pools mypool, Name des Images myimage
Fangen wir an?
ZunĂ€chst einmal, wenn wir ĂŒber FC oder iSCSI sprechen, tauchen solche EntitĂ€ten wie Initiator und Ziel auf. Das Ziel ist tatsĂ€chlich der Server, der Initiator â der Client. Unsere Aufgabe ist es, mit minimalem Aufwand ein Ceph-Image auf den Initiator zu bringen. Das bedeutet, wir mĂŒssen das Ziel bereitstellen. Aber wo, auf welchem Computer?
GlĂŒcklicherweise haben wir im Ceph-Cluster mindestens eine Komponente, deren IP-Adresse festgelegt ist und auf der eine der wichtigsten Komponenten von Ceph konfiguriert ist, und diese Komponente ist der Monitor. Daher installieren wir das iSCSI-Ziel auf dem Monitor (und auch den Initiator, zumindest fĂŒr Tests). Ich habe das auf CentOS gemacht, aber fĂŒr jede andere Distribution ist die Lösung ebenfalls geeignet â es reicht, die Pakete auf die Art zu installieren, die fĂŒr Ihre Distribution akzeptabel ist.
# yum -y install iscsi-initiator-utils targetcli
Was ist der Zweck der installierten Pakete?
- targetcli â ein Verwaltungswerkzeug fĂŒr den in den Linux-Kernel integrierten SCSI-Ziel
- iscsi-initiator-utils â ein Paket mit Werkzeugen zur Verwaltung des ebenfalls in den Linux-Kernel integrierten iSCSI-Initiators
Um ein Image ĂŒber iSCSI an den Initiator zu ĂŒbergeben, gibt es zwei Möglichkeiten: Entweder nutzen wir das userspace Backend des Targets oder montieren das Image als BlockgerĂ€t, das fĂŒr das Betriebssystem sichtbar ist, und exportieren es ĂŒber iSCSI. Wir wĂ€hlen den zweiten Weg, da das userspace Backend derzeit im "experimentellen" Zustand ist und fĂŒr den produktiven Einsatz noch nicht ganz bereit ist. Zudem gibt es einige Fallstricke, ĂŒber die man viel diskutieren und (oh Schreck!) streiten kann.
Wenn wir eine einigermaĂen stabile Distribution mit langem Support-Zyklus verwenden, haben wir einen Kernel einer sehr alten Version. Zum Beispiel in CentOS7 ist es 3.10.*, in CentOS8 ist es 4.19. Uns interessiert aber mindestens ein Kernel 5.3 (eher 5.4) oder neuer. Warum? Weil standardmĂ€Ăig die Images in Ceph mit einer OptionsbĂŒndelung verbunden sind, die nicht mit alten Kernen kompatibel ist. Das bedeutet, dass wir ein Repository fĂŒr einen neuen Kernel fĂŒr unsere Distribution hinzufĂŒgen (zum Beispiel fĂŒr CentOS ist das elrepo), installieren den neuen Kernel und starten das System neu, um mit dem neuen Kernel zu arbeiten:
- Wir verbinden uns mit dem ausgewĂ€hlten Monitor fĂŒr das Experiment.
- Wir binden die elrepo-Repositories gemÀà der Anleitung ein â
- Wir installieren den Kernel: yum -y âenablerepo=elrepo-kernel install kernel-ml
- Wir starten den Server neu mit Monitor (wir haben doch drei Monitore, richtig?)
Wir verbinden das Image als BlockgerÀt
# rbd-Karte mypool/myimage
/dev/rbd0
Jetzt mĂŒssen wir nur noch das Target konfigurieren. In diesem Beispiel konfiguriere ich das Target im sogenannten Demo-Modus â ohne Authentifizierung, sichtbar und zugĂ€nglich fĂŒr alle. In einer Produktionsumgebung möchten Sie wahrscheinlich Authentifizierung einrichten â aber das ist fĂŒr heute nicht das Thema dieses kleinen, spaĂigen Ăbungsprojekts.
Wir erstellen ein Backend mit dem Namen disk1, das der Datei /dev/rbd/mypool/myimage zugeordnet ist. Die angegebene Datei ist ein automatisch vom udev-Daemon erstellter symbolischer Link zu /dev/rbd0. Wir verwenden genau diesen symbolischen Link, da der rbd-GerÀtename sich aufgrund der Reihenfolge des Anschlusses von Ceph-Images an den Host Àndern kann.
Wir erstellen das Backend:
# targetcli /backstores/block create disk1 /dev/rbd/mypool/myimage
Wir erstellen das iSCSI-Target:
# targetcli /iscsi create iqn.2020-01.demo.ceph:mypool
Wir verbinden das Backend als LUN mit dem Target:
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/luns erstellen /backstores/block/disk1
Wir passen das Target fĂŒr den Demo-Modus an:
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> Attribut demo_mode_write_protect=0
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> Attribut generate_node_acls=1
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> Attribut cache_dynamic_acls=1
Wir speichern die Konfiguration:
# targetcli saveconfig
Wir ĂŒberprĂŒfen das Vorhandensein des Targets:
# iscsiadm -m discovery -t st -p 127.0.0.1:3260
127.0.0.1:3260,1 iqn.2020-01.demo.ceph:mypool
Wir verbinden das Target:
# iscsiadm -m node --login
Anmeldung bei [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (mehrere)
Anmeldung bei [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] erfolgreich.
Wenn alles richtig gemacht wurde, erscheint ein neues Laufwerk auf dem Server, das wie ein SCSI-GerĂ€t aussieht, aber tatsĂ€chlich ein Image aus Ceph ist, auf das ĂŒber das iSCSI-Ziel zugegriffen wird. Um Probleme beim Booten zu vermeiden, sollten Sie das angeschlossene Laufwerk und das entdeckte Ziel vom lokalen Initiator entfernen:
# iscsiadm -m node --logout
# iscsiadm -m discoverydb -o delete -t st -p 127.0.0.1:3260
Alles, was noch bleibt, ist die Konfiguration zu persistieren, damit das Image automatisch verbunden wird und nach der Verbindung das Ziel gestartet wird. Der Start des Ziels besteht aus zwei Schritten â der Verbindung von RBD und dem eigentlichen Start des Ziels.
Zuerst konfigurieren wir die automatische Verbindung von RBD-Images zum Host. Dies geschieht durch das HinzufĂŒgen von Zeilen zur Datei /etc/ceph/rbdmap:
# katze /etc/ceph/rbdmap
# RbdDevice Parameters
meinpool/meinbild id=admin
# systemctl aktivieren rbdmap
Die Wiederherstellung der Zielkonfiguration ist etwas komplizierter â wir mĂŒssen eine Unit fĂŒr systemd schreiben, die die Konfiguration wiederherstellt:
# cat /usr/lib/systemd/system/scsi-target.service
[Unit]
Beschreibung=Starten Sie das iSCSI-Ziel
After=network-online.target rbdmap.service
Before=remote-fs-pre.target
Wants=network-online.target remote-fs-pre.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/targetcli restoreconfig
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl enable scsi-target
Der finale Test â wir starten unseren Monitor (der jetzt auch iSCSI-Ziel ist) erneut neu. Es ist anzumerken, dass wir die Initiator-Datenbank nicht mit dem Befehl bereinigt hĂ€tten iscsiadm -n discoverydb -o delete ⊠Sonst könnte es zu einem Server kommen, der nicht hochfĂ€hrt oder lange benötigt, um hochzufahren.
Was bleibt ĂŒbrig?
Den Initiator auf dem Server konfigurieren, an den wir das Ziel ĂŒbergeben möchten.
Wie gewÀhrleisten wir die Ausfallsicherheit unseres Ziels?
Ăhnlich können Ziele auf anderen Monitoren konfiguriert und eine Multipath-Verbindung eingerichtet werden (VMware versteht das und funktioniert sogar, Hyper-V versteht es nicht â dort sind SCSI-Sperren erforderlich). Da der Ceph-Client im Kernel kein Caching verwendet, ist das durchaus funktionsfĂ€hig. Eine andere Möglichkeit wĂ€re, eine Clusterressource aus drei Komponenten zu erstellen â einem dedizierten Ziel und den Diensten rbdmap und scsi-target, und diese Ressource ĂŒber Cluster-Management-Tools zu verwalten (wer hat pacemaker gesagt?) IP-Adressen Wie klar ist, ist dieser Artikel ein bisschen ein Scherz â aber darin habe ich versucht, âschnell und an Beispielenâ gleichzeitig mehrere recht beliebte Themen zu betrachten â iSCSI-Ziel, das nicht unbedingt Ceph-Images exportieren muss â aber zum Beispiel LVM-Volumes exportieren kann, Grundlagen der Arbeit mit dem iSCSI-Initiator (wie man das Ziel scannt, wie man sich mit dem Ziel verbindet, trennt und den Eintrag ĂŒber das Ziel aus der Datenbank löscht), das Schreiben einer eigenen Einheit fĂŒr systemd und einige andere.
Anstelle eines Schlussworts
Wie klar ist, ist dieser Artikel ein wenig ein Scherz â aber ich habe versucht, "schnell und anhand von Beispielen" mehrere ziemlich populĂ€re Themen gleichzeitig zu behandeln â iSCSI-Target, das nicht unbedingt Images von Ceph exportieren muss â sondern zum Beispiel LVM-Volumes exportieren kann, Grundlagen der Arbeit mit dem iSCSI-Initiator (wie man das Target scannt, sich mit dem Target verbindet, trennt und den Eintrag ĂŒber das Target aus der Datenbank entfernt), das Schreiben einer eigenen Einheit fĂŒr systemd und einige andere.
Ich hoffe, dass Sie auch, wenn Sie nicht das gesamte Experiment in vollem Umfang wiederholen, aus diesem Artikel zumindest etwas NĂŒtzliches herausziehen können.
Quelle: habr.com
