Нет ли --wait или --no-async при создании пула узлов контейнера Google Cloud?

Нет ли --wait или --no-async при создании пула узлов контейнера Google Cloud?

Я использую Google Cloud / Google Container Engine и у меня есть скрипты инфраструктуры, в которых я создаю кластер и пулы узлов, а затем выполняю операции над пулами узлов после их настройки.

В моих скриптах мне нужно убедиться, что пулы узлов настроены и кластер находится в состоянии готовности, прежде чем продолжить.

Похоже, что gcloud container node-pools createкоманда не имеет опции --waitили --no-async, в отличие от очень похожей gcloud container node-pools delete. Есть ли такая опция для create? В противном случае, есть ли рекомендуемый способ "подождать", пока пул узлов не будет готов?

Я верю в свои скрипты bash, после создания пула узлов я могу выполнить цикл while, периодически проверяя значение, например, gcloud container clusters describe myclustername --zone myzone | tail -n 2 | grep "status" | awk '{print $2}'до тех пор, пока не получу RUNNINGобратно " ", но, возможно, есть более элегантный подход?

(Было бы неплохо иметь паритет в возможностях создания и удаления пулов узлов!)

решение1

На момент написания этой статьиgcloud container node-pools createКоманда по умолчанию sync, но не имеет опции --asyncor --no-wait. Это не так уж и плохо с точки зрения скриптинга оболочки, поскольку достаточно просто перевести команду в фоновый режим и решить вашу конкретную проблему.

Альтернативой для решения проблемы с исходным поведением было бы использование --log-httpзахвата идентификатора операции и его передачи gcloud container operations wait(что немного запутанно и требует очистки вывода). Это предполагает еще одну функцию, которую было бы неплохо иметь, а именно, чтобы асинхронные команды отображали идентификатор операции.

решение2

Я создал этот скрипт, который будет ожидать завершения всех операций с контейнером, которые еще не завершены.

wait_container_operations.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 (в той же директории)

#!/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]}};

Вы можете настроить скрипты с пользовательским кластером и зоной с помощью -c YOUR_CLUSTERи -z YOUR_ZONE. Он возьмет конфигурацию из, kubectl config current-contextесли вы не укажете ее.

Связанный контент