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