Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Por su parte, Red Hat y Canonical (Ubuntu) se unieron al proyecto, y hoy Ubuntu es el SO
que más despliegue tiene como soporte de los servicios de OpenStack.
Para darle seguridad a una nube OpenStack, las comunicaciones HTTP pasan primero por
un servidor de autenticación, Keystone, que devuelve tokens para habilitar a los stacks
hablar entre ellos. Los tokens se usan mucho en las REST API.
Es cierto que IaaS está asociado a flexibilidad, variedad, aprovechamiento del HW al más
bajo nivel posible. Pero también es cierto que, en última instancia, el objetivo del cloud
computing es brindar servicios a través de la red, los cuales (los servicios) corren dentro de
un entorno virtualizado, en una distribución GNU/Linux en nuestro caso.
Casi que la definición de IaaS nos hace creer que es la manera de acceder a nuestros
recursos de Hardware de manera pura y directa, sin pasar por una plataforma (un programa
o software por encima) que nos limiten en nuestras operaciones.
Esto me lleva a que me haga una pregunta esencial para lo que buscamos… ¿Cómo puedo
optimizar el uso del HW que tengo a disposición para poder brindar servicios de red?
Entonces… ¿Para qué levantar toda una infraestructura sostenida por stacks, corriendo en
el mismo HW, para que en realidad el fin sea ofrecer servicios fuera de la red donde viven
estos stacks?
¿Qué sentido tiene instalar stacks en un mismo servidor, y que entre ellos hablen por
encima de TCP/IP?, si quiero acceder a los recursos de un disco rígido, ¿primero debo
pasar por un servidor, estando físicamente en el mismo server?
La técnica de virtualización más extendida en el open source es QEMU, que emula por
completo el HW a bajo nivel, para hacerle creer a la vm que “ella es la dueña de todo el
HW”. QEMU funciona casi como cualquier emulador, y opera por lo tanto en la capa más
alta de virtualización:
Fuente:
https://docs.google.com/document/d/1koA2J26tzWjvTZycuUrOQ68g9hnC2vvhwsdoAs3b2e
A/edit
De modo que solo deben emularse las NICs, discos rígidos, CD-ROM, si operamos con
QEMU/KVM.
Con KVM, obtenemos un rendimiento de “Virtualización Clásica” en referencia al gráfico
anterior.
Como KVM actúa a nivel de kernel en el SO anfitrión, estamos trabajando en un entorno
bare metal (tener cuidado con este término).
1http://mmc.geofisica.unam.mx/femp/Herramientas/MaquinasVirtuales/VirtualizacionEnLinuxCon-Containers/FULLTEXT02.pdf
Es decir, pasamos de esto:
A esto otro:
El siguiente documento puede aclarar muy bien cómo se relacionan KVM y QEMU:
http://i2ds.org/2015/06/25/virtualizacion-a-fondo-la-relacion-entre-kvm-y-qemu/
Además, el hardware virtualizado con el que dimensionamos puede no ser adecuado a los
requerimientos de la vm, es probable que reservemos recurso para emulación, y luego la
vm no lo consuma: estamos reservando recurso ocioso.
LXC (linux container) opera exclusivamente sobre sistemas GNU/Linux. En pocas y simples
palabras aprovecha los espacios de usuario (namespaces, chroot, cgroups) para generar
entornos linux en paralelo y aislados, sin necesidad de emular hardware.
Es posible parametrizar una instancia LXC, podemos limitar los recursos de hardware
mediante namespaces. El container corre como un programa más, y solo en el caso de que
consuma mucho recurso, tendrá mayor o menor impacto sobre el rendimiento (sin reserva
de HW, solo cuotas para limitar el consumo).
El concepto y las bases de LXC fueron usados por Docker y LXD, esta última es una
implementación de Canonical para linux containers.
Y también:
https://ubunlog.com/el-hosting-y-los-contenedores-lxc/
El uso de LXC puede traer problemas de seguridad si no está bien implementado. Las
pruebas que realicé en la nube OpenStack dieron como resultado lo siguiente: las instancias
que levantaba con LXC como hipervisor, podían acceder al sistema de archivos del servidor
anfitrión (esto me pareció un gran problema de seguridad). VER
LXD, la implementación de Canonical, aparentemente seguriza los problemas de LXC, sin
embargo no funciona en OpenStack.
A continuación dejo un cuadro que compara las diversas técnicas de virtualización posibles
en nubes OpenStack:
https://docs.openstack.org/nova/latest/user/support-matrix.html
Vemos en el cuadro como LXC no soporta muchos de los servicios que otros hipervisores
si.
Con esta información en mente, puedo resumir algunas de mis experiencias con OpenStack
en lo que refieren exclusivamente a virtualización (los stacks Nova y Glance):
➔ Solo podríamos usar KVM/QEMU para poder tener acceso a las funcionalidades
necesarias (en referencia al link anterior). → OK
Podemos observar en el cuadro que LXC es inútil de implementar. → OK
➔ La implementación de QEMU/KVM es incluso muy restrictiva: se precisa preparar
una imagen especial para OpenStack del SO que se precisa virtualizar. Esta imagen
es para que pueda ser cargada en el servidor Glance y estar disponible para
levantar instancias desde allí. A bajo nivel termina emulando (con QEMU) los
recursos de HW (salvo micro y RAM que lo pasa directamente a KVM);
No es un proceso simple convertir una iso en una imagen compatible con Glance.
Cuando intenté compilar una imagen de FreeBSD me encontré con muchos
problemas, y poca información en internet. → OK, a analizar y testear
➔ Para acceder a la consola de la vm, OpenStack hace uso de noVNC, que es un
programa open source que usa HTML5 y que se encarga de emular la consola de
una vm. Puntualmente en OpenStack es muy lento su funcionamiento. → OK, a
analizar y testear
Los containers son las cajas que almacenan los objetos, que en definitiva contienen los
datos que allí almacenamos.
Sin embargo, recordemos que solo Cinder y Horizon pueden “dialogar” con Swift para
escribir o recuperar datos. Esto se condice con el verdadero sentido de Swift: backups de
datos seguro y confiable.
Nuevamente me pregunto… ¿Qué información necesito tener 100% disponible, confiable y
en redundancia? → La de CINDER (block storage)
A esta pregunta respondo de la siguiente manera:
- Los RAWs/QCOW2 de las vms: Si se rompe o pierde el bloque definido (y
reservado) para una vm, pues entonces la vm cae o al menos queda en un estado
de suspensión (en general, como no puede escribir más el disco donde tiene
montado el /, pone a esa partición en ro para protegerse y mantenerse “viva”). Estos
bloques no pueden estar almacenados en Swift, porque solo soporta backups y
además la instancia o vm no puede acceder directamente creyendo que es su disco
rígido. → Tal cual, según lo que nos venías contando
- Los backups de las vms: Sabemos que las rutinas de backups son muy importantes.
Tener disponible distintas versiones de una vm nos permite tener la flexibilidad de
“volver a esa versión” cuando tengamos problemas ante algún cambio drástico de la
vm. Swift puede almacenar backups (que en realidad son snapshots) pasando por
Cinder, en caliente. → Sería de SWIFT a través de GLANCE, llegando a NOVA que la
trabajaría contra CINDER, no?
Es un modelo horizontal en el sentido de que los stacks hablan todos contra todos →
KEYSTONE contra todos, después depende, ej: CINDER no habla con NEUTRON, en una red de
management en la que intercambian solicitudes y realizan operaciones según el caso (son
todas consultas HTTP).
Sin embargo, desplegar una nube openstack en un escenario de 3 servidores, nos obliga a
pensar en:
- 2 nodos que solo tengan instalado Nova y Cinder. → OK
- 1 nodo con todos los otros servicios. → OK
Los nodos Nova consumen recurso de CPU y memoria para las vms, de modo que
OpenStack recomienda que trabajen de manera independiente para poder aislar posibles
problemas (como un apagón o inconsistencia en los discos rígidos). Un nodo Nova que se
cae, implica la migración inmediata de las vms al otro nodo. → Aquí ya no tendríamos HA,
porque no puede conformarse un Cluster con 2 Nodos solamente, mínimo 3
Un solo nodo controller (con todos los stacks menos Nova) nos conduce directamente a una
nube que ya no es HA. En el caso de que se caiga este nodo controlador, las vm siguen
operativas pero ya no se pueden hacer maniobras como migrar vms, consultar el estado de
la nube, gestionar particiones, levantar nuevas vms, etc.
Lo anterior nos muestra que, con pocos servidores, el cloud queda reducido a un diseño
vertical. → mmm, Pacemaker?
Lograr HA en OpenStack significa tener réplicas de cada stack instaladas en diversos
servidores físicos. Algunos de estos stacks pueden funcionar en activo/activo y otros en
activo/pasivo. → Interesante... Desafortunadamente, Nova es un stack que no tiene desarrollo
para HA → Con Pacemaker no?, lo que nos compromete enormemente en nuestro diseño, al
menos hasta que brinden una solución abierta.
Otra opción es implementar nodos ALL-IN-ONE que tengan todos los stacks instalados
(algo así como Proxmox). Sin embargo, los foros no recomiendan implementaciones de este
estilo para un despliegue definitivo, debido a la pérdida de performance al sobrecargar los
nodos con tanto software. → Depende los recursos de las HW Nodos y las nececidades de NOVA
y NEUTRON fundamentalmente Una implementación ALL-IN-ONE también nos obliga a ser
muy minuciosos para garantizar HA y que los stacks redundantes no se pisen entre sí. En lo
personal me parece un desgaste muy grande para un diseño con poco rendimiento: siempre
es mejor tener discriminados los stacks en diversos entornos. → mmm...
Recordemos que Proxmox no es más que una versión estable de Debian, corriendo
software libre en su totalidad y con algunos programas desarrollados por la comunidad
Proxmox, que le da aún más performance al sistema.
Esta misma nube la podemos usar para crear una nube OpenStack virtualizada, usando
LXC para cada servicio-stack de OpenStack (esto se condice con la implementación
recomendada de OSA, desarrollo open source de RackSpace), y KVM para Nova o incluso
un nodo aparte.
Las herramientas de virtualización que nos ofrece Proxmox y su integración con Pacemaker
nos provee de vms (KVM o LXC) en HA corriendo en almacenamiento en HA (Ceph,
GlusterFS, etc.)
Tener OpenStack virtualizado con LXC me da casi la misma performance que al estar bare
metal (instalado en el mismo entorno de trabajo que el usuario proxmox), pero con muchas
más flexibilidades, entre ellas:
- discriminar y aislar cada stack de OpenStack en un LXC diferente (tal y como lo
hace Rackspace).
- snapshots separados para poder recuperar el estado de un stack en cualquier
momento (ya que usaríamos ZFS como almacenamiento o al menos QCOW2)
- backups de los stacks.
- HA de los stacks, configuraciones activo/activo ó activo/pasivo sin ningún punto de
fallo (podemos usar para esto IPs flotantes con Pacemaker).
- Cinder funcionaría en forma bare metal ya que tendría sus propios bloques de
storage dedicado.
- OpenStack con rendimiento bare metal.
- desarrollos open source instalados sobre proxmox para mejorar la performance de la
nube.
- logs openstack aislados.
- Desarrollo 100% GNU/Linux sobre una distribución estable, libre y LTS como Debian
Stretch 9.
ClusterLabs, como la imagen que antecede a este texto explica, es sofware open source
para el diseño de clusters (más de un servidor conectado para brindar recursos de red) en
Alta Disponibilidad.
Los proyectos Corosync y Pacemaker son la esencia de ClusterLabs.
OpenStack recomienda el uso de este software para la configuración de stacks en
activo/activo o activo/pasivo según el caso. Se puede consultar el siguiente link al respecto:
https://docs.openstack.org/ha-guide/
Es importante mencionar en este punto, que Nova es un stack que aún no tiene una guía
para HA.
Por su parte, Pacemaker también se instala en cada nodo del cluster y tiene como función
la ejecución de acciones en el caso de falla de algún nodo del cluster.
Pacemaker define el concepto de resource a un recurso (un servicio o programa corriendo
en un nodo, una IP flotante, un script que se ejecuta cuando hay una caída, etc) que,
corriendo en un nodo, cuando este falla, otro nodo debe levantarlo.
Hay muchos resources que vienen por defecto en Pacemaker, el más usado es el recurso
IP flotante, que asigna una dirección IP a un nodo (alguno de los nodos toma el recurso). Si
este nodo cae, la IP flotante (la misma dirección) la toma otro nodo de modo que el servicio
que tenía esa IP sigue estando disponible.
Por ejemplo, logré con éxito configurar HA con GlusterFS + IP flotante con pacemaker,
entre dos nodos de un clúster. Para servidores NFS también es una buena alternativa para
proveer HA...
Otras fuentes:
Ver:
http://sedici.unlp.edu.ar/bitstream/handle/10915/50514/Documento_completo.pdf-PDFA.pdf?
sequence=1
También:
https://riunet.upv.es/bitstream/handle/10251/68958/OSUNA%20-%20Creaci%C3%B3n
%20de%20sistema%20cloud%20con%20OpenStack.pdf?sequence=1
A mi no me parece mal pensar en, digamos, Cinder como un monstruo enorme que maneja
todo el almacenamiento que tenemos y distribuye la carga en los discos que maneja (con
LVM). OpenStack puede ser un proyecto enorme con muchísimos servidores corriendo y
sirviendo, muy ágil para integrar nuevos stacks (con Ansible especialmente).
Sin embargo la manera en que percibo OpenStack, el enfoque que le doy, es siempre
pensando en HA: siempre pensando en que ningún servicio se corte nunca, pase lo que
pase; estar protegidos frente a cualquier evento.
Y para pensar esta HA, enseguida pienso o recuerdo el HW que dispongo para el diseño:
no puedo abstraerme en este sentido.
Y a decir verdad, estudiar OpenStack pensando todo el tiempo en HA, hace que se perciba
distinto a lo que realmente está enfocado: siento que es como encararlo de comienzo por un
costado débil del proyecto.
https://wiki.openstack.org/wiki/Masakari#Masakari:_Instances_High_Availability_Service
https://docs.openstack.org/ha-guide/index.html
https://docs.openstack.org/ha-guide/intro-ha-arch-pacemaker.html
https://docs.openstack.org/ha-guide/intro-ha.html