Ceph via iSCSI - of skiƫn terwijl je in een hangmat ligt

Zijn er onder ons (Ceph-beheerders) mensen die geen 'professionele extreme' dingen leuk vinden?

Waarschijnlijk niet — anders zouden we niet met dit uiterst interessante en vermakelijke product aan de slag zijn gegaan.

Velen die met Ceph hebben gewerkt, zijn een niet zo vaak voorkomende (of eigenlijk zeer zeldzame) maar soms gevraagde casus tegengekomen — het aansluiten van Ceph via iSCSI of FC. Waarom? Bijvoorbeeld om een afbeelding van Ceph te leveren aan een nog niet gevirtualiseerde Windows- of Solaris-server. Of aan een gevirtualiseerde server, maar via een hypervisor die Ceph niet ondersteunt — en dat zijn er, zoals we weten, genoeg. Bijvoorbeeld? Denk aan Hyper-V of ESXi, die veelvuldig worden gebruikt. En als het de opdracht is om een afbeelding van Ceph naar een gastmachine te leveren, wordt dit een vrij boeiende uitdaging.

Dus, gegeven:

  1. een al werkende Ceph-cluster
  2. een reeds bestaande afbeelding die via iSCSI moet worden geleverd
  3. De naam van de pool mypool, de naam van de afbeelding myimage

Beginnen we?

Allereerst, als we het hebben over FC of iSCSI, komen er entiteiten zoals initiator en target om de hoek kijken. Target is eigenlijk de server, initiator — de client. Onze taak is om de Ceph-afbeelding met minimale inspanning naar de initiator te leveren. Dit betekent dat we de target moeten opzetten. Maar waar, op welke computer?

Gelukkig hebben we in de Ceph-cluster tenminste ƩƩn component met een vast IP-adres, waarop een van de belangrijkste componenten van Ceph is geconfigureerd, en dat component is de monitor. Dus op de monitor installeren we de iSCSI target (en initiator, minstens voor tests). Ik heb dit gedaan op CentOS, maar voor elke andere distributie is de oplossing ook toepasbaar — het enige wat je hoeft te doen is de pakketten op een manier te installeren die acceptabel is voor jouw distributie.

# yum -y install iscsi-initiator-utils targetcli

Wat is het doel van de te installeren pakketten?

  • targetcli — een hulpprogramma voor het beheer van de in de Linux-kernel ingebouwde SCSI-target
  • iscsi-initiator-utils — een pakket met hulpprogramma's die worden gebruikt voor het beheren van de eveneens in de Linux-kernel ingebouwde iSCSI-initiator

Om een afbeelding via iSCSI aan de initiator te presenteren, zijn er twee opties - gebruik een userspace-backend voor de target of koppel de afbeelding als een blokapparaat dat zichtbaar is voor het besturingssysteem en exporteer het via iSCSI. We kiezen voor de tweede optie - de userspace-backend bevindt zich momenteel in een 'experimentele' staat en is iets minder geschikt voor productief gebruik. Bovendien zijn er enkele complicaties waar veel over te bespreken en (oh horror!) over te discussiƫren valt.

Als we een enigszins stabiele distributie met een lange ondersteuningscyclus gebruiken, dan hebben we een vrij oude kernelversie. Bijvoorbeeld in CentOS7 is dit 3.10.*, in CentOS8 is dit 4.19. En wij zijn geĆÆnteresseerd in een kernel van minimaal 5.3 (of waarschijnlijk 5.4) en nieuwer. Waarom? Omdat de standaardafbeeldingen in Ceph een set opties hebben die niet compatibel zijn met oude kernels. Dat betekent dat we een repository voor de nieuwe kernel voor onze distributie moeten inschakelen (bijvoorbeeld, voor CentOS is dit elrepo), de nieuwe kernel installeren en het systeem opnieuw opstarten om met de nieuwe kernel te kunnen werken:

  • We verbinden ons met de gekozen monitor voor het experiment.
  • We voegen de elrepo-repositories toe volgens de instructies - elrepo.org/tiki/tiki-index.php
  • We installeren de kernel: yum -y --enablerepo=elrepo-kernel install kernel-ml
  • We herstarten de server met de monitor (we hebben tenslotte drie monitors, toch?)

We koppelen de afbeelding als blokapparaat.

# rbd kaart mijnpool/mijnafbeelding
/dev/rbd0

Nu blijft alleen nog het configureren van de target. In dit voorbeeld configureer ik de target in de zogenaamde demo-modus - zonder authenticatie, zichtbaar en toegankelijk voor iedereen. In een productieomgeving wilt u waarschijnlijk authenticatie configureren - maar dat ligt een beetje buiten de scope van deze just-for-fun oefening.

We creƫren een backend met de naam disk1 gekoppeld aan het bestand /dev/rbd/mypool/myimage. Het opgegeven bestand is een automatisch door de daemon udev aangemaakte symbolische link naar /dev/rbd0. We gebruiken juist de symbolische link, omdat de naam van het rbd-apparaat kan veranderen afhankelijk van de volgorde waarin de Ceph-afbeeldingen aan de host zijn gekoppeld.

We creƫren de backend:

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

We creƫren de iSCSI target:

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

We verbinden de backend als LUN met de target:

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

We passen de target aan voor de demo-modus:

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

We slaan de configuratie op:

# targetcli saveconfig

We controleren of de target aanwezig is:

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

We verbinden de target:

# iscsiadm -m node --login
Inloggen bij [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (meerdere)
Inloggen bij [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] succesvol.

Als je alles goed hebt gedaan, verschijnt er een nieuwe schijf op de server, die eruitziet als een SCSI-apparaat, maar in werkelijkheid een afbeelding is van Ceph, waarvan de toegang via iSCSI-target gaat. Om problemen tijdens het opstarten te voorkomen, is het beter om de aangesloten schijf en de gedetecteerde target van de lokale initiator te verwijderen:

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

Wat overblijft, is het persisteren van de configuratie, zodat de afbeelding automatisch wordt aangesloten en na verbinding de target wordt gestart. Het starten van de target bestaat uit twee stappen: het aansluiten van RBD en daadwerkelijk het starten van de target.

Laten we eerst de automatische aansluiting van RBD-afbeeldingen op de host configureren. Dit wordt gedaan door regels toe te voegen aan het bestand /etc/ceph/rbdmap:

# kat /etc/ceph/rbdmap
# RbdDevice Parameters
mypool/myimage id=admin
# systemctl inschakelen rbdmap

Het herstellen van de configuratie van de target is iets ingewikkelder — we moeten een unit voor systemd schrijven, die de configuratie zal herstellen:

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

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

De laatste test — we herstarten nogmaals onze monitor (die nu ook de iSCSI-target is). Opmerking: als we de initiator database niet hadden gewist met het commando iscsiadm -n discoverydb -o delete … zouden we een server kunnen krijgen die niet opstart of lang opstart.

Wat is er nog over?

Configureer de initiator op die server waar we de target willen aanbieden.

Hoe zorgen we voor de beschikbaarheid van onze target?

Op soortgelijke wijze kunnen we targets configureren op andere monitors en multipath regelen (vmware begrijpt dit en werkt zelfs, Hyper-V begrijpt het niet — er zijn SCSI-vergrendelingen vereist). Aangezien de Ceph-client vanuit de kernel geen caching gebruikt, is dit volledig werkbaar. Of een andere optie — creĆ«er een clustered resource uit drie componenten — een toegewezen target en de diensten rbdmap en scsi-target, en beheer deze resource via clusteringtools (wie zei pacemaker?) IP-adressen In plaats van een naschrift

Zoals duidelijk is, is dit artikel een beetje een grap — maar hierin heb ik geprobeerd "snel en met voorbeelden" verschillende populaire onderwerpen te belichten — iSCSI target, dat niet noodzakelijkerwijs Ceph-afbeeldingen hoeft te exporteren — maar bijvoorbeeld LVM-volumes, de basisprincipes van het werken met de iSCSI-initiator (hoe te scannen voor een target, hoe verbinding te maken met een target, los te koppelen, een record van de target uit de database te verwijderen), het schrijven van een eigen unit voor systemd en enkele andere.

Zoals duidelijk is, is dit artikel een beetje een grap — maar hierin heb ik geprobeerd om "snel en met voorbeelden" enkele vrij populaire onderwerpen tegelijkertijd te behandelen — de iSCSI-target, die helemaal niet noodzakelijk het Ceph-images hoeft te exporteren — maar bijvoorbeeld LVM-volumes kan exporteren, de basisprincipes van het werken met een iSCSI-initiator (hoe de target te scannen, hoe verbinding te maken met de target, ontkoppelen, en het verwijderen van de target-registratie uit de database), het schrijven van een eigen unit voor systemd en enkele andere dingen.

Ik hoop dat, zelfs als je dit experiment niet volledig herhaalt, iets uit dit artikel voor jou nuttig zal zijn.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster