Назад | Перейти на главную страницу

Нет --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"назад, но, может быть, есть более элегантный подход?

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

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

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

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

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 если вы их не укажете.