Saltar al contenido
StrongLinux

Documentación

Nube de varios nodos con alta disponibilidad (strongctl)

Con más de un controller en el inventario, strongctl arma el plano de control en alta disponibilidad. No hace falta ninguna opción adicional: la variable ha (en group_vars/all.yml) se vuelve verdadera por sí sola.

Ejemplo: 3 controllers, 2 computes

strongctl init --vip 10.0.0.10 \
  --controller ctl1=10.0.0.11 --controller ctl2=10.0.0.12 --controller ctl3=10.0.0.13 \
  --compute cmp1=10.0.0.21 --network cmp1=10.0.0.21 \
  --compute cmp2=10.0.0.22 --storage cmp2=10.0.0.22
strongctl bootstrap && strongctl deploy && strongctl verify

strongctl se ejecuta en uno de los controllers y accede a los nodos por SSH como root (la clave de root del controller en authorized_keys). --vip es una IP libre en la red de gestión: es la dirección pública de las APIs (controller_address).

Qué se ejecuta en cada controller

ComponenteCómo queda en alta disponibilidad
VIP de las APIsKeepalived (VRRP unicast). La VIP queda en el controller de mayor prioridad con HAProxy activo y cambia de nodo en pocos segundos si HAProxy o el nodo fallan.
HAProxyEn los 3 controllers, escuchando en la VIP (ip_nonlocal_bind). Termina el TLS y reparte las APIs entre los 3.
APIs (uWSGI)En los 3 controllers, escuchando en la dirección de gestión de cada uno.
MariaDBClúster Galera en los 3 controllers. Los servicios usan VIP:3306, donde HAProxy envía todo a un solo nodo (los demás quedan en reserva) para evitar conflictos de escritura.
RabbitMQClúster en los 3 controllers (cookie común, pause_minority). Los servicios reciben los 3 nodos en transport_url y usan colas quorum (rabbit_quorum_queue).
memcachedEn los 3 controllers. Los servicios reciben la lista de los 3.
OVN NB/SBClúster RAFT en los 3 controllers. ovn-northd se ejecuta en todos: uno activo y los demás en espera. Neutron y los chassis reciben la lista de los 3.
KeystoneEn los 3 controllers, con las mismas claves fernet y credential (copiadas del primero).
HorizonEn los 3 controllers, con la misma SECRET_KEY (la sesión vale en cualquiera).
GlanceEn los 3 controllers, pero HAProxy envía todo al primero y deja los demás en reserva, porque el almacenamiento file es local. Con almacenamiento compartido (NFS, Ceph), use glance_shared_store: true en globals.yml para habilitar los tres.
Metadata y noVNCEscuchan en todos los controllers y responden en la VIP dondequiera que esté.

Las tareas de base de datos (db sync, celdas de Nova, metadefs de Glance, bootstrap de Keystone) se ejecutan una sola vez, en el primer controller.

Comprobación

strongctl verify también comprueba, en cada controller:

Recuperación

Prueba de laboratorio

tests/lxd/run-multinode.sh monta la nube anterior en 5 contenedores LXD y:

  1. despliega y comprueba la idempotencia;
  2. crea una VM en cada nodo de cómputo y prueba la IP flotante;
  3. apaga el dueño de la VIP y comprueba que la nube sigue funcionando (token, listas, una VM nueva);
  4. vuelve a encender el controller y comprueba que regresa al clúster;
  5. ejecuta Tempest smoke.

El resultado queda en out/multinode/.