Openstack Cheatsheet

  1. Nova.
    1. Cinder.
1. Nova

Recuperar instancia que no reincia o no inicia (ni por horizon, ni por línea de comandos), en task state se queda en alguno de los estatus rebooting-hard,rebooting-soft,powering-on....

[email protected]:~# nova list
+--------------------------------------+------------------------------------------------+---------+-------------+-------------+---------------------------------+
| ID                                   | Name                                           | Status  | Task State  | Power State | Networks                        |
+--------------------------------------+------------------------------------------------+---------+-------------+-------------+---------------------------------+
| 9512a8a5-7ccb-4b4f-9394-f7b031f60a7e | cassandra-9512a8a5-7ccb-4b4f-9394-f7b031f60a7e | SHUTOFF | powering-on | Shutdown    | db_net=192.168.112.5            |
| af1ec64a-d3ce-49b6-924c-fd2c8e62efd5 | cassandra-af1ec64a-d3ce-49b6-924c-fd2c8e62efd5 | SHUTOFF | powering-on | Shutdown    | db_net=192.168.112.4, 10.0.8.75 |
| ba3963cb-0410-4ab0-afbe-ce24f148378b | cassandra-ba3963cb-0410-4ab0-afbe-ce24f148378b | SHUTOFF | powering-on | Shutdown    | db_net=192.168.112.3, 10.0.8.74 |
| 29e62325-f674-427b-8657-900bd2fd25b2 | play                                           | SHUTOFF | powering-on | Shutdown    | db_net=192.168.112.1, 10.0.8.73 |
+--------------------------------------+------------------------------------------------+---------+-------------+-------------+---------------------------------+
  • Al tratar de reiniciarla:
[email protected]:~# nova reboot --hard 29e62325-f674-427b-8657-900bd2fd25b2
ERROR: Cannot 'reboot' while instance is in task_state powering-on (HTTP 409) (Request-ID: req-ab819959-33dd-45c4-851d-5a800e6bb944)
  • Para solucionarlo hay que modificar el task status directamente en la Base de Datos:
[email protected]:~# mysql
mysql> use nova;
update instances set task_state=NULL where uuid = '9512a8a5-7ccb-4b4f-9394-f7b031f60a7e';

Donde el UUID es el ID de la instanacia

  • Modificar status, power state y task
mysql> use nova;
update instances set power_state=4, vm_state='stopped', task_state=NULL where uuid='756b98df-6b38-42f6-9d6a-8cf54a08a5ea';

Se debe de reiniciar la instancia una vez terminado el proceso.

Si una instancia mantiene el estado de ERROR, podemos poner el estado a activo con el siguiente comando:

nova reset-state --active ID_Instancia

Ejemplo:

nova reset-state --active c6bbbf26-b40a-47e7-8d5c-eb17bf65c485
Proceso que hace openstack al hacer un snapshot de una instancia

Image pending upload

Escribe en /var/lib/nova/instances/snapshots/ del nodo donde este la instancia

Image Uploading

Crea Imgaen escribe en /var/lib/ceph/osd/ceph-1

Deshabilitar servicio de cómputo_

nova-manage service disable --host node_name --service service_name

Ejemplo:

nova-manage service disable --host node-25.trx.com.mx --service nova-compute

Mover instancias cuando un nodo de computo falla (Probar en la versión actual de la nube)

  • Primero buscar la instancia a mover (muestra todas las instancias del nodo que está abajo)
 select uuid from instances where host = 'nombre_nodo_down’ and deleted = 0;
  • Actualizar el nodo donde residirá la instancia
 update instances set host = 'nombre_nodo_disponible' where host = 'nombre_nodo_down’ and uuid = 'UUID_instancia_a_migrar' and deleted = 0;

Ejemplo:

mysql> use nova;
mysql> select uuid from instances where host = 'node-19.trx.com.mx' and deleted = 0;
mysql> update instances set host = 'node-27.trx.com.mx' where host = 'node-19.trx.com.mx' and uuid = '8c14e928-ca70-4363-b5f3-40aee90683b0' and deleted = 0;

Agregar instancia en un nodo de computo determinado (solo usuarios administradores)

nova boot --image <uuid> --flavor <flavor_name> --key_name <keypair> --availability-zone nova:compute_node instance_name

Ejemplo:

nova boot --image 14821c23-6253-4cdf-b880-fcc507cb0905  --flavor m1.small --key_name luis_devel_infra  --availability-zone nova:node-9.trx.com.mx luis_test2
  • Error Borrar una instancia

El almacenamiento de Respaldo NFS o algún otro backend pierde comunicación o crashea durante la eliminación de una Instancia. Se han borrado todos los archivos relacionados (disco, configuraciones de la VM) así como el dominio desde el backend del hypervisor (virsh, esc, etc). Sin embargo nova aún muestra la instancia activa (o error). Y si el comando nova reset-state --active no soluciona el problema, el siguiente query puede ser usado para setear la instancia como borrada.

$ mysql nova
update instances set deleted='1', vm_state='deleted', deleted_at='now()'' where uuid=‘ID_Instancia’ and project_id=‘ID_Tenant’;

Ejemplo:

 update instances set deleted='1', vm_state='deleted', deleted_at='now()'' where uuid=‘32423423-f45345-dfg34534-3443’ and project_id=‘7lk43543-324khj23723-32423’;

Normalmente el comando siguiente es la forma correcta de borrar una instancia:

nova delete <ID_Instancia>

Si lo que se quiere es borrar de la Base de datos la instancia en lugar de solo marcarla como borrada los siguientes comandos son útiles:

$ mysql nova_db
delete from instance_faults where instance_faults.instance_uuid = ‘ID_Instance’;
delete from instance_id_mappings where instance_id_mappings.uuid = 'ID_Instance';
delete from instance_info_caches where instance_info_caches.instance_uuid = 'ID_Instance';
delete from instance_system_metadata where instance_system_metadata.instance_uuid = 'ID_Instance';
delete from security_group_instance_association where security_group_instance_association.instance_uuid = 'ID_Instance';
delete from block_device_mapping where block_device_mapping.instance_uuid = 'ID_Instance';
delete from fixed_ips where fixed_ips.instance_uuid = 'ID_Instance';
delete from instance_actions_events where instance_actions_events.action_id in (select id from instance_actions where instance_actions.instance_uuid = 'ID_Instance');
delete from instance_actions where instance_actions.instance_uuid = 'ID_Instance';
delete from virtual_interfaces where virtual_interfaces.instance_uuid = 'ID_Instance';
delete from instances where instances.uuid = 'ID_Instance';

Cambiar el nodo de computo donde corre una instancia

El proceso de migrado o redimencionamiento de una instancia puede fallar. El disco de la instancia puede estar ya migrado o estar aún en el estrague compartido, pero nova esta confundido al respecto.

Debemos asegurarnos que la instancia este sólo en un nodo de computo (preferiblemente en el nodo origen). Ejecutar el siguiente comando para ver el status de la operación de migracion/redimensionamiento.

nova migration-list
  • Queries para cambiar el Hypervisor donde carrera la instancia.
mysql> usenova;
update instances set host='compute-hostname.domain',node='compute-hostname.domain' where uuid=‘ID_Instance’ and project_id=’ID_Tenant’;

Normalmente los comandos para migrar y redimensiones instancias son los siguientes respectivamente

nova migrate <ID_Instancia>
nova resize <ID_Instacia> <ID_sabor>

Nova - Cinder

Eliminar imagen que falla al subir y se queda en estatus "Saving" ó snapshot que no se terminó de crear igual se queda en status "Saving"

  • Listar los cluster de ceph
ceph osd lspools
  • Listar las imagenes de un pool en especifico (images en nuestro caso)
rbd ls {poolname}

Ejemplo:

rbd ls images
  • Identificar la imagen a borrar y obtener su información (se ocupa el uuid)
rbd --image {image-name} -p {pool-name} info

Ejemplo:

rbd --image 43f95585-3662-48ff-b857-da9ad29e8bbe -p images info
  • Verfificar si la imagen tiene snapshots
rbd --pool {pool-name} snap ls {image-name}

Ejemplo:

rbd --pool images snap ls 43f95585-3662-48ff-b857-da9ad29e8bbe
  • Quitar la protección en los snapshots de la imagen
rbd --pool {pool-name} snap unprotect --snap {snapshot-name} --image {image-name}

Ejemplo:

rbd --pool images snap unprotect --snap snap --image 43f95585-3662-48ff-b857-da9ad29e8bbe
  • Eliminar los snapshots de la imagen para que nos permita eliminarla
rbd --pool {pool-name} snap rm --snap {snap-name} {image-name}

Ejemplo:

rbd --pool images snap rm --snap snap 43f95585-3662-48ff-b857-da9ad29e8bbe
  • Por último eliminar la imagen
rbd rm {image-name} -p {pool-name}

Ejemplo:

rbd rm 43f95585-3662-48ff-b857-da9ad29e8bbe -p images

Poner un volumen como desasociado en Cinder

Si el backend de cinder tiene problemas o bugs pueden causar que el proceso de desasociar un volumen de una instancia falle.

nova volume-detach <ID_Instancia> <ID_Volumen>

Esto provoca que en nova ya no aparezca asociado el volumen pero en Cinder queda el status “Detaching ó Desasociando”.

Antes de aplicar los queries para arreglar el problema debemos asegurarnos que el volumen ha sido desasociado de la instancia, así como revisar el backend (cepa, lvm, iscsi, etc) para aseguraros que no este usándose mas el volumen.

  • Ejecutar el siguiente comando:
cinder reset-state --state available <ID_Volumen>
  • Si lo anterior no corrige el problema, ejecutar los queries siguientes para poner el estado “available” al volumen
use cinder;
update volumes set attach_status='detached',status='available' where id =‘ID_Volumen’;

Debemos estar completamente seguros que no se están escribiendo datos al volumen ya que podría causar pérdida de datos.

Desasociar un volumen de una instancia (Nova)

En ciertos procesos como eliminación, redimencionamiento ó migración de una instancia puede ocurrir que el/los volumen/es sean descarados de Cinder pero en Nova aún sigue mostrando asociado. Al igual que anteriormente asegurarnos que el volumen ha sido desasociado de la instancia

  • El siguiente query remueve el mapeo del block estiraje (volumen) de Nova.
$ mysql nova
delete from block_device_mapping where not deleted and volume_id=‘ID_Volumen’ and project_id=’ID_Tenant’;
  • La forma correcta de desasociar un volumen es la siguiente:
 nova volume_detach ID_Instancia ID_Volume
  • Después de hacer el proceso se recomienda hacer un hard reboot de la instancia ya que si no hacemos eso al arrancar la instancia habrá error al no poder asociar el volumen en el punto de montaje ya que piensa que aún está en uso el volumen.

Nova - CEPH

Respaldar instancia migrando de ceph a un archivo raw o qcow2

Identificar en que pool de ceph están las imágenes de las instancias

  • Listar pools
ceph osd lspools
  • Listar contenido de un pool
rbd ls {pool_name}

Ejemplo:

rbd ls compute
  • Obtener ID de la instancia
nova list
  • Identificar si en el pool está la instancia y obtener la información de la imagen
qemu-img info rbd:{pool-name}/{image-name}

Ejemplo:

qemu-img info rbd:compute/44977ba9-8c3b-4b76-bea5-ae9027b9ddd4_disk
  • Convertir de ceph a qcow2
qemu-img convert -p -O qcow2 rbd:{pool-name}/{image-name} /ruta/a/guardar/nombre_imagen.qcow2

Ejemplo:

qemu-img convert -p -O qcow2 rbd:compute/44977ba9-8c3b-4b76-bea5-ae9027b9ddd4_disk /mnt/cloud_bkp/graylog_backup_test.qcow2
  • Ver info de la nueva imagen
qemu-img info nombre_imagen.qcow2

Ejemplo:

qemu-img info graylog_backup_test.qcow2

Cinder

Subir imagen

  • Indicando credenciales de openstack y subiendo desde archivo local
glance image-create --debug --verbose --timeout {segundos} --os-tenant-name {nombre_tenant} --os-username {usuario_openstack} --os-password {passwd_openstack} --os-auth-url {“URL_keystone”} --os_auth_strategy keystone  --progress --name {nombre_imagen} --is-public {true/false} --container-format bare --disk-format {raw,qcow2,vmk,iso} < {/ruta/archivo.[qcow2,vdk,raw]}

Ejemplo

glance image-create --debug --verbose --timeout 18000 --os-tenant-name SFE --os-username pepepecas --os-password picapapas --os-auth-url "http://192.168.0.2:5000/v2.0/" --os_auth_strategy keystone  --progress --name ubuntu_test --is-public yes --container-format bare --disk-format raw < ubuntu_test.raw
  • Subir desde url , previamente se cargaron credenciales
glance image-create --progress --name {nombre_imagen} --disk-format {raw,qcow2,vmk,iso} --container-format bare --is-public {true/false} --copy-from URL_image

Ejemplo:

glance image-create --progress --name 'Fedora 19 x86_64' --disk-format qcow2 --container-format bare --is-public true --copy-from http://cloud.fedoraproject.org/fedora-19.x86_64.qcow2
  • Subir desde archivo local, previamente se cargaron credenciales
glance image-create --progress --name {nombre_imagen} --disk-format {raw,qcow2,vmk,iso} --container-format bare --is-public {true/false} --file {/ruta/archivo.[qcow2,vdk,raw]}

Ejemplo:

glance image-create --progress --name 'kafka-82' --disk-format qcow2 --container-format bare --is-public true --file /root/kafka-dev-82.qcow2

Borrar un volumen de Cinder

Al borrar un volumen el proceso se queda en estatus Error_deleting.

  • Intentar ejecutar el siguiente comando para poner como disponible el volumen
cinder reset-state --state available ID_Volumen

Si falla, revisar el backend de BlockStorage para verificar si el volumen fue removido o no, en caso negativo debemos removerlo del backend.

  • Una vez que halla sido borrado físicamente, debemos actualizar el estatus en base de datos a “deleted” para que no se muestre más en el dashboard.
$ mysql cinder
update volumes set deleted=1,status='deleted',deleted_at=now(),updated_at=now() where deleted=0 and id=‘ID_Volumen’;
  • La forma normal de borrar un volumen es
cinder delete $volume_uuid.

Ejecutar los queries de manera incorrecta puede causar problemas serios de pérdidas de datos

Nova - Neutron

  • Desasociar IP de Instancia por Base de datos

  • Obtener nombre/ID de la instancia

nova list
  • Obtener información del puerto a desasociar
nova interface-list {nombre/ID instancia}

Ejemplo:

nova interface-list kafka-dev-82
nova interface-list 4b47fd3f-83a3-47ee-bf63-2db5c2fd4dde
  • Mostrar información del puerto
neutron port-show PORT_ID

Ejemplo:

neutron port-show 3cbfff31-4375-40e4-b1c4-2877beb266bb
  • Desasociar los puertos de la instancia ( Aquí los puertos no se eliminan)
mysql>use neutron;
select * from ports where device_id = '1d47a093-ecec-43e8-a985-73cbc3b97742'\G
update ports set device_id = '' where device_id = '1d47a093-ecec-43e8-a985-73cbc3b97742';

Asociar y desasociar puertos a instancias

Desasociar

  • Identificar el puerto a desatachar

Buscar el puerto deseado que para obtener el ID

nova interface-list {nombre/ID instancia}

Ó Buscar el puerto deseado que para obtener el ID

nuetron port-list | grep IP

Ejemplo:

nova interface-list kafka-dev-82
nuetron port-list | grep 10.10.5.23
  • Desasociar la interfaz (esto si elimina el puerto)
nova interface-detach <Nova ID / Nova instance name> <Port ID>

Ejemplo:

nova interface-detach 52355445-4b95-4e00-a2f5-165c844a4cea 83026cbc-c081-4b72-8476-19ffdf53e35b

Asociar

nova interface-attach --net-id <NET ID> [—fixed-ip <IP>] <Nova ID / Nova Instance Name>

Ejemplo:

nova interface-attach --net-id e11f0cac-156b-4f5c-bd8e-3fe56e57e8c1 --fixed-ip 10.10.12.24 52355445-4b95-4e00-a2f5-165c844a4cea

Neutron

Mover router de controlador

  • Obtener lista de controladores con agente L3
neutron agent-list|grep L3
  • Obtener los routers alojados en un controlador
neutron router-list-on-l3-agent <ID L3 agent>

Ejemplo:

neutron router-list-on-l3-agent 021bac86-175f-45d4-9a6b-3adbb6d8f855
  • Remover router de controlador
neutron l3-agent-router-remove <ID Router> <ID Instancia>

Ejemplo:

neutron l3-agent-router-remove 021bac86-175f-45d4-9a6b-3adbb6d8f855 cd9d27b3-a4a5-4c42-96c0-2c82fa081a40

Agregar router a controlador

neutron l3-agent-router-add <ID Router> <ID Instancia>

Ejemplo:

neutron l3-agent-router-add 0ac404e4-5d40-416f-8f65-9de3e541c46b cd9d27b3-a4a5-4c42-96c0-2c82fa081a40

Crear IP virtual (para usar en conjunto por ejemplo con keepalive o pacemaker)__

  • Obtener lista de redes
neutron net-list
  • Crear un puerto con ip específica
neutron port-create --fixed-ip ip_address=IP_virtual Nombre_Red

Ejemplo:

neutron port-create --fixed-ip ip_address=10.10.3.236 TEST_NET
  • Verificar creación del puerto
neutron port-show ID_Port_Virual

Ejemplo:

neutron port-show 0045-454323-f4-342342342
  • Obtener las IPs de las instancias a las que se asociará el puerto virtual
neutron port-list | grep IP_instancia1
neutron port-list | grep IP_instancia2

Ejemplo:

neutron port-list | grep 10.10.3.234
neutron port-list | grep 10.10.3.235
  • Asociar la ip virtual con las 2 instancias
neutron port-update ID_Port_instancia1 --allowed-address-pairs type=dict list=true ip_address=IP_Virtual
neutron port-update ID_Port_instancia2 --allowed-address-pairs type=dict list=true ip_address=IP_Virtual

Ejemplo:

neutron port-update 73H-2324FF-2345234-F42 --allowed-address-pairs type=dict list=true ip_address=10.10.3.236
neutron port-update 43f-62f24F-13545234-g2-3d32 --allowed-address-pairs type=dict list=true ip_address=10.10.3.236

Restaurar VPN después de mover o reiniciar un router ( Es un bug )

  • Determinar donde esta alojado el router
  • Obtener ID del router ya sea via web (Proyect -> Network -> Routers -> Overview ) ó mediante comandos ( neutron router-list )

  • Buscar en los controladores.

Forma 1:
Buscar donde se aloja el namespace del router

ip netns | grep ID_Router

Ejemplo:

    ip netns | grep 2a70849b-381d-4c58-a220-d6160a7ee337

Donde el comando de salida ahí se aloja el router

Forma 2:
Obtener lista de controladores con agente L3

neutron agent-list|grep L3
  • Obtener los routers alojados en un controlador
neutron router-list-on-l3-agent <ID L3 agent> | grep ID_Router

Ejemplo:

  neutron router-list-on-l3-agent 021bac86-175f-45d4-9a6b-3adbb6d8f855 | grep 2a70849b-381d-4c58-a220-d6160a7ee337

Donde el comando de salida ahí se aloja el router

En el controlador donde se aloja el router buscar en el log si marca error de pid existente (verificar que sea de la fecha actual).

less /var/log/neutron/vpn-agent.log|grep “ID_Router”

Ejemplo:

less /var/log/neutron/vpn-agent.log|grep "b5a22b0b-2e89-48a0-bef0-f44126eb2c9c"

Saldrá algo como lo siguiente:

2016-11-26 07:39:49.001 7533 TRACE neutron_vpnaas.services.vpn.device_drivers.ipsec pluto: lock file "/var/lib/neutron/ipsec/b5a22b0b-2e89-48a0-bef0-f44126eb2c9c/var/run/pluto/.pid" already exists

Si es el caso:

  1. Via web apagar la vpn ( Project -> Network -> VPN -> IPSec Site Connections -> Seleccionar Edit Connection -> Cambiar a Down el Admin State )
  2. Borrar el archivo pid encontrado en el log
rm /var/lib/neutron/ipsec/b5a22b0b-2e89-48a0-bef0-f44126eb2c9c/var/run/pluto/.pid
  1. Via web encender la vpn ( Project -> Network -> VPN -> IPSec Site Connections -> Seleccionar Edit Connection -> Cambiar a Up el Admin State )

Si no es el caso, solo Apagar y encender la van omitiendo el paso de remover el pid.

Fuel

Revisar servicios FUEL

  • Para comprobar que no hay problemas con los contenedores podemos correr el siguiente comando:
 dockerctl check.
  • Si hay contenedores con algún problema podemos reiniciarlos mediante el siguiente comando:
 dockerctl restart <container-name>

Después de eso debemos esperar un par de minutos a que se inicie por completo y comprobar de nuevo.

  • Fuel no utiliza dhcpd para proporcionar ops para los nodos esclavos. Más bien, se utiliza dnsmasq, que corre bajo el contenedor de Cobbler en Docker.
 dockerctl shell cobbler
 service dnsmasq status
  • La interfaz WEB de Fuel corre bajo nginx en un contenedor de Docker

Eliminar nodo con error de la BD de Fuel

 fuel node --node 6 --env 2 --delete-from-db

Pacemaker

Pacemaker commandos

  • Revisar estatus en cluster (da estatus de todos los recursos como rabbitmq,mysql,openvswitch,ntp, etc..)
pcs status

Revisar estatus del cluster en tiempo real

crm_mon
  • Revisar estatus de un recurso (servicio) [obtener nombre de servicio de la salida del pcs status]
crm resource status nombre_recurso

Ejemplo:

crm resource status p_mysql
  • Deshabilitar un recurso en un nodo
pcs resource ban resource_id [node] [--master] [lifetime=lifetime] [--wait[=n]]

Ejemplo:

pcs resource ban p_mysql ra.trx.com.mx
  • Habilitar un recurso en un nodo (reversa del ban)
pcs resource clear resource_id [node]

Ejemplo:

pcs resource clear p_mysql ra.trx.com.mx
  • Revisar constraint (condiciones) del cluster pacemaker (que servicios corren en que nodo o cuales están deshabitados, que recursos corren después de algún otro)
pcs constraint

Rabbitmq

Listas colas con los mensajes y consumidores correspondientes (top 20, si se requieren todas las colas quitar el tail. El numero de la primera columna es el número de mensajes, el número de la segunda columna es el número de consumidores, si una cola no tiene consumidores y crece rápido hay algún problema)

rabbitmqctl list_queues name  messages consumers | awk '{print $2,$3,$1}' | sort -n | tail -n 20
  • Borrar cola
rabbitmqctl purge_queue NOMBRE_COLA

Ejemplo:

rabbitmqctl purge_queue q-agent-notifier-l2population-update_fanout_5dc634f0e5b84d5fbaa242e7038276f2
Blog Logo

Alex Parra


Published

Image

Alex Parra's Blog

Thoughts, stories and ideas.

Back to Overview