Não há --wait ou --no-async ao criar o pool de nós do contêiner do Google Cloud?

Não há --wait ou --no-async ao criar o pool de nós do contêiner do Google Cloud?

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 createcomando não tem opção --waitor --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 createO comando é sincronizado por padrão, mas não tem uma opção --asyncou --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-httppara 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_CLUSTERe -z YOUR_ZONE. A configuração será necessária kubectl config current-contextse você não especificar nenhuma.

informação relacionada