Ceph a través d'iSCSI - o esquiant dempeus en una hamaca

Hi ha persones entre nosaltres (tsefovodov) a qui no els agrada "l'extrem professional"?

És poc probable; en cas contrari, no estaríem tombant amb aquest producte extremadament interessant i divertit.

Molts dels que estaven implicats en el funcionament de Ceph s'han trobat amb un cas poc freqüent (o més aviat molt poc freqüent) però de vegades demandat: connectar Ceph mitjançant iSCSI o FC. Per a què? Bé, per exemple, envieu una imatge de Ceph a un servidor Windows o Solaris que encara no s'hagi virtualitzat per algun motiu. O una virtualitzada, però utilitzant un hipervisor que no pot fer Ceph - i, com sabem, n'hi ha molts. Per exemple? Bé, per exemple, HyperV o ESXi, que s'utilitzen activament. I si sorgeix la tasca de servir una imatge de Ceph a una màquina convidada, això es converteix en una tasca molt emocionant.

Així doncs, donat:

  1. un clúster Ceph ja en funcionament
  2. una imatge ja existent que s'ha de publicar mitjançant iSCSI
  3. Nom de la piscina la meva piscina, nom de la imatge la meva imatge

Començar?

En primer lloc, quan parlem de FC o iSCSI, tenim entitats com a iniciador i objectiu. Target és en realitat un servidor, l'iniciador és un client. La nostra tasca és enviar la imatge Ceph a l'iniciador amb el mínim esforç. Això vol dir que hem d'ampliar l'objectiu. Però on, a quin ordinador?

Afortunadament, en un clúster Ceph tenim almenys un component l'adreça IP del qual està fixada i en el qual està configurat un dels components més importants de Ceph, i aquest component és el monitor. En conseqüència, instal·lem un objectiu iSCSI al monitor (i un iniciador al mateix temps, almenys per a les proves). Ho vaig fer a CentOS, però la solució també és adequada per a qualsevol altra distribució; només cal que instal·leu els paquets de la manera que sigui acceptable a la vostra distribució.

# yum -y install iscsi-initiator-utils targetcli

Quin és l'objectiu dels paquets instal·lats?

  • targetcli — una utilitat per gestionar l'objectiu SCSI integrat al nucli Linux
  • iscsi-initiator-utils — un paquet amb utilitats utilitzades per gestionar l'iniciador iSCSI integrat al nucli Linux

Per enviar una imatge mitjançant iSCSI a l'iniciador, hi ha dues opcions per al desenvolupament d'esdeveniments: utilitzar el backend de l'espai d'usuari de l'objectiu o connectar la imatge com a dispositiu de bloc visible al sistema operatiu i exportar-la mitjançant iSCSI. Anirem pel segon camí: el backend de l'espai d'usuari encara es troba en un estat "experimental" i no està lleugerament preparat per a un ús productiu. A més, hi ha trampes, sobre les quals es pot parlar molt i (oh horror!) discutir.

Si fem servir fins i tot una distribució una mica estable amb un cicle de suport llarg, aleshores el nucli que tenim és una versió antiga i antiga. Per exemple, a CentOS7 és 3.10.*, a CentOS8 és 4.19. I ens interessa un nucli d'almenys 5.3 (o més aviat 5.4) i més recent. Per què? Perquè per defecte les imatges Ceph tenen un conjunt d'opcions habilitats que no són compatibles amb els nuclis més antics. Això vol dir que connectem un repositori amb un nou nucli per a la nostra distribució (per exemple, per a CentOS això és elrepo), instal·lem el nou nucli i reiniciem el sistema per treballar amb el nou nucli:

  • Connecteu-vos al monitor seleccionat per a l'experiment
  • Connectem els dipòsits elrepo segons les instruccions: elrepo.org/tiki/tiki-index.php
  • Instal·leu el nucli: yum -y —enablerepo=elrepo-kernel install kernel-ml
  • Reinicieu el servidor amb el monitor (tenim tres monitors, oi?)

Connectant la imatge com a dispositiu de bloc

# rbd map mypool/myimage
/dev/rbd0

Només queda configurar l'objectiu. En aquest exemple, configuraré l'objectiu en l'anomenat. Mode de demostració: sense autenticació, visible i accessible per a tothom. En un entorn de producció, és probable que vulgueu configurar l'autenticació, però això està una mica fora de l'abast de l'exercici d'avui només per diversió.

Creeu un backend anomenat disc1 associat amb el fitxer /dev/rbd/mypool/myimage. El fitxer especificat és un enllaç simbòlic creat automàticament pel dimoni udev a /dev/rbd0. Utilitzem un enllaç simbòlic perquè el nom del dispositiu rbd pot canviar en funció de l'ordre en què es connecten les imatges Ceph a l'amfitrió.

Creeu un backend:

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

Creeu un objectiu iSCSI:

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

Connectem el backend com a LUN a l'objectiu:

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

Configurem l'objectiu per al mode de demostració:

# 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

Deseu la configuració:

# targetcli saveconfig

Comprovació de la disponibilitat de l'objectiu:

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

Connectem l'objectiu:

# 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.

Si ho heu fet tot correctament, apareixerà un disc nou al servidor, que sembla un dispositiu SCSI, però en realitat és una imatge de Ceph, a la qual s'accedeix a través d'un objectiu iSCSI. Per evitar problemes d'arrencada, és millor eliminar el disc connectat i l'objectiu detectat de l'iniciador local:

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

Només queda persistir la configuració perquè la imatge es connecti automàticament i, després de la connexió, l'objectiu s'estratifiqui. El llançament d'un objectiu consta de dos passos: connectar el RBD i llançar l'objectiu.

Primer, configurem la connexió automàtica de les imatges RBD a l'amfitrió. Això es fa afegint les línies següents al fitxer /etc/ceph/rbdmap:

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

Restaurar la configuració de destinació és una mica més complicat: hem d'escriure una unitat per a systemd que restablirà la configuració:

# cat /usr/lib/systemd/system/scsi-target.service
[Unit] Description=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

La prova final és reiniciar el nostre monitor (ara és un objectiu iSCSI). Cal tenir en compte que si no haguéssim esborrat la base de dades de l'iniciador amb l'ordre iscsiadm -n discoverydb -o suprimir... podríeu acabar amb un servidor que no es carrega o que triga molt a carregar-se.

Què queda?

Configureu l'iniciador al servidor on volem enviar l'objectiu.

Com garantir la tolerància a errors del nostre objectiu?

De la mateixa manera, podeu configurar objectius en altres monitors i configurar múltiples camins (vmware ho entendrà i fins i tot funcionarà, Hyper-V no ho entendrà: requereix bloquejos SCSI). Com que el client Ceph del nucli no utilitza la memòria cau, això és força viable. O una altra opció és crear un recurs de clúster de tres components: una adreça IP de destinació dedicada i serveis rbdmap i scsi-target, i gestionar aquest recurs mitjançant eines de clúster (qui va dir marcapassos?)

En lloc d'un terme final

Com està clar, aquest article és una mica de broma, però en ell he intentat considerar "ràpidament i amb exemples" diversos temes força populars alhora: l'objectiu iSCSI, que potser no necessàriament exporta imatges Ceph, però per exemple, exportar volums LVM, conceptes bàsics de treballar amb un iniciador iSCSI (com escanejar un objectiu, com connectar-se a un objectiu, desconnectar, eliminar una entrada de destinació de la base de dades), escriure la vostra pròpia unitat per a systemd i alguns altres

Espero que fins i tot si no repetiu tot aquest experiment en la seva totalitat, almenys alguna cosa d'aquest article us serà útil.

Font: www.habr.com

Afegeix comentari