Kein --wait oder --no-async beim Erstellen des Google Cloud-Containerknotenpools?

Kein --wait oder --no-async beim Erstellen des Google Cloud-Containerknotenpools?

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 createBefehl im Gegensatz zum sehr ähnlichen keine Option --waitoder hat . Gibt es eine solche Option für ? Gibt es sonst eine empfohlene Möglichkeit, zu „warten“, bis der Knotenpool bereit ist?--no-asyncgcloud container node-pools deletecreate

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 createDer Befehl ist standardmäßig synchronisiert, hat aber keine --asyncoder- --no-waitOption. 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-httpdie 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_CLUSTERund konfigurieren. Wenn Sie keine angeben, -z YOUR_ZONEwird die Konfiguration von übernommen .kubectl config current-context

verwandte Informationen