Ich verwende Google Cloud/Google Container Engine und verfüge über Infrastrukturskripte, mit denen ich einen Cluster und Knotenpools erstelle und dann Vorgänge an den Knotenpools ausführe, nachdem sie eingerichtet sind.
In meinen Skripten muss ich sicherstellen, dass die Knotenpools eingerichtet sind und der Cluster bereit ist, bevor ich fortfahre.
Es scheint, dass der gcloud container node-pools create
Befehl im Gegensatz zum sehr ähnlichen keine Option --wait
oder hat . Gibt es eine solche Option für ? Gibt es sonst eine empfohlene Möglichkeit, zu „warten“, bis der Knotenpool bereit ist?--no-async
gcloud container node-pools delete
create
Ich glaube, dass ich in meinen Bash-Skripten nach dem Erstellen eines Knotenpools eine While-Schleife ausführen kann, in der ich regelmäßig den Wert von zB überprüfe, gcloud container clusters describe myclustername --zone myzone | tail -n 2 | grep "status" | awk '{print $2}'
bis ich " RUNNING
" zurückbekomme, aber vielleicht gibt es einen eleganteren Ansatz?
(Es wäre schön, wenn es gleiche Optionen zum Erstellen und Löschen von Knotenpools gäbe!)
Antwort1
Zum Zeitpunkt des Schreibens dieses Artikelsgcloud container node-pools create
Der Befehl ist standardmäßig synchronisiert, hat aber keine --async
oder- --no-wait
Option. Aus Shell-Skriptperspektive ist das nicht so schlimm, da es einfach genug ist, einen Befehl in den Hintergrund zu stellen und Ihr spezielles Problem lösen würde.
Eine Alternative zum Umgang mit dem ursprünglichen Verhalten wäre gewesen, --log-http
die Operations-ID zu erfassen und an weiterzuleiten gcloud container operations wait
(was etwas chaotisch ist und das Auslesen der Ausgabe erfordert). Dies deutet auf eine weitere Funktion hin, die nett wäre, nämlich dass asynchrone Befehle die Operations-ID wiedergeben.
Antwort2
Ich habe dieses Skript erstellt, das auf alle Containervorgänge wartet, die noch nicht abgeschlossen sind.
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 (im selben Verzeichnis)
#!/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]}};
Sie können die Skripte mit benutzerdefiniertem Cluster und Zone mit -c YOUR_CLUSTER
und konfigurieren. Wenn Sie keine angeben, -z YOUR_ZONE
wird die Konfiguration von übernommen .kubectl config current-context