OpenStack Server Extended Status Extension ha expuesto algunos nuevos estados de tareas que brindan una visibilidad más detallada del estado del servidor durante el proceso de creación de imágenes (o "instantánea"). Este artículo describe qué son y sugiere cómo puede utilizarlos.
Antes del lanzamiento de OpenStack Grizzly, cuando solicitaba una acción de creación de imagen en un servidor, el servidor entraba en un estado de tarea especial. de image_snapshot
, y permanecería en este estado de tarea hasta que se completara la imagen. Este estado de tarea única ocultó el hecho de que hay tres fases distintas en una operación de instantánea:
- El hipervisor crea una imagen del disco duro virtual del servidor.
- El hipervisor empaqueta la imagen y la prepara para cargarla en el almacén de imágenes.
- El hipervisor carga la imagen empaquetada en el almacén de imágenes.
Durante la fase 1, debe evitar cualquier operación que modifique los datos en el disco duro virtual del servidor. De lo contrario, la instantánea grabada podría incluir inconsistencias de las cuales ciertos programas de aplicación en su servidor, principalmente bases de datos, podrían no ser capaces de recuperarse cuando inicie desde la imagen.
Tanto en la fase 2 como en la 3, el hipervisor funciona en nombre de su servidor, pero no hace nada con su disco duro virtual. Con diferencia, la tercera fase, en la que se produce la carga, es la que más tiempo tarda en completarse.
El lanzamiento de OpenStack Grizzly modificó ligeramente la semántica del estado image_snapshottask y agregó dos nuevos estados de tareas. Ahora, su servidor pasa por los siguientes estados de tarea mientras procesa una acción de creación de imagen:
- image_snapshot:el hipervisor crea una imagen del disco duro virtual del servidor
- image_pending_upload:el hipervisor empaqueta la imagen y la prepara para subirla
- image_uploading:el hipervisor carga la imagen en el almacén de imágenes
Mientras su servidor se encuentre en alguno de estos estados de tarea, no puede ejecutar otra acción de creación de imagen en ese servidor. Como puede ver en las descripciones del estado de la tarea, el hipervisor está involucrado en las tres fases de la acción de creación de imagen, por lo que todos los recursos de contabilidad adicionales que el hipervisor ha asignado a su servidor están en uso. Debe esperar hasta que se complete todo el proceso de la instantánea y libere estos recursos antes de poder crear otra instantánea.
Una vez completada la primera fase, ya no tendrá que preocuparse de que las operaciones en su servidor puedan interferir con la efectividad de su instantánea. Desafortunadamente, el Panel de control no expone los estados de las tareas del servidor. Sin embargo, puede verificarlos usando la API o python-novaclient
.
Utilice la API para comprobar el estado de la tarea del servidor
Los estados de la tarea aparecen en la siguiente respuesta de operación detallada del servidor:
GET /v2/servers/{serverId}
Aquí hay una respuesta detallada del servidor JSON abreviada:
{
"server": {
"OS-EXT-STS:power_state": 1,
"OS-EXT-STS:task_state": "image_pending_upload",
"OS-EXT-STS:vm_state": "active",
/* ... */
"id": "c2d5da0a-80d7-4ca7-872c-505410ab55d0",
/* ... */
"name": "check-my-task-state",
"progress": 100,
"status": "ACTIVE",
}
}
Busque el OS-EXT-STS:task_state
elemento. Debido a que un objeto JSON no está ordenado, puede aparecer en cualquier parte de la respuesta. A partir del valor que se muestra en este ejemplo, puede ver que el hipervisor terminó de crear la imagen del disco duro virtual del servidor y ahora está empaquetando y preparando la imagen para cargarla.
Utilice python-novaclient para comprobar el estado de la tarea del servidor
python-novaclient
es un programa útil que puede ejecutar desde la línea de comandos. Si no lo ha usado antes, aquí hay algunos artículos prácticos para consultar:
- Instalación de python-openstackclient en Linux y MacOS
- Instalando python-novaclient en Windows
Estos artículos proporcionan una descripción general de python-novaclient
e instrucciones completas para instalarlo en su sistema operativo.
Para ver el estado de la tarea de un servidor usando python-novaclient
,haz un show
operación en el servidor:
$ nova show {serverId}
Aquí hay una respuesta abreviada:
+------------------------+---------------------------------------+
| Property | Value |
+------------------------+---------------------------------------+
| status | ACTIVE |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | active |
| id | 933e803f-13b0-4698-a5c7-f74ec424fd38 |
| name | check-my-task-state |
| OS-DCF:diskConfig | MANUAL |
| progress | 100 |
| OS-EXT-STS:power_state | 1 |
| metadata | {} |
+------------------------+---------------------------------------+
En este ejemplo, puede ver que no hay un estado de tarea para el servidor, por lo que podría aceptar una image-create
solicitud.
Encuesta para comprobar el estado de la tarea del servidor
Es posible que desee descubrir el estado actual de la tarea del servidor antes de realizar una de las siguientes tareas:
- Detenga las actividades en el servidor que afectarían la calidad de la imagen del disco, como detener un sistema de administración de base de datos.
- Emitir un servidor
image-create
comando usando la API, novaclient o Panel de control. - Supervise el servidor para ver cuándo sale de
image_snapshot
estado de la tarea. - Reinicie las actividades detenidas antes de tomar la instantánea, como volver a activar el sistema de administración de la base de datos.
Puede escribir un script Bash simple para monitorear su servidor. Aquí hay una muestra de la parte más relevante, pero siéntase libre de ampliarla. Lea y asegúrese de saber lo que está haciendo antes de usarlo. Utiliza cuatro programas (curl
, egrep
,sed
y date
) que están instalados de forma predeterminada en la mayoría de los sistemas Linux®. Este fragmento es bastante primitivo, por lo que debe usar control-C para detener el script.
# set these vars
#
# the API endpoint, e.g., "https://iad.servers.api.rackspacecloud.com/v2/123456"
API_ENDPOINT=
# your API username, e.g., "fredco"
API_USER=
# your API auth token, obtained from the Identity service
API_AUTH_TOKEN=
# the UUID of the server you want to monitor
API_SERVER=
# how long to pause in between requests, in seconds
SLEEP_TIME=30
# a temporary file, e.g., "/tmp/polling.json"
DETAIL_FIL=
# verify that the server exists
API_RESP_CODE=$(curl -X GET <br>
-k -s <br>
-H "X-Auth-User: $API_USER" <br>
-H "X-Auth-Token: $API_AUTH_TOKEN" <br>
-H "Accept: application/json" <br>
-w "%{http_code}" <br>
-o $DETAIL_FIL <br>
"$API_ENDPOINT/servers/$API_SERVER")
if [ "$API_RESP_CODE" != "200" ] ; then
echo "[error] can't find server $API_SERVER"
exit 1
fi
while [ 0 ] ; do
API_RESP_CODE=$(curl -s -k -X GET <br>
-H "X-Auth-User: $API_USER" <br>
-H "X-Auth-Token: $API_AUTH_TOKEN" <br>
-H "Accept: application/json" <br>
-w "%{http_code}" <br>
-o $DETAIL_FIL <br>
"$API_ENDPOINT/servers/$API_SERVER")
if [ "$API_RESP_CODE" == "404" ] ; then
echo "[info] server $API_SERVER has disappeared!"
break
fi
RAW_STAT=$(egrep -o '"status": (".*?"|null)' $DETAIL_FIL | sed 's/"//g')
VM_STAT=$(egrep -o '"OS-EXT-STS:vm_state": (".*?"|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
TASK_STAT=$(egrep -o '"OS-EXT-STS:task_state": (".*?"|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
POW_STAT=$(egrep -o '"OS-EXT-STS:power_state": (\d|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
TIME=$(date +"%H:%M:%S")
echo "$TIME $RAW_STAT $VM_STAT $TASK_STAT $POW_STAT"
sleep ${SLEEP_TIME:-45}
done
Si inicia un script que contiene el fragmento anterior y luego toma una instantánea del servidor, verá algo similar al siguiente ejemplo:
17:14:41 status: ACTIVE vm_state: active task_state: null power_state: 1
17:14:44 status: ACTIVE vm_state: active task_state: null power_state: 1
17:14:48 status: ACTIVE vm_state: active task_state: image_snapshot power_state: 1
17:14:51 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:14:55 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:14:58 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:15:02 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:15:05 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:15:09 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
...
17:16:19 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:16:23 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:16:26 status: ACTIVE vm_state: active task_state: null power_state: 1
17:16:30 status: ACTIVE vm_state: active task_state: null power_state: 1