Estou usando o Google Cloud/Google Container Engine e tenho scripts de infraestrutura onde crio um cluster e pools de nós e, em seguida, executo operações nos pools de nós depois de configurados.
Em meus scripts, preciso ter certeza de que os pools de nós estão configurados e que o cluster está pronto antes de continuar.
Parece que o gcloud container node-pools create
comando não tem opção --wait
or --no-async
, ao contrário do muito semelhante gcloud container node-pools delete
. Existe essa opção para create
? Caso contrário, existe uma maneira recomendada de "esperar" até que o pool de nós esteja pronto?
Acredito que em meus scripts bash, depois de criar um pool de nós, posso fazer um loop while, verificando periodicamente o valor de eg gcloud container clusters describe myclustername --zone myzone | tail -n 2 | grep "status" | awk '{print $2}'
até obter " RUNNING
" de volta, mas talvez haja uma abordagem mais elegante?
(Seria bom ter paridade nas opções para criar e excluir pools de nós!)
Responder1
No momento em que escrevo ogcloud container node-pools create
O comando é sincronizado por padrão, mas não tem uma opção --async
ou --no-wait
. Isso não é tão ruim do ponto de vista do shell script, pois é fácil o suficiente para colocar um comando em segundo plano e resolveria seu problema específico.
Uma alternativa para lidar com o comportamento original seria usar --log-http
para capturar o ID da operação e alimentá-lo gcloud container operations wait
(o que é um pouco confuso e requer a remoção da saída). Isso sugere outro recurso que seria bom ter, que consiste em comandos assíncronos ecoarem o ID da operação.
Responder2
Eu criei este script que irá aguardar qualquer operação de contêiner que ainda não tenha sido concluída.
wait_container_operações.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 (no mesmo diretório)
#!/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]}};
Você pode configurar os scripts com cluster e zona personalizados com -c YOUR_CLUSTER
e -z YOUR_ZONE
. A configuração será necessária kubectl config current-context
se você não especificar nenhuma.