Estoy usando Google Cloud/Google Container Engine y tengo scripts de infraestructura donde creo un clúster y grupos de nodos y luego realizo operaciones en los grupos de nodos una vez que están configurados.
En mis scripts, debo asegurarme de que los grupos de nodos estén configurados y que el clúster esté listo antes de continuar.
Parece que el gcloud container node-pools create
comando no tiene opción --wait
o --no-async
, a diferencia del muy similar gcloud container node-pools delete
. ¿Existe tal opción para create
? De lo contrario, ¿existe alguna forma recomendada de "esperar" hasta que el grupo de nodos esté listo?
Creo que en mis scripts bash, después de crear un grupo de nodos, puedo hacer un bucle while, verificando periódicamente el valor de, por ejemplo, gcloud container clusters describe myclustername --zone myzone | tail -n 2 | grep "status" | awk '{print $2}'
hasta que obtenga " RUNNING
", pero ¿quizás haya un enfoque más elegante?
(¡Sería bueno tener paridad en las opciones para crear y eliminar grupos de nodos!)
Respuesta1
Al momento de escribir estas líneas elgcloud container node-pools create
El comando está sincronizado de forma predeterminada pero no tiene la opción --async
o --no-wait
. Esto no es tan malo desde la perspectiva de las secuencias de comandos de Shell, ya que es bastante fácil poner en segundo plano un comando y resolvería su problema particular.
Una alternativa para lidiar con el comportamiento original habría sido utilizar --log-http
para tomar el ID de la operación y alimentarlo gcloud container operations wait
(lo cual es un poco complicado y requiere eliminar la salida). Esto sugiere otra característica que sería bueno tener, que es que los comandos asíncronos hagan eco del ID de la operación.
Respuesta2
Creé este script que esperará cualquier operación de contenedor que aún no haya finalizado.
esperar_contenedor_operaciones.sh
#!/bin/bash
# This scripts runs gcloud container `operations describe` and `wait` for all found operations with `list --filter=STATUS!=DONE`
# API outlined here https://cloud.google.com/sdk/gcloud/reference/compute/operations/
set -euo pipefail
IFS=$'\n\t'
source_dir="$(dirname "$0")";
current_dir="$(pwd)";
echo "Listing, describing and awaiting NOT-DONE container-operations";
function sourceClusterZone(){
cd $source_dir;
source ./cluster_zone.sh;
cd $current_dir;
}
queryNotDone(){ gcloud container operations list --filter=STATUS!=DONE --sort-by='~START_TIME'; }
listNotDone(){ queryNotDone | awk '{if (NR!=1) {print $1;}}'; }
sleep 2;
LISTNOTDONE=(`listNotDone`);
echo "\""${LISTNOTDONE[@]}"\"";
if (( ${#LISTNOTDONE[@]} )); then
sourceClusterZone;
for notDone in ${LISTNOTDONE[@]}
do
echo "Waiting for $notDone";
gcloud container operations describe $notDone --zone="${ZONE}";
gcloud container operations wait $notDone --zone="${ZONE}";
echo "Done with $notDone";
done
else
echo 'Not Waiting';
fi
cluster_zone.sh (en el mismo directorio)
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
kubeClusterOptions(){ kubectl config current-context | awk -F '_' 'BEGIN { ORS=" " }; {print $4} {print $3}'; }
declare -a OPTIONS;
IFS=' ' read -a OPTIONS <<< `kubeClusterOptions`; IFS=$'\n\t';
while getopts c:z: option
do
case "${option}"
in
c) CLUSTER=${OPTARG:-${OPTIONS[0]}};;
z) ZONE=${OPTARG:-${OPTIONS[1]}};;
esac
done
export CLUSTER=${CLUSTER:-${OPTIONS[0]}};
export ZONE=${ZONE:-${OPTIONS[1]}};
Puede configurar los scripts con un clúster y una zona personalizados con -c YOUR_CLUSTER
y -z YOUR_ZONE
. Tomará la configuración kubectl config current-context
si no especifica ninguna.