我正在使用 Google Cloud / Google Container Engine,并且我有基础设施脚本,可以在其中创建集群和节点池,然后在设置完成后对节点池执行操作。
在我的脚本中,我需要确保节点池已设置并且集群处于就绪状态才能继续。
看起来该gcloud container node-pools create
命令没有--wait
或--no-async
选项,与非常相似的不同gcloud container node-pools delete
。 有这样的选项吗create
?否则,是否有推荐的方法来“等待”直到节点池准备就绪?
我相信在我的 bash 脚本中,创建节点池后,我可以执行一个 while 循环,定期检查 eg 的值gcloud container clusters describe myclustername --zone myzone | tail -n 2 | grep "status" | awk '{print $2}'
直到我得到“ RUNNING
”,但也许有更优雅的方法?
(如果创建和删除节点池的选项有奇偶校验就好了!)
答案1
截至撰写本文时gcloud container node-pools create
命令默认为同步,但没有--async
或--no-wait
选项。从 shell 脚本的角度来看,这并不是太糟糕,因为将命令置于后台很容易,并且可以解决您的特定问题。
处理原始行为的另一种方法是使用--log-http
获取操作 ID 并将其提供给gcloud container operations wait
(这有点混乱,需要抓取输出)。这表明还有另一个不错的功能,即异步命令回显操作 ID。
答案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