Etiqueta: Rocky

Pool iSCSI para KVM

KVM puede utilizar iSCSI como backend de almacenamiento, si se cuenta con una SAN (Storage Area Network) pueden asignarse LUN’s (Logical Unit Numbers) y presentarlas a las máquinas virtuales. El pool es creado en el almacenamiento pero libvirt no puede crearlo o eliminarlo.

Instalación Servidor iSCSI


Hostname: target.local
IP Address: 192.168.100.127

Comenzamos con la instalación.

]$ sudo yum install -y targetd targetcli
]$ sudo systemctl enable --now target

Habilitamos el servicio en el cortafuegos.

]$ sudo firewall-cmd --add-service=iscsi-target --permanent
]$ sudo firewall-cmd --reload
success

En este punto ya contamos con un lvm de 30 GB sin montar, en este caso /dev/vg1/lv1.

[tusysadmin@target ~]$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 1024M  0 rom
vda         252:0    0    6G  0 disk
├─vda1      252:1    0    5G  0 part
│ ├─rl-root 253:0    0  4.4G  0 lvm  /
│ └─rl-swap 253:1    0  616M  0 lvm  [SWAP]
└─vda2      252:2    0    1G  0 part /boot
vdb         252:16   0   30G  0 disk
└─vdb1      252:17   0   30G  0 part
  └─vg1-lv1 253:2    0   30G  0 lvm

Lanzamos la utilidad targetcli.

[root@target ~]# targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ............................................................... [...]
  o- backstores .................................................... [...]
  | o- block ........................................ [Storage Objects: 0]
  | o- fileio ....................................... [Storage Objects: 0]
  | o- pscsi ........................................ [Storage Objects: 0]
  | o- ramdisk ...................................... [Storage Objects: 0]
  o- iscsi .................................................. [Targets: 0]
  o- loopback ............................................... [Targets: 0]
/>

Crearemos un dispositivo de bloques, esto lo hacemos dentro de backstores/block.

/> backstores/block create vms_store /dev/vg1/lv1
Created block storage object vms_store using /dev/vg1/lv1.
/>

Creamos el IQN (iSCSI Qualified Name).

/> cd iscsi
/iscsi> create iqn.2022-05.com.target:vms
Created target iqn.2022-05.com.target:vms.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi>

Creamos el LUN asociado al bloque vms_store.

/iscsi> cd iqn.2022-05.com.target:vms/tpg1
/iscsi/iqn.20...rget:vms/tpg1> luns/ create /backstores/block/vms_store
Created LUN 0.
/iscsi/iqn.20...rget:vms/tpg1>

Ahora creamos una ACL (Access Control List) en el que indicamos el IQN del cliente al que presentaremos la LUN.

/iscsi/iqn.20...rget:vms/tpg1> acls/ create iqn.2022-05.com.iniciator:vms
Created Node ACL for iqn.2022-05.com.iniciator:vms
Created mapped LUN 0.
/iscsi/iqn.20...rget:vms/tpg1>

Salimos de targetcli y verificamos que el puerto este abierto.

[tusysadmin@target ~]$ ss -an | grep 3260
tcp    LISTEN     0      256       *:3260                  *:*

Configurar iniciador

Ahora toca configurar el iniciador iSCSI en nuestro servidor de máquinas virtuales para posteriormente presentarlo a KVM.

[tusysadmin@localhost ~]$ sudo yum install iscsi-initiator-utils -y

Editamos el archivo initiatorname.iscsi

~]$ sudo vi /etc/iscsi/initiatorname.iscsi

En este archivo ponemos el nombre que anteriormente agregamos en la ACL.

InitiatorName=iqn.2022-05.com.iniciator:vms

Probamos la configuración.

[tusysadmin@localhost ~]$ sudo iscsiadm -m discovery -t st -p target.local
192.168.100.127:3260,1 iqn.2022-05.com.target:vms

Hacemos el login al target.

~]$ sudo iscsiadm --mode node --targetname iqn.2022-05.com.target:vms --portal target.local --login
Logging in to [iface: default, target: iqn.2022-05.com.target:vms, portal: 192.168.100.127,3260]
Login to [iface: default, target: iqn.2022-05.com.target:vms, portal: 192.168.100.127,3260] successful.

Crear el pool

Con la conexión establecida a nuestra servidor de maquina virtuales ya podemos crear el pool iSCSI y usarlo en nuestras maquinas virtuales. Creamos el archivo iscsipool.xml con el siguiente contenido.

<pool type='iscsi'>
    <name>iscsipool</name>
    <source>
        <host name='192.168.100.127'/>
        <device path='iqn.2022-05.com.target:vms'/>
    </source>
    <initiator>
	    <iqn name='iqn.2022-05.com.iniciator:vms' />
    </initiator>
    <target>
        <path>/dev/disk/by-path</path>
    </target>
</pool>

Básicamente es la información del target y del iniciador lista para ser agregada a KVM. Ahora definimos, iniciamos y auto iniciamos el pool.

[tusysadmin@localhost ~]$ sudo virsh pool-define --file iscsipool.xml
El grupo iscsipool ha sido definido desde iscsipool.xml

[tusysadmin@localhost ~]$ sudo virsh pool-start --pool iscsipool 
Se ha iniciado el grupo iscsipool

[tusysadmin@localhost ~]$ sudo virsh pool-autostart --pool iscsipool
El grupo iscsipool ha sido marcado como iniciable automáticamente

Listamos el pool la información de el mismo.

[tusysadmin@localhost ~]$ sudo virsh pool-info iscsipool
Nombre:         iscsipool
UUID:           80ba818f-14da-4c77-aee4-55f82dcefc34
Estado:         ejecutando
Persistente:    si
Autoinicio:     si
Capacidad:      30.00 GiB
Ubicación:      30.00 GiB
Disponible:     0.00 B

Con esto, el pool ya puede ser usado en KVM como otro pool para presentarse a las maquinas virtuales.

Instalar servidor web con alta disponibilidad

Contar con un sitio web con un alto porcentaje de disponibilidad es alcanzable cuando el sitio no se encuentra en un solo servidor. Al evitar un único punto de falla el sitio puede permanecer visible para los usuarios.

En este post aprenderemos como implementar Pacemaker en Rocky Linux con un servidor web Apache. Estos son los servidores que usaremos en nuestro ambiente.

192.168.100.117 www1.cluster www1
192.168.100.114 www2.cluster www2

Comenzamos la instalación de paquetes en ambos servidores y habilitamos el servicio.

~]$ sudo yum install -y pacemaker pcs resource-agents
~]$ sudo systemctl enable pcsd.service
~]$ sudo systemctl start pcsd.service

Habilitamos la aplicación en el firewall.

]$ sudo firewall-cmd --permanent --add-service=high-availability
]$ sudo firewall-cmd --reload

Con la instalación de los paquetes se creó el usuario hacluster, es necesario establecer la contraseña a este usuario ya que la necesitaremos para crear la conexión entre los servidores.

~]$ sudo passwd hacluster

Con todo lo anterior terminado ya podemos crear el cluster.

[tusysadmin@www1 ~]$ sudo pcs host auth www1 www2 -u hacluster
Password: 
www2: Authorized
www1: Authorized
[tusysadmin@www1 ~]$ sudo pcs cluster setup web www1 www2
No addresses specified for host 'www1', using 'www1'
No addresses specified for host 'www2', using 'www2'
Destroying cluster on hosts: 'www1', 'www2'...
www1: Successfully destroyed cluster
www2: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'www1', 'www2'
www1: successful removal of the file 'pcsd settings'
www2: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'www1', 'www2'
www1: successful distribution of the file 'corosync authkey'
www1: successful distribution of the file 'pacemaker authkey'
www2: successful distribution of the file 'corosync authkey'
www2: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'www1', 'www2'
www1: successful distribution of the file 'corosync.conf'
www2: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up

Habilitamos e iniciamos el cluster.

[tusysadmin@www1 ~]$ sudo pcs cluster start --all
www2: Starting Cluster...
www1: Starting Cluster...
[tusysadmin@www1 ~]$ sudo pcs cluster enable --all
www1: Cluster Enabled
www2: Cluster Enabled
[tusysadmin@www1 ~]$ sudo pcs cluster status
Cluster Status:
 Cluster Summary:
   * Stack: corosync
   * Current DC: www2 (version 2.1.0-8.el8-7c3f660707) - partition with quorum
   * Last updated: Wed Jan 26 21:01:54 2022
   * Last change:  Wed Jan 26 16:44:48 2022 by hacluster via crmd on www2
   * 2 nodes configured
   * 0 resource instances configured
 Node List:
   * Online: [ www1 www2 ]

PCSD Status:
  www1: Online
  www2: Online

El cluster cuenta con dos nodos pero lo correcto sería que contara con 3 para poder tener Quorum y «tomar decisiones» con respecto a la disponibilidad del cluster. Si se tienen 3 nodos y uno no se encuentra disponible se conservan la mayoría de los nodos. Como no contamos con un tercer nodo no es necesario tener habilitado el STONITH (Shoot The Other Node In The Head).

[tusysadmin@www1 ~]$ sudo pcs property set no-quorum-policy=ignore
[tusysadmin@www1 ~]$ sudo pcs property set stonith-enabled=false

La disponibilidad del servicio web se hace a través de una IP flotante; esta IP estará asignada a uno de los nodos pero cuando éste no se encuentre disponible la IP pasará (flotará) al otro nodo. Al no afectar la visibilidad del sitio esta falla pasa desapercibida por los usuarios.

sudo pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.100.110 cidr_netmask=24 op monitor interval=30s

La IP 192.168.100.110 es el recurso asignado en nuestro cluster y de momento se encuentra en el servidor www1, al detenerse el servicio o estar fuera de linea este servidor dicha IP cambiara a www2.

www1 con la IP

Image 1 De 3

En ambos servidores instalamos, habilitamos y permitimos el tráfico en el firewall.

~]$ sudo yum install httpd -y
~]$ sudo systemctl enable --now httpd
~]$ sudo firewall-cmd --permanent --add-service http
~]$ sudo firewall-cmd --reload

Editamos el Logrotate para denegar el uso de systemd en el cluster

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
#        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true

    /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd/httpd.pid" -k graceful > /dev/null 2>/dev/null || true

    endscript
}

Al archivo de configuración de Apache agregamos la ruta del identificador del proceso.

PidFile /var/run/httpd/httpd.pid

Agregamos un nuevo recurso llamado webserver

~]$ sudo pcs resource create webserver apache configfile="/etc/httpd/conf/httpd.conf" 

[tusysadmin@www1 ~]$ sudo pcs resource status
  * Resource Group: apache:
    * virtual_ip	(ocf::heartbeat:IPaddr2):	 Started www1
  * webserver	(ocf::heartbeat:apache):	 Started www2

La IP virtual se encuentra en el nodo www1 pero el servicio web estará respondiendo en el nodo www2

[tusysadmin@www2 ~]$ netstat -ant | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 ::1:54942               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:54940               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:54946               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:54938               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:54936               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:54944               ::1:80                  TIME_WAIT 

Si detenemos el nodo www2 el tráfico http pasará al nodo www1.

[tusysadmin@www1 ~]$ sudo pcs node standby www2

[tusysadmin@www1 ~]$ sudo pcs resource status
[sudo] password for tusysadmin: 
  * Resource Group: apache:
    * virtual_ip	(ocf::heartbeat:IPaddr2):	 Started www1
  * webserver	(ocf::heartbeat:apache):	 Started www1

[tusysadmin@www1 ~]$ netstat -ant | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 ::1:39616               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:39626               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:39624               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:39618               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:39620               ::1:80                  TIME_WAIT  
tcp6       0      0 ::1:39622               ::1:80                  TIME_WAIT 

Él ultimo detalle que faltaría a nuestro cluster sería el de integrar un sistema de archivos para que los archivos de nuestro sitio web fueran los mismos, para esto se pudiera usar GlusterFS, NFS o iSCSI.

© 2025

Tema por Anders NorenArriba ↑