Я использую 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
если вы их не укажете.