Resumen
OpenStack es un software para la creación de clouds. El proyecto OpenStack ofrece gran cantidad de componentes para implementar los diferentes servicios que se quieran desplegar en nuestro cloud (máquinas virtuales, infraestructura de red, almacenamiento de bloques, almacenamiento de archivos compartidos, almacenamiento de objetos, orquestación, monitorización, por citar algunos). OpenStack tiene una arquitectura totalmente modular en la que partiendo de los componentes básicos (Keystone para autenticación, Glance para imágenes, Neutron para redes y Nova para instancias) podemos ir añadiendo los componentes adecuados para poder desplegar los servicios que queremos ofrecer.
En este tutorial se describen los pasos de instalación de los componentes que actualmente están disponibles en OpenStack-DI.
El acceso a OpenStack-DI y a otros recursos más de Cloud-DI se puede hacer directamente desde https://openstack.di.ual.es/horizon o desde la web de servicios de Cloud-DI https://cloud.di.ual.es. Allí además hay disponible una lista de respuestas a preguntas frecuentes y los Términos de servicio de Cloud-DI. En https://moodle.di.ual.es se encuentran disponibles una serie de videos ilustrativos sobre los sevicios ofrecidos por Cloud-DI y sobre las operaciones básicas para el uso de OpenStack-DI. Para realizar operaciones repetitivas o avanzadas es conveniente utilizar el CLI. Aquí está disponible la Lista de comandos CLI. |
1. Componentes de OpenStack
OpenStack es un proyecto formado por distintos componentes. Cada uno de ellos añade una función a nuestro cloud (networking, almacenamiento, máquinas virtuales, orquestación, …). Podemos clasificar estos componentes en básicos y opcionales.
-
Componentes básicos
-
Keystone: Servicio de Identidad (*)
-
Neutron: Servicio de redes (*)
-
Glance: Servicio de imágenes (*)
-
Nova: Servicio de cómputo (máquinas virtuales) (*)
-
-
Componentes opcionales
-
Horizon: Interfaz web (*)
-
Cinder: Almacenamiento de bloques (*)
-
Manila: Servicio de sistemas de archivos compartidos (*)
-
Swift: Servicio de almacenamiento de objetos (*)
-
Sahara: Servicio de procesamiento de datos (*)
-
Ceilometer: Servicio de recolección de datos de telemetría
-
Aodh: Servicio de alerta de telemetría
-
Heat: Servicio de orquestación (*)
-
Barbican: Servicio de gestión de claves (*)
-
Ironic: Aprovisionamiento en máquinas físicas
-
Cloudkitty: Servicio de tarificación
-
Los componentes marcardos con asterisco (*) están disponibles actualmente en OpenStack-DI. |
La figura siguiente ilustra los componentes instalados en OpenStack-DI y su interacción básica. Los componentes en rojo son los componentes básicos.
-
Keystone proporciona servicios de identificación a todos los componentes OpenStack
-
Horizon proporciona un portal web de acceso al resto de componentes salvo a Keystone.
-
Glance proporciona las imágenes al crear las máquinas virtuales.
-
Neutron proporciona los servicios de networking a las máquinas virtuales
-
Cinder propociona almacenamiento de bloques a las máquinas virtuales. Cinder también puede guardar snapshots de volumen.
-
Manila propociona servicios de almacenamiento compartido de archivos a las máquinas virtuales
-
Swift propociona almacenamiento de objetos a las máquinas virtuales y a Sahara. Opcionalmente se puede configurar Nova para almacenar las imágenes en Swift.
-
Ceilometer recoge medidas de uso de los componentes de networking, imágenes, cómputo, almacenamiento y procesamiento de datos.
-
Heat permite la creación de stacks para la creación de infraestructura mediante código. Opcionalmente se puede combinar con Ceilometer par ajustar dinánicamente la infraestructura en función del uso de recursos (RAM, cores, almacenamiento) recopilado por Ceilometer.
Los componentes de OpenStack exponen una API que es usada por los distintos servicios. Cada componente también suele utilizar una base de datos donde registra sus elementos, estado, operaciones, y demás. La comunicación con la base de datos se realiza con el protocolo AMQP. |
2. Preparación del entorno
Para la instalación de los componentes de este tutorial partimos del siguiente escenario en el que contaremos con servidores dedicados para Control, Red y Cómputo. Los servicios de almacenamiento tienen los requisitos siguientes:
-
Cinder: Almacenamiento en un NAS Synology y servicios ejecutándose en el nodo de Control.
-
Manila: Servidor independiente.
-
Swift: Dos servidores para proporcionar tolerancia a fallos.
La figura siguiente ilustra la arquitectura de referencia que usaremos en este tutorial. Tal y como aparece en la Guía de networking en la instalación de OpenStack dispondremos de una red de mantenimiento, una red de túnel y la red externa.
Como se observa en la figura, todos los servidores están conectados a las redes de mantenimiento y túnel.
Además, los servidores siguientes están contectados al exterior a través de una red externa, que proporciona conexión a Internet a las máquinas virtuales, y en el caso de OpenStack-DI al almacenamiento de archivos compartidos.
-
Control: Proporciona acceso a la consola de Horizon en la red de la UAL.
-
Red: Ofrece conectividad a la red de la UAL a las máquinas virtuales.
-
Almacenamiento compartido: Permite ofrecer sistemas de archivos de compartidos en la red de la UAL.
La red de mantenimiento proporciona comunicación interna entre los componentes de OpenStack. La red de túnel (también conocida como |
Los requisitos hardware mínimos de cada servidor son los que aparecen el la arquitectura de ejemplo de la guía de instalación de OpenStack.
Si dispones de recursos en una plataforma OpenStack que disponga del componente |
2.1. Configuración de las interfaces de red
Es recomendable, aunque no necesario, una nomenclatura uniforme de las interfaces de red de los servidores que ofrecen la infraestructura a OpenStack. Si hay diferencias, recomendamos seguir la denominación clásica eth0
, eth1
, … Sigue como root
estos pasos cambiar los nombres de la interfaces de red a eth0
, eth1
, …
-
Editar
/etc/default/grub
y cambiar la líneaGRUB_CMDLINE_LINUX=""
porGRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
. -
Actualizar GRUB con
update-grub
. -
Actualizar el archivo
/etc/network/interfaces
con las interfaces de red ya aeth0
,eth1
, … -
Reiniciar el sistema con
reboot
3. Preparación de las máquinas
-
En cada máquina crear un archivo
/etc/hosts
con las direcciones IP de la red de mantenimiento y los nombres que vayamos a dar a las máquinas:10.0.0.51 testcontroller 10.0.0.52 testnetwork 10.0.0.53 testcompute01 10.0.0.54 testcompute02 10.0.0.55 testcompute03 10.0.0.56 testcompute04 10.0.0.61 testobject01 10.0.0.62 testobject02 10.0.0.63 testshared
-
Instalar
chrony
en todas las máquinas# apt-get install chrony
-
Modificar en la máquina de control el archivo
/etc/chrony/chrony.conf
-
Modificar en el resto de máquinas el archivo
/etc/chrony/chrony.conf
-
Reiniciar
chrony
en todos los nodos# service chrony restart
-
Revisar funcionamiento de
chrony
en todos los nodos# chronyc sources
-
Añadir el repositorio de OpenStack Ocata en todos los nodos
# apt-get install software-properties-common # add-apt-repository cloud-archive:ocata # apt update && apt dist-upgrade
-
Instalar el cliente Python para OpenStack en todos los nodos
# apt install python-openstackclient
-
Instalar la base de datos en el nodo de control
# apt-get install mariadb-server python-pymysql libmysqlclient-dev
-
Modificar el archivo
/etc/mysql/mariadb.conf.d/99-openstack.cnf
en el nodo de control -
Modificar el archivo
/root/my.cnf
en el nodo de control# service mysql restart # mysql_secure_installation
-
Instalar la cola de mensajes en el nodo de control
# apt install rabbitmq-server # rabbitmqctl add_user openstack {{ RABBIT_PASS }} (1) # rabbitmqctl set_permissions openstack ".*" ".*" ".*"
1 Contraseña de RabbitMQ -
Instalar Memcached en el nodo de control
# apt install memcached python-memcache
-
Modificar el archivo
/etc/memcached.conf
-
Reiniciar Memcached
# service memcached restart
4. Instalación de Keystone
La instalación de Keystone se realiza en el nodo de control
-
Creación y configuración de la base de datos
keystone
MariaDB [(none)]> CREATE DATABASE keystone; Grant proper access to the keystone database: MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ IDENTIFIED BY {{ 'KEYSTONE_DBPASS' }}; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ IDENTIFIED BY {{ 'KEYSTONE_DBPASS' }}; (2)
1 Contraseña del usuario Keystone 2 Contraseña del usuario Keystone -
Instalar los paquetes de Keystone
# apt install keystone
-
Configurar el archivo
/etc/keystone/keystone.conf
-
Reiniciar MySQL
# service mysql restart
-
Inicializar la base de datos Keystone:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
-
Inicializar los repositorios de claves Fernet
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone # keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
-
Iniciar los servicios de Keystone
keystone-manage bootstrap --bootstrap-password {{ admin_pass}} --bootstrap-admin-url http://{{ nodes_by_name.controller.management_ip }}:35357/v3/ --bootstrap-internal-url http://{{ nodes_by_name.controller.tunnel_ip }}:5000/v3/ --bootstrap-public-url http://{{ nodes_by_name.controller.provider_ip}}:5000/v3/ --bootstrap-region-id {{ region }} (1)
1 Completar con la contraseña de admin
, las direcciones IP del nodo de control y el nombre de la región (p.e.RegionOne
) -
Configurar el archivo
/etc/apache2/apache2.conf
-
Reiniciar Apache
# service apache2 restart
-
Eliminar la base de datos SQLite predetermianda
# rm -rf /var/lib/keystone/keystone.db
-
Configurar el archivo de credenciales del usuario
admin
. Crear un archivo denominadoopenrc-admin
.export OS_USERNAME=admin export OS_PASSWORD={{ admin_pass }} (1) export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://{{ nodes.controller.name }}:35357/v3 (2) export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 export OS_AUTH_TYPE=password
1 Contraseña de admin
2 Nombre del nodo de control -
Configurar el archivo de credenciales del usuario
demo
. Crear un archivo denominadoopenrc-demo
.export OS_USERNAME=demo export OS_PASSWORD={{ demo_pass }} (1) export OS_PROJECT_NAME=demo export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://{{ nodes.controller.name }}:5000/v3 (2) export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 export OS_AUTH_TYPE=password
1 Contraseña de demo
2 Nombre del nodo de control -
Realizar la configuración de Keystone (dominio
default
, proyectosservice
ydemo
, usuariodemo
, roluser
y añadir el usuariodemo
al proyectodemo
con el roluser
)# source openrc-admin (1) # openstack domain create --description "Default Domain" default # openstack project create --domain default --description "Service Project" service # openstack project create --domain default --description "Demo Project" demo # openstack user create --domain default demo --password {{ demo_pass }} (2) # openstack role create user # openstack role add --project demo --user demo user
1 Cargar las credenciales de admin
2 Contraseña del usuario demo
-
Configurar el archivo
/etc/keystone/keystone-paste.ini
5. Instalación de Glance
La instalación de Glance se realiza en el nodo de control.
-
Creación y configuración de la base de datos
glance
MariaDB [(none)]> CREATE DATABASE glance; MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \ IDENTIFIED BY 'GLANCE_DBPASS'; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \ IDENTIFIED BY 'GLANCE_DBPASS'; (2)
1 Contraseña del usuario Glance 2 Contraseña del usuario Glance -
Realizar la configuración de Glance (usuario
glance
, añadir el usuarioglance
al proyectoservice
con el roladmin
y crear el servicioglance
)# source openrc-admin (1) # openstack user create --domain default glance --password {{ glance_dbpass }} (1) # openstack role add --project service --user glance admin # openstack service create --name glance --description "OpenStack Image" image
1 Cargar las credenciales de admin
2 Contraseña del usuario glance
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} image public http://{{ nodes_by_name.controller.provider_ip }}:9292 (1) # openstack endpoint create --region {{region}} image internal http://{{ nodes_by_name.controller.tunnel_ip }}:9292 (2) # openstack endpoint create --region {{region}} image admin http://{{ nodes_by_name.controller.management_ip }}:9292 (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Glance
# apt install glance
-
Configurar el archivo
/etc/glance/glance-api.conf
-
Modificar el archivo
/etc/glance/glance-registry.conf
-
Poblar la base de datos
glance
.# su -s /bin/sh -c "glance-manage db_sync" glance
-
Reiniciar los servicios de Glance
# service glance-registry restart # service glance-api restart
-
Verificar funcionaminento
# wget http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img (1) # openstack image create "cirros" \ --file cirros-0.3.5-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public (2)
1 Descargar imagen de prueba de CirrOS 2 Subir imagen a OpenStack
6. Instalación de Nova
6.1. Instalación de Nova en el nodo de control
Realizar estar operaciones en el nodo de control
-
Creación y configuración de la base de datos
nova
MariaDB [(none)]> CREATE DATABASE nova_api; MariaDB [(none)]> CREATE DATABASE nova; MariaDB [(none)]> CREATE DATABASE nova_cell0; MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \ IDENTIFIED BY 'NOVA_DBPASS'; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \ IDENTIFIED BY 'NOVA_DBPASS'; (2) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \ IDENTIFIED BY 'NOVA_DBPASS'; (3) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \ IDENTIFIED BY 'NOVA_DBPASS'; (4) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \ IDENTIFIED BY 'NOVA_DBPASS'; (5) MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \ IDENTIFIED BY 'NOVA_DBPASS'; (6)
1 Contraseña del usuario Nova 2 Contraseña del usuario Nova 3 Contraseña del usuario Nova 4 Contraseña del usuario Nova 5 Contraseña del usuario Nova 6 Contraseña del usuario Nova -
Realizar la configuración de Nova (usuario
nova
, añadir el usuarionova
al proyectoservice
con el roladmin
y crear el servicionova
)# source openrc-admin (1) # openstack user create --domain default nova --password {{ nova_dbpass }} (2) # openstack role add --project service --user nova admin # openstack service create --name nova --description "OpenStack Compute" compute
1 Cargar las credenciales de admin
2 Contraseña del usuario nova
-
Crear los endpoints de la API
# openstack endpoint create --region {{ region }} compute public http://{{ nodes_by_name.controller.provider_ip }}:8774/v2.1 (1) # openstack endpoint create --region {{ region }} compute internal http://{{ nodes_by_name.controller.tunnel_ip }}:8774/v2.1 (2) # openstack endpoint create --region {{ region }} compute admin http://{{ nodes_by_name.controller.management_ip }}:8774/v2.1 (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Realizar la configuración del servicio Placement (usuario
nova
, añadir el usuarionova
al proyectoservice
con el roladmin
y crear el servicionova
)# source openrc-admin (1) # openstack user create --domain default placement --password {{ placement_pass }} (2) # openstack role add --project service --user placement admin # openstack service create --name placement --description "Placement API" placement
1 Cargar las credenciales de admin
2 Contraseña del usuario placement
-
Crear los endpoints de la API
# openstack endpoint create --region {{ region }} placement public http://{{ nodes_by_name.controller.provider_ip }}:8778 (1) # openstack endpoint create --region {{ region }} placement internal http://{{ nodes_by_name.controller.tunnel_ip }}:8778 (2) # openstack endpoint create --region {{ region }} placement admin http://{{ nodes_by_name.controller.management_ip }}:8778 (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Nova
# apt install nova-api nova-conductor nova-consoleauth \ nova-novncproxy nova-scheduler nova-placement-api
-
Configurar el archivo
/etc/nova/nova.conf
-
Crear las bases de datos y las celdas
cell0
ycell1
# su -s /bin/sh -c "nova-manage api_db sync" nova # su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova # su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova 109e1d4b-536a-40d0-83c6-5f121b82b650 # su -s /bin/sh -c "nova-manage db sync" nova
-
Reiniciar los servicios
# service nova-api restart # service nova-consoleauth restart # service nova-scheduler restart # service nova-conductor restart # service nova-novncproxy restart
-
Verificar creación de celdas
# nova-manage cell_v2 list_cells
6.2. Instalación de Nova en los nodos de cómputo
Realizar estar operaciones en cada uno de los nodos de cómputo
-
Instalar los paquetes de Nova
# apt install nova-compute
-
Configurar el archivo
/etc/nova/nova.conf
-
Reiniciar servicios de nova
# service nova-compute restart
6.3. Configuración de Nova en el nodo de control
Realizar estar operaciones en el nodo de control
-
Crear los sabores
# source openrc-admin (1) # openstack flavor create --vcpus 1 --ram 512 --disk 1 tiny # openstack flavor create --vcpus 1 --ram 2048 --disk 20 small # openstack flavor create --vcpus 2 --ram 4096 --disk 40 medium # openstack flavor create --vcpus 4 --ram 8192 --disk 80 large # openstack flavor create --vcpus 8 --ram 16384 --disk 160 xlarge
1 Cargar las credenciales de admin
-
Descubrir los servidores de cómputo
# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
7. Neutron
7.1. Instalación de Neutron en el nodo de control
Realizar estar operaciones en el nodo de control
-
Creación y configuración de la base de datos
neutron
MariaDB [(none)]> CREATE DATABASE neutron; MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \ IDENTIFIED BY 'NEUTRON_DBPASS'; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \ IDENTIFIED BY 'NEUTRON_DBPASS'; (2) Exit
1 Contraseña del usuario Neutron 2 Contraseña del usuario Neutron -
Realizar la configuración de Neutron (usuario
neutron
, añadir el usuarioneutron
al proyectoservice
con el roladmin
y crear el servicioneutron
)# source openrc-admin (1) # openstack user create --domain default neutron --password {{ neutron_dbpass }} (2) # openstack role add --project service --user neutron admin # openstack service create --name neutron --description "OpenStack Networking" network
1 Cargar las credenciales de admin
2 Contraseña del usuario nova
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} neutron public http://{{ nodes_by_name.controller.provider_ip }}:9696 (1) # openstack endpoint create --region {{region}} neutron internal http://{{ nodes_by_name.controller.tunnel_ip }}:9696 (2) # openstack endpoint create --region {{region}} neutron admin http://{{ nodes_by_name.controller.management_ip }}:9696 (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Neutron
# apt install neutron-server neutron-plugin-ml2
-
Configurar el archivo
/etc/neutron/neutron.conf
Este tutorial deja preparado el archivo
/etc/neutron/neutron.conf
para la instalación posterior del componente Neutron Load Balancer as a Service (LBaaS). En caso de no instalar tal componente habrá que eliminar la carga de LBaaS en la líneaservice_plugins
del archivo/etc/neutron/neutron.conf
. De no eliminar la referencia a LBaaS en/etc/neutron/neutron.conf
el componente Neutron no funcionará correctamente. -
Modificar el archivo
/etc/neutron/plugins/ml2/ml2_conf.ini
-
Poblar la base de datos de Neutron
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
-
Reiniciar Neutron
# service neutron-server restart
7.2. Instalación de Neutron en el nodo de red
Realizar estos pasos en el nodo de red
En este tutorial seguimos el escenario de provider networks con OpenvSwich. |
-
Configurar el kernel para desactivar el reverse path filtering. Añadir estas líneas el archivo
/etc/sysctl.conf
net.ipv4.ip_forward=1 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0
-
Cargar la nueva configuración del kernel
# sysctl -p
-
Instalar Neutron
# apt install neutron-openvswitch-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent
-
Configurar el archivo
/etc/neutron/neutron.conf
Este tutorial deja preparado el archivo
/etc/neutron/neutron.conf
para la instalación posterior del componente Neutron Load Balancer as a Service (LBaaS). En caso de no instalar tal componente habrá que eliminar la carga de LBaaS en la líneaservice_plugins
del archivo/etc/neutron/neutron.conf
. De no eliminar la referencia a LBaaS en/etc/neutron/neutron.conf
el componente Neutron no funcionará correctamente. -
Modificar el archivo
/etc/neutron/l3_agent.ini
-
Modificar el archivo
/etc/neutron/dhcp_agent.ini
-
Modificar el archivo
/etc/neutron/dnsmasq-neutron.conf
-
Modificar el archivo
/etc/neutron/metadata_agent.ini
-
Modificar el archivo
/etc/neutron/plugins/ml2/openvswitch_agent.ini
-
Reiniciar el servicio
openvswitch-switch
# service openvswitch-switch restart
-
Añadir el bridge externo
# ovs-vsctl add-br br-ex
-
Añadir puerto al bridge externo
# ovs-vsctl add-port br-ex {{ provider_interface }} (1)
1 Nombre de la interfaz de red externa en el nodo de red -
Añadir el bridge interno
# ovs-vsctl add-br br-int
-
Crear el siguiente script en
/root/br-ex_setup.sh
para configurar la interfaz externa en el nodo de red. Ejecutar el script. -
Configurar el archivo
/etc/network/interfaces
para añadir el bridge externo -
Reiniciar los servicios de Neutron
# service neutron-openvswitch-agent restart # service neutron-dhcp-agent restart # service neutron-metadata-agent restart # service neutron-l3-agent restart
7.3. Instalación de Neutron en los nodos de cómputo
Realizar estos pasos en cada uno de los nodos de cómputo
-
Configurar el kernel para desactivar el reverse path filtering. Añadir estas líneas el archivo
/etc/sysctl.conf
net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0
-
Cargar la nueva configuración del kernel
# sysctl -p
-
Instalar Neutron
# apt install neutron-openvswitch-agent
-
Configurar el archivo
/etc/neutron/neutron.conf
Este tutorial deja preparado el archivo
/etc/neutron/neutron.conf
para la instalación posterior del componente Neutron Load Balancer as a Service (LBaaS). En caso de no instalar tal componente habrá que eliminar la carga de LBaaS en la líneaservice_plugins
del archivo/etc/neutron/neutron.conf
. De no eliminar la referencia a LBaaS en/etc/neutron/neutron.conf
el componente Neutron no funcionará correctamente. -
Configurar el archivo
/etc/neutron/plugins/ml2/openvswitch_agent.ini
-
Reiniciar el agente OpenvSwitch
# service neutron-openvswitch-agent restart
7.4. Configuración de la red
Realizar estas operaciones en el nodo de control.
-
Crear la red externa
# openstack network create --share --external --provider-physical-network provider --provider-network-type flat {{network_name}} (1)
1 Nombre de la red externa -
Crear la subred de la red externa
# openstack subnet create --network {{network_name}} \ (1)
--allocation-pool start={{allocation_pool_start}},end={{allocation_pool_end}} \ (2)
--dns-nameserver {{dns_name_servers}} \ (3)
--gateway {{provider_gateway}} \ (4)
--subnet-range {{subnet_range}} \ (5)
{{subnet_name}} (6)
1 | Nombre de la red externa |
2 | Direcciones IP inicial y final del pool de direcciones asignadas |
3 | IP de servidores DNS |
4 | Gateway de la red externa |
5 | Nombre de la subred |
8. Horizon
Realizar estos pasos en el nodo de control.
-
Instalar Neutron
# apt install openstack-dashboard
-
Configurar el archivo
/etc/openstack-dashboard/local_settings.py
-
Reiniciar Apache y Memcached
# service apache2 reload # service apache2 restart # service memcached restart
9. Neutron LBaaS
9.1. Instalación de Neutron LBaaS en el nodo de control
Realizar estos pasos en el nodo de control.
-
Instalar
python-neutron-lbaas
# apt install python-neutron-lbaas
-
Configurar el archivo
/etc/neutron/neutron_lbaas.conf
-
Realizar la migración de la base de datos
neutron-lbaas
# su -s /bin/sh -c "neutron-db-manage --subproject neutron-lbaas upgrade head"
-
Reiniciar Neutron
neutron-server
# service neutron-server restart
-
Clonar el repositorio de
neutron-lbaas
# git clone https://git.openstack.org/openstack/neutron-lbaas-dashboard /tmp/neutron-lbaas-dashboard
Neutron LBaaS no tiene empaquetada la integración con Horizon. En estos casos descargaremos los fuentes del dashboard, los procesaremos y los integraremos en Horizon.
-
Instalar el dashboard de Neutron LBaaS desde
/tmp/neutron-lbaas-dashboard/
# cd /tmp/neutron-lbaas-dashboard/ # python setup.py install
-
Copiar los archivos del dashboard de Neutron LBaaS
# cp /tmp/neutron-lbaas-dashboard/neutron_lbaas_dashboard/enabled/_1481_project_ng_loadbalancersv2_panel.py /usr/share/openstack-dashboard/openstack_dashboard/enabled/
-
Instalar el módulo
pexpect
conpip
pip install pexpect
-
Realizar estos últimos pasos para terminar de integrar el dashboard en Horizon
# cd /usr/share/openstack-dashboard # python manage.py collectstatic (1) # python manage.py compress
1 Responder yes
a la pregunta -
Reiniciar el servidor Apache
# service apache2 restart
9.2. Instalación de Neutron LBaaS en el nodo de red
Realizar estos pasos en el nodo de red.
-
Instalar
neutron-lbaasv2-agent
# apt install neutron-lbaasv2-agent
-
Configurar el archivo
/etc/neutron/lbaas_agent.ini
-
Configurar el archivo
/etc/neutron/neutron_lbaas.conf
-
Reiniciar el servicio neutron-lbaasv2-agent
# service neutron-lbaasv2-agent restart
10. Cinder
Realizar estar operaciones en el nodo de control.
La instalación de Cinder descrita en este tutorial hace uso de un NAS como dispositivo de almacenamiento de volúmenes. Cinder mantiene una serie de dispositivos compatibles y que disponen de drivers para poder funcionar como nodo de almacenamiento. Esto permite contar con un nodo de almacenamiento a un coste menor que un servidor dedicado. Los paquetes y archivos de configuración quedan instalados en el nodo de control. |
-
Creación y configuración de la base de datos
cinder
MariaDB [(none)]> CREATE DATABASE cinder; MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ IDENTIFIED BY 'CINDER_DBPASS'; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \ IDENTIFIED BY 'CINDER_DBPASS'; (2)
1 Contraseña del usuario Cinder 2 Contraseña del usuario Cinder -
Realizar la configuración de Cinder (usuario
cinder
, añadir el usuariocinder
al proyectoservice
con el roladmin
y crear los servicioscinder
,cinderv2
ycinderv3
).# source openrc-admin (1) # openstack user create --domain default cinder --password {{ cinder_dbpass }} (2) # openstack role add --project service --user cinder admin # openstack service create --name cinder --description "OpenStack Block Storage" volume # openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2 # openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
1 Credenciales del usuario cinder
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} cinder public http://{{ nodes_by_name.controller.provider_ip }}:8776/v1/%(project_id)s (1) # openstack endpoint create --region {{region}} cinder internal http://{{ nodes_by_name.controller.tunnel_ip }}:8776/v1/%(project_id)s (2) # openstack endpoint create --region {{region}} cinder admin http://{{ nodes_by_name.controller.management_ip }}:8776/v1/%(project_id)s (3) # openstack endpoint create --region {{region}} cinderv2 public http://{{ nodes_by_name.controller.provider_ip }}:8776/v2/%(project_id)s (4) # openstack endpoint create --region {{region}} cinderv2 internal http://{{ nodes_by_name.controller.tunnel_ip }}:8776/v2/%(project_id)s (5) # openstack endpoint create --region {{region}} cinderv3 admin http://{{ nodes_by_name.controller.management_ip }}:8776/v2/%(project_id)s (6) # openstack endpoint create --region {{region}} cinderv3 public http://{{ nodes_by_name.controller.provider_ip }}:8776/v3/%(project_id)s (7) # openstack endpoint create --region {{region}} cinderv3 internal http://{{ nodes_by_name.controller.tunnel_ip }}:8776/v3/%(project_id)s (8) # openstack endpoint create --region {{region}} cinderv3 admin http://{{ nodes_by_name.controller.management_ip }}:8776/v3/%(project_id)s (9)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control4 Región (p.e, RegionOne
) e IP externa del nodo de control5 Región (p.e, RegionOne
) e IP de túnel del nodo de control6 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control7 Región (p.e, RegionOne
) e IP externa del nodo de control8 Región (p.e, RegionOne
) e IP de túnel del nodo de control9 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Cinder
# apt install cinder-api cinder-scheduler
-
Configurar el archivo
/etc/cinder/cinder.conf
-
Inicializar la base de datos
cinder
# su -s /bin/sh -c "cinder-manage db sync" cinder
-
Reiniciar los servicios
cinder-scheduler
y Apache# service cinder-scheduler restart # service apache2 restart
-
Instalar LVM y
cinder-volume
# apt install lvm2 # apt install cinder-volume
-
Reiniciar los servicios
tgt
ycinder-volume
# service tgt restart # service cinder-volume restart
-
Crear el tipo de volumen para el NAS
# openstack volume type create --public {{ nas_volume_type_name }} (1) # openstack volume type set --property volume_backend_name={{ nas_backend_name }} {{ nas_volume_type_name }} (2)
1 Tipo de volumen (p.e. NAS
)2 Nombre asignado al tipo de volumen (p.e. VOL_NAS
)
11. Heat
La instalación de Heat se realiza en el nodo de control.
-
Creación y configuración de la base de datos
heat
CREATE DATABASE heat; GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' \ IDENTIFIED BY 'HEAT_DBPASS'; (1) GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' \ IDENTIFIED BY 'HEAT_DBPASS'; (2)
1 Contraseña del usuario Heat 2 Contraseña del usuario Heat -
Realizar la configuración de Heat (usuario
heat
, añadir el usuarioheat
al proyectoservice
con el roladmin
y crear los serviciosheat
yheat-cfn
)# source openrc-admin (1) # openstack user create --domain default heat --password {{ heat_dbpass }} (2) # openstack role add --project service --user heat admin # openstack service create --name heat --description "Orchestration" orchestration # openstack service create --name heat-cfn --description "Orchestration" cloudformation
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} orchestration public http://{{ nodes_by_name.controller.provider_ip }}:8004/v1/%(tenant_id)s (1) # openstack endpoint create --region {{region}} orchestration internal http://{{ nodes_by_name.controller.tunnel_ip }}:8004/v1/%(tenant_id)s (2) # openstack endpoint create --region {{region}} orchestration admin http://{{ nodes_by_name.controller.management_ip }}:8004/v1/%(tenant_id)s (3) # openstack endpoint create --region {{region}} cloudformation public http://{{ nodes_by_name.controller.provider_ip }}:8000/v1 (4) # openstack endpoint create --region {{region}} cloudformation internal http://{{ nodes_by_name.controller.tunnel_ip }}:8000/v1 (5) # openstack endpoint create --region {{region}} cloudformation admin http://{{ nodes_by_name.controller.management_ip }}:8000/v1 (6)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control4 Región (p.e, RegionOne
) e IP externa del nodo de control5 Región (p.e, RegionOne
) e IP de túnel del nodo de control6 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Crear roles, dominio y usuario en el dominio necesarios para Heat
# openstack domain create --description "Stack projects and users" heat # openstack user create --domain heat --password {{heat_dbpass}} heat_domain_admin # openstack role add --domain heat --user-domain heat --user heat_domain_admin admin # openstack role create heat_stack_owner # openstack role add --project demo --user demo heat_stack_owner # openstack role create heat_stack_user
-
Instalar los paquetes de Heat
# apt install heat-api heat-api-cfn heat-engine
-
Configurar el archivo
/etc/heat/heat.conf
-
Inicializar la base de datos
heat
su -s /bin/sh -c "heat-manage db_sync" heat
-
Reiniciar servicios de Heat
# service heat-api restart # service heat-api-cfn restart # service heat-engine restart
12. Manila
12.1. Instalación de Manila en el nodo de control
Realizar estos pasos en el nodo de control
-
Creación y configuración de la base de datos
manila
CREATE DATABASE manila; GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' \ IDENTIFIED BY 'MANILA_DBPASS'; (1) GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' \ IDENTIFIED BY 'MANILA_DBPASS'; (2)
1 Contraseña de Manila 2 Contraseña de Manila -
Realizar la configuración de Manila (usuario
manila
, añadir el usuariomanila
al proyectoservice
con el roladmin
y crear los serviciosmanila
ymanilav2
).# source openrc-admin (1) # openstack user create --domain default manila --password {{ manila_dbpass }} # openstack role add --project service --user manila admin # openstack service create --name manila --description "OpenStack Shared File Systems" share # openstack service create --name manilav2 --description "OpenStack Shared File Systems" sharev2
1 Credenciales del usuario manila
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} share public http://{{ nodes_by_name.controller.provider_ip }}:8786/v1/%\(tenant_id\)s (1) # openstack endpoint create --region {{region}} share internal http://{{ nodes_by_name.controller.tunnel_ip }}:8786/v1/%\(tenant_id\)s (2) # openstack endpoint create --region {{region}} share admin http://{{ nodes_by_name.controller.management_ip }}:8786/v1/%\(tenant_id\)s (3) # openstack endpoint create --region {{region}} sharev2 public http://{{ nodes_by_name.controller.provider_ip }}:8786/v2/%\(tenant_id\)s (4) # openstack endpoint create --region {{region}} sharev2 internal http://{{ nodes_by_name.controller.tunnel_ip }}:8786/v2/%\(tenant_id\)s (5) # command: openstack endpoint create --region {{region}} sharev2 admin http://{{ nodes_by_name.controller.management_ip }}:8786/v2/%\(tenant_id\)s (6)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control4 Región (p.e, RegionOne
) e IP externa del nodo de control5 Región (p.e, RegionOne
) e IP de túnel del nodo de control6 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Cinder
# apt install manila-api manila-scheduler python-manilaclient
-
Configurar el archivo
/etc/manila/manila.conf
-
Inicializar la base de datos
manila
# su -s /bin/sh -c "manila-manage db sync" manila
-
Reiniciar servicios de Manila
# service manila-scheduler restart # service manila-api restart
-
Eliminar la base de datos
manila.sqlite
# rm -f /var/lib/manila/manila.sqlite
-
Clonar el repositorio de
manila-ui
# git clone https://github.com/openstack/manila-ui /tmp/manila-ui
Manila no tiene empaquetada la integración con Horizon. En estos casos descargaremos los fuentes del dashboard, los procesaremos y los integraremos en Horizon.
-
Instalar el dashboard de Manila desde
/tmp/manila-ui/
# cd /tmp/manila-ui/ # python setup.py install
-
Copiar los archivos del dashboard de Manila
# cp /tmp/manila-ui/manila_ui/local/enabled/_90_manila* /usr/share/openstack-dashboard/openstack_dashboard/local/enabled/
-
Realizar estos últimos pasos para terminar de integrar el dashboard en Horizon
# cd /usr/share/openstack-dashboard # python manage.py collectstatic (1) # python manage.py compress
1 Responder yes
a la pregunta -
Reiniciar el servidor Apache
# service apache2 restart
12.2. Instalación de Manila en el nodo de almacenamiento compartido
Realizar estos pasos en el nodo de almacenamiento compartido
-
Instalar Manila en el nodo de almacenamiento compartido
# apt install manila-share python-pymysql lvm2 nfs-kernel-server
-
Configurar el archivo
/etc/manila/manila.conf
-
Crear el volumen físico LVM
# pvcreate /dev/{{ shared_storage_device }} (1)
1 Volumen del nodo de almacenamiento compartido dedicado a Manila -
Crear el grupo de volúmenes
manila-volumes
# vgcreate manila-volumes /dev/{{ shared_storage_device }} (1)
1 Volumen del nodo de almacenamiento compartido dedicado a Manila -
Configurar el archivo
/etc/lvm/lvm.conf
añadiendo la línea siguiente al bloquedevices
para especificar los dispositivos utilizados por LVMfilter = [ "a/{{ shared_storage_device }}/", "r/.*/"] (1)
1 Volumen del nodo de almacenamiento compartido dedicado a Manila -
Reiniciar el servicio
manila-share
# service manila-share restart
-
Activar el servicio
nfs-server
# systemctl enable nfs-server
-
Eliminar la base de dato manila.sqlite ` en el nodo de almacenamiento compartido.
# rm -f /var/lib/manila/manila.sqlite
13. Swift
13.1. Instalación de Swift en el nodo de control
Realizar estas operaciones en el nodo de control.
-
Realizar la configuración de Cinder (usuario
cinder
, añadir el usuariocinder
al proyectoservice
con el roladmin
y crear los servicioscinder
,cinderv2
ycinderv3
).# source openrc-admin (1) # openstack user create --domain default swift --password {{ swift_dbpass }} (2) # openstack role add --project service --user swift admin # openstack service create --name swift --description "OpenStack Object Storage" object-store
1 Cargar las credenciales de admin
2 Contraseña del usuario swift
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} object-store public http://{{ nodes_by_name.controller.provider_ip }}:8080/v1/AUTH_%\(tenant_id\)s (1) # openstack endpoint create --region {{region}} object-store internal http://{{ nodes_by_name.controller.tunnel_ip }}:8080/v1/AUTH_%\(tenant_id\)s (2) # openstack endpoint create --region {{region}} object-store admin http://{{ nodes_by_name.controller.management_ip }}:8080/v1/AUTH_%\(tenant_id\)s (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Swift
# apt install swift swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware
-
Configurar el archivo
/etc/swift/proxy-server.conf
-
Cambiar el propietario del directorio
/etc/swift
# chown -R root:swift /etc/swift
13.2. Instalar Swift en nodos de almacenamiento de objetos
Realizar estas operaciones en los nodos de almacenamiento de objetos.
-
Instalar los paquetes de soporte
# apt install xfsprogs rsync
-
Crear particiones
# fdisk /dev/sdb # fdisk /dev/sdc
En este tutorial suponemos que cada uno de los servidores dedicados a almacenamiento de objetos cuentan con 2 discos (
sdb
ysdc
). -
Formatear discos en formato
xfs
# mkfs.xfs /dev/sdb1 # mkfs.xfs /dev/sdc1
-
Crear los puntos de montaje
# mkdir -p /srv/node/sdb # mkdir -p /srv/node/sdc
-
Montar los discos
# mount /dev/sdb1 /srv/node/sdb # mount /dev/sdc1 /srv/node/sdc
-
Configurar el archivo
/etc/rsyncd.conf
-
Activar
rsync
en/etc/default/rsync
RSYNC_ENABLE=true (1)
1 Establecer este valor -
Iniciar
rsync
# service rsync start
-
Instalar los paquetes de Swift en los nodos de almacenamiento de objetos
# apt install swift swift-account swift-container swift-object
-
Configurar el archivo
/etc/swift/account-server.conf
-
Configurar el archivo
/etc/swift/container-server.conf
-
Configurar el archivo
/etc/swift/object-server.conf
-
Crear el directorio
/srv/node
si no existe y cambiarlo de propietario# mkdir -p /srv/node # chown -R swift:swift /srv/node
-
Crear el directorio
/var/cache/swift
si no existe y cambiarlo de propietario# mkdir -p /var/cache/swift # chown -R root:swift /var/cache/swift
13.3. Crear y distribuir los anillos iniciales
Realizar estas operaciones en el nodo de control.
-
Crear el archivo base
account.builder
# swift-ring-builder account.builder create 10 3 1
-
Añadir cada nodo de almacenamiento al anillo. Añade el anillo para la combinación de los dos nodos de almacenamiento de objetos (
objetos01
yobjetos02
) con los dos dispositivos (sdb
ysdc
).# swift-ring-builder account.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ (1) --port 6202 --device {{ sdb }} \ (2) --weight 100} (3) # swift-ring-builder account.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100} # swift-ring-builder account.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdb }} \ --weight 100} # swift-ring-builder account.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100}
1 IP de mantenimiento del primer nodo de almacenamiento de objetos 2 Primer dispositivo 3 El peso lo inicializamos a 100 -
Rebalancear el anillo
# swift-ring-builder account.builder rebalance
-
Crear el archivo base
container.builder
. Añade el anillo para la combinación de los dos nodos de almacenamiento de objetos (objetos01
yobjetos02
) con los dos dispositivos (sdb
ysdc
).swift-ring-builder container.builder create 10 3 1
-
Añadir cada nodo de almacenamiento al anillo
# swift-ring-builder container.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ (1) --port 6202 --device {{ sdb }} \ (2) --weight 100} (3) # swift-ring-builder container.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100} # swift-ring-builder container.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdb }} \ --weight 100} # swift-ring-builder container.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100}
1 IP de mantenimiento del primer nodo de almacenamiento de objetos 2 Primer dispositivo 3 El peso lo inicializamos a 100 -
Rebalancear el anillo
# swift-ring-builder container.builder rebalance
-
Crear el archivo base
object.builder
# swift-ring-builder object.builder create 10 3 1
-
Añadir cada nodo de almacenamiento al anillo
# swift-ring-builder object.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ (1) --port 6202 --device {{ sdb }} \ (2) --weight 100} (3) # swift-ring-builder object.builder add --region 1 --zone 1 --ip {{ objetos01.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100} # swift-ring-builder object.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdb }} \ --weight 100} # swift-ring-builder object.builder add --region 1 --zone 1 --ip {{ objetos02.management_ip}} \ --port 6202 --device {{ sdc }} \ --weight 100}
1 IP de mantenimiento del primer nodo de almacenamiento de objetos 2 Primer dispositivo 3 El peso lo inicializamos a 100 -
Rebalancear el anillo
# swift-ring-builder object.builder rebalance
-
Distribuir los archivos de configuración del anillo a los nodos de almacenamiento de objetos
# scp /etc/swift/*.ring.gz {{ objetos01.management_ip }}:/etc/swift (1) # scp /etc/swift/*.ring.gz {{ objetos02.management_ip }}:/etc/swift (2)
1 IP de mantenimento del nodo 1 de almacenamiento de objetos 2 IP de mantenimento del nodo 2 de almacenamiento de objetos
14. Sahara
Realizar todos estos pasos en el nodo de control.
-
Creación y configuración de la base de datos
sahara
MariaDB [(none)]> CREATE DATABASE sahara; MariaDB [(none)]> GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'localhost' \ IDENTIFIED BY 'SAHARA_DBPASS'; (1) MariaDB [(none)]> GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'%' \ IDENTIFIED BY 'SAHARA_DBPASS'; (2)
1 Contraseña del usuario Sahara 2 Contraseña del usuario Sahara -
Realizar la configuración de Sahara (usuario
sahara
, añadir el usuariosahara
al proyectoservice
con el roladmin
y crear el serviciosahara
)# source openrc-admin (1) # openstack user create --domain default sahara --password {{ sahara_dbpass }} (2) # openstack role add --project service --user sahara admin # openstack service create --name sahara --description "OpenStack Data Processing" data-processing
1 Cargar las credenciales de admin
2 Contraseña del usuario sahara
-
Crear los endpoints de la API
# openstack endpoint create --region {{region}} data-processing public http://{{ nodes_by_name.controller.provider_ip }}:8386/v1.1/%\(project_id\)s (1) # openstack endpoint create --region {{region}} data-processing internal http://{{ nodes_by_name.controller.tunnel_ip }}:8386/v1.1/%\(project_id\)s (2) # openstack endpoint create --region {{region}} data-processing admin http://{{ nodes_by_name.controller.management_ip }}:8386/v1.1/%\(project_id\)s (3)
1 Región (p.e, RegionOne
) e IP externa del nodo de control2 Región (p.e, RegionOne
) e IP de túnel del nodo de control3 Región (p.e, RegionOne
) e IP de mantenimiento del nodo de control -
Instalar los paquetes de Glance
# apt install sahara python-saharaclient
-
Configurar el archivo
/etc/sahara/sahara.conf
-
Añadir lo siguiente a
/etc/mysql/my.cnf
[mysqld] max_allowed_packet = 256M
-
Reiniciar MySQL
# service mysql restart
-
Inicializar la base de datos
sahara
# su -s /bin/sh -c "sahara-db-manage --config-file /etc/sahara/sahara.conf upgrade head" sahara
-
Modificar el archivo
/usr/lib/python2.7/dist-packages/sahara/service/quotas.py
-
Reiniciar los servicios de Sahara
# service sahara-api restart # service sahara-engine restart
-
Clonar el repositorio de
sahara-dashboard
# git clone https://github.com/openstack/sahara-dashboard /tmp/sahara-dashboard
Sahara no tiene empaquetada la integración con Horizon. En estos casos descargaremos los fuentes del dashboard, los procesaremos y los integraremos en Horizon.
-
Instalar el dashboard de Sahara desde
/tmp/sahara-dashboard/
# cd /tmp/sahara-dashboard/ # python setup.py install
-
Copiar los archivos del dashboard de Sahara
# cp /tmp/sahara-dashboard/sahara_dashboard/enabled/_1810_data_processing_panel_group.py /usr/share/openstack-dashboard/openstack_dashboard/enabled/ # cp /tmp/sahara-dashboard/sahara_dashboard/enabled/_1830_data_processing_plugins_panel.py /usr/share/openstack-dashboard/openstack_dashboard/enabled/ # cp /tmp/sahara-dashboard/sahara_dashboard/enabled/_1820_data_processing_clusters_panel.py /usr/share/openstack-dashboard/openstack_dashboard/enabled/ # cp /tmp/sahara-dashboard/sahara_dashboard/enabled/_1840_data_processing_jobs_panel.py /usr/share/openstack-dashboard/openstack_dashboard/enabled/
-
Realizar estos últimos pasos para terminar de integrar el dashboard en Horizon
# cd /usr/share/openstack-dashboard # python manage.py collectstatic (1) # python manage.py compress
1 Responder yes
a la pregunta -
Reiniciar el servidor Apache
# service apache2 restart
Anexo 2. Paquetes y archivos de configuración
La instalación de OpenStack es un proceso farragoso en cuanto a la cantidad de paquetes y archivos de configuración que hay que instalar y configuirar en cada tipo de nodo. A continuación se muestran dos figuras que ilustran los paquetes a instalar y los archivos a configurar en cada nodo.
Anexo 3. Servicios en ejecución en cada servidor
Servicios en el nodo de control
-
chrony
-
mysql
-
rabbitmq
-
memcached
-
apache2
-
glance-api
: Discovery, recuperación y almacenamiento de imágenes. -
glance-registry
: Creación, modificación y consulta de metadatos de las imágenes (p.e. tamaño, tipo) -
nova-api
-
nova-placement-api
: Inventario y uso de cada provider. -
nova-scheduler
: Gestiona peticiones de máquinas virtuales a los nodos de cómputo. -
nova-consoleauth
: Da tokens de acceso a los usuarios -
nova-novncproxy
: Acceso VNC a las instancias (clientes VNC basados en navegadores compatibles). -
neutron-server
: Acepta y emite peticiones a la API del plugin correspondiente (bridging/switching, DHCP, …) -
ml2-agent
: Bridging/switching -
cinder-api
-
cinder-scheduler
: Gestiona peticiones de almacenamiento de bloques. -
manila-api
-
manila-scheduler
: Gestiona peticiones de almacenamiento de archivos -
swift-proxy
-
heat-api
-
heat-engine
-
heat-api-ctn
-
barbican-keystone-listener
-
barbican-worker
-
sabana-api
-
sabana-engine
Servicios en el nodo de red
-
chrony
-
openvswitch-agent
: Bridging/switching para redes virtuales. -
dhcp-agent
: Servicios de DHCP para redes virrtuales. -
`metadata-agent`Servicios de metadatos a las instancias.
-
l3-agent
Servicios en nodos de cómputo
-
chrony
-
nova-compute
: Crea y termina máquinas virtuales a través de la API del hipervisor -
openvswitch-agent
: Bridging/switching para redes virtuales.
Servicios en el nodo de almacenamiento de bloques
-
chrony
-
cinder-volume
-
lvm2
-
tgt
Servicios en el nodo de almacenamiento de archivos compartidos
-
chrony
-
manila-share
-
lvm2
Servicios en el nodo de almacenamiento de objetos
-
chrony
-
swift-account
-
swift-account-auditor
-
swift-account-reaper
-
swift-account-replicator
-
swift-container
-
swift-container-auditor
-
swift-container-replicator
-
swift-container-sync
-
swift-container-updater
-
swift-object
-
swift-object-auditor
-
swift-object-reconstructor
-
swift-object-replicator
-
swift-object-updater
Anexo 4. Tablas no vacías de las bases de datos de OpenStack
+--------------------+----------------------------------------------------+
| table_schema | table_name |
+--------------------+----------------------------------------------------+
| barbican | alembic_version |
| barbican | certificate_authorities |
| barbican | certificate_authority_metadata |
| barbican | container_secret |
| barbican | containers |
| barbican | encrypted_data |
| barbican | secret_store_metadata |
| barbican | secrets |
| cinder | messages |
| cinder | quota_classes |
| cinder | quota_usages |
| cinder | quotas |
| cinder | reservations |
| cinder | services |
| cinder | snapshot_metadata |
| cinder | snapshots |
| cinder | transfers |
| cinder | volume_admin_metadata |
| cinder | volume_attachment |
| cinder | volume_glance_metadata |
| cinder | volume_metadata |
| cinder | volumes |
| cinder | workers |
| glance | alembic_version |
| glance | image_locations |
| glance | image_properties |
| glance | images |
| heat | event |
| heat | raw_template |
| heat | raw_template_files |
| heat | resource |
| heat | resource_data |
| heat | resource_properties_data |
| heat | service |
| heat | software_config |
| heat | stack |
| heat | user_creds |
| keystone | assignment |
| keystone | credential |
| keystone | endpoint |
| keystone | local_user |
| keystone | migrate_version |
| keystone | password |
| keystone | project |
| keystone | revocation_event |
| keystone | role |
| keystone | service |
| keystone | trust |
| keystone | trust_role |
| keystone | user |
| manila | alembic_version |
| manila | quota_usages |
| manila | quotas |
| manila | reservations |
| manila | services |
| manila | share_instance_export_locations |
| manila | share_instance_export_locations_metadata |
| manila | share_instances |
| manila | shares |
| neutron | agents |
| neutron | alembic_version |
| neutron | alembic_version_fwaas |
| neutron | alembic_version_lbaas |
| neutron | default_security_group |
| neutron | dnsnameservers |
| neutron | floatingips |
| neutron | ipallocationpools |
| neutron | ipallocations |
| neutron | ipamallocationpools |
| neutron | ipamallocations |
| neutron | ipamsubnets |
| neutron | lbaas_healthmonitors |
| neutron | lbaas_listeners |
| neutron | lbaas_loadbalancer_statistics |
| neutron | lbaas_loadbalanceragentbindings |
| neutron | lbaas_loadbalancers |
| neutron | lbaas_members |
| neutron | lbaas_pools |
| neutron | ml2_port_binding_levels |
| neutron | ml2_port_bindings |
| neutron | ml2_vxlan_allocations |
| neutron | ml2_vxlan_endpoints |
| neutron | networkdhcpagentbindings |
| neutron | networkrbacs |
| neutron | networks |
| neutron | networksecuritybindings |
| neutron | networksegments |
| neutron | ports |
| neutron | portsecuritybindings |
| neutron | providerresourceassociations |
| neutron | provisioningblocks |
| neutron | quotas |
| neutron | quotausages |
| neutron | router_extra_attributes |
| neutron | routerl3agentbindings |
| neutron | routerports |
| neutron | routers |
| neutron | securitygroupportbindings |
| neutron | securitygrouprules |
| neutron | securitygroups |
| neutron | standardattributes |
| neutron | subnets |
| nova | block_device_mapping |
| nova | compute_nodes |
| nova | instance_actions |
| nova | instance_actions_events |
| nova | instance_extra |
| nova | instance_faults |
| nova | instance_id_mappings |
| nova | instance_info_caches |
| nova | instance_metadata |
| nova | instance_system_metadata |
| nova | instances |
| nova | migrations |
| nova | quota_usages |
| nova | quotas |
| nova | reservations |
| nova | s3_images |
| nova | security_groups |
| nova | services |
| nova | task_log |
| nova | virtual_interfaces |
| nova_api | allocations |
| nova_api | cell_mappings |
| nova_api | flavor_projects |
| nova_api | flavors |
| nova_api | host_mappings |
| nova_api | instance_group_member |
| nova_api | instance_group_policy |
| nova_api | instance_groups |
| nova_api | instance_mappings |
| nova_api | inventories |
| nova_api | key_pairs |
| nova_api | request_specs |
| nova_api | resource_providers |
| nova_cell0 | instance_extra |
| nova_cell0 | instance_faults |
| nova_cell0 | instance_id_mappings |
| nova_cell0 | instance_info_caches |
| nova_cell0 | instance_system_metadata |
| nova_cell0 | instances |
| nova_cell0 | quota_usages |
| nova_cell0 | s3_images |
| nova_cell0 | security_groups |
| sahara | alembic_version |
+--------------------+----------------------------------------------------+
Anexo 5. Consultas SQL de utilidad
-
Ids de proyectos
= SELECT id FROM keystone.project WHERE name IN ('proyecto1', 'proyecto2'); (1)
1 Pasar los nombre de proyecto como parámetro -
Imágenes de cada proyecto
SELECT I.id, I.name, P.name FROM glance.images I JOIN keystone.project P ON I.owner = P.id;
-
Imágenes de proyectos concretos
SELECT I.id, I.name, P.name FROM glance.images I JOIN keystone.project P ON I.owner = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY I.id;
-
Eliminar imágenes de proyectos concretos
SELECT CONCAT ('openstack image delete ', I.id) FROM glance.images I JOIN keystone.project P ON I.owner = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY I.id;
-
Instances de proyectos concretos
SELECT I.uuid, I.hostname, P.name FROM nova.instances I JOIN keystone.project P ON I.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY I.uuid ;
-
Eliminar instancias de proyectos concretos
SELECT CONCAT ('openstack delete server ', I.uuid) FROM nova.instances I JOIN keystone.project P ON I.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY I.uuid ;
-
Attachements de volúmenes de instancias proyectos concretos
SELECT A.instance_uuid, A.id, A.mountpoint, I.hostname FROM cinder.volume_attachment A JOIN nova.instances I ON A.instance_uuid = I.uuid WHERE A.instance_uuid IN ( SELECT I.uuid FROM nova.instances I JOIN keystone.project P ON I.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy')) ) ORDER BY A.instance_uuid, A.id;
-
Dettach los volúmenes de las instancias de proyectos concretos
SELECT CONCAT ('openstack server remove volume ', A.instance_uuid, ' ', A.id) FROM cinder.volume_attachment A JOIN nova.instances I ON A.instance_uuid = I.uuid WHERE A.instance_uuid IN ( SELECT I.uuid FROM nova.instances I JOIN keystone.project P ON I.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy')) ) ORDER BY A.instance_uuid, A.id;
-
Volúmenes de proyetos concretos
SELECT V.id, V.host, V.size, V.display_name FROM cinder.volumes V JOIN keystone.project P ON V.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY V.id;
-
Eliminar volúmenes de proyectos concretos
SELECT CONCAT ('openstack volume delete ', V.id) FROM cinder.volumes V JOIN keystone.project P ON V.project_id = P.id WHERE P.id IN ( SELECT id FROM keystone.project WHERE name IN ('xxxx', 'yyyy') ) ORDER BY V.id;
-
Proyectos concretos
SELECT id, name FROM keystone.project WHERE name IN ('xxxx', 'yyyy');
-
Eliminar proyectos concretos
SELECT CONCAT ('openstack project delete ' , id) FROM keystone.project WHERE name IN ('xxxx', 'yyyy');