@@ -253,12 +253,24 @@ function upload-server-tars() {
253253# NODE_INSTANCE_PREFIX
254254# Vars set:
255255# NODE_NAMES
256+ # INSTANCE_GROUPS
256257function detect-node-names {
257258 detect-project
258- NODE_NAMES=($( gcloud compute instance-groups managed list-instances \
259- " ${NODE_INSTANCE_PREFIX} -group" --zone " ${ZONE} " --project " ${PROJECT} " \
260- --format=yaml | grep instance: | cut -d ' ' -f 2) )
261- echo " NODE_NAMES=${NODE_NAMES[*]} " >&2
259+ INSTANCE_GROUPS=()
260+ INSTANCE_GROUPS+=($( gcloud compute instance-groups managed list --zone " ${ZONE} " --project " ${PROJECT} " | grep ${NODE_INSTANCE_PREFIX} | cut -f1 -d" " ) )
261+ NODE_NAMES=()
262+ if [[ -n " ${INSTANCE_GROUPS[@]:- } " ]]; then
263+ for group in " ${INSTANCE_GROUPS[@]} " ; do
264+ NODE_NAMES+=($( gcloud compute instance-groups managed list-instances \
265+ " ${group} " --zone " ${ZONE} " --project " ${PROJECT} " \
266+ --format=yaml | grep instance: | cut -d ' ' -f 2) )
267+ done
268+ echo " INSTANCE_GROUPS=${INSTANCE_GROUPS[*]} " >&2
269+ echo " NODE_NAMES=${NODE_NAMES[*]} " >&2
270+ else
271+ echo " INSTANCE_GROUPS=" >&2
272+ echo " NODE_NAMES=" >&2
273+ fi
262274}
263275
264276# Detect the information about the minions
@@ -713,17 +725,43 @@ function kube-up {
713725
714726 create-node-instance-template $template_name
715727
728+ local defaulted_max_instances_per_mig=${MAX_INSTANCES_PER_MIG:- 500}
729+
730+ if [[ ${defaulted_max_instances_per_mig} -le " 0" ]]; then
731+ echo " MAX_INSTANCES_PER_MIG cannot be negative. Assuming default 500"
732+ defaulted_max_instances_per_mig=500
733+ fi
734+ local num_migs=$(( (${NUM_NODES} + ${defaulted_max_instances_per_mig} - 1 ) / ${defaulted_max_instances_per_mig} ))
735+ local instances_per_mig=$(( (${NUM_NODES} + ${num_migs} - 1 ) / ${num_migs} ))
736+ local last_mig_size=$(( ${NUM_NODES} - (${num_migs} - 1 ) * ${instances_per_mig} ))
737+
738+ # TODO: parallelize this loop to speed up the process
739+ for i in $( seq $(( ${num_migs} - 1 )) ) ; do
740+ gcloud compute instance-groups managed \
741+ create " ${NODE_INSTANCE_PREFIX} -group-$i " \
742+ --project " ${PROJECT} " \
743+ --zone " ${ZONE} " \
744+ --base-instance-name " ${NODE_INSTANCE_PREFIX} " \
745+ --size " ${instances_per_mig} " \
746+ --template " $template_name " || true ;
747+ gcloud compute instance-groups managed wait-until-stable \
748+ " ${NODE_INSTANCE_PREFIX} -group-$i " \
749+ --zone " ${ZONE} " \
750+ --project " ${PROJECT} " || true ;
751+ done
752+
716753 gcloud compute instance-groups managed \
717- create " ${NODE_INSTANCE_PREFIX} -group" \
754+ create " ${NODE_INSTANCE_PREFIX} -group- ${num_migs} " \
718755 --project " ${PROJECT} " \
719756 --zone " ${ZONE} " \
720757 --base-instance-name " ${NODE_INSTANCE_PREFIX} " \
721- --size " ${NUM_NODES } " \
758+ --size " ${last_mig_size } " \
722759 --template " $template_name " || true ;
723760 gcloud compute instance-groups managed wait-until-stable \
724- " ${NODE_INSTANCE_PREFIX} -group" \
725- --zone " ${ZONE} " \
726- --project " ${PROJECT} " || true ;
761+ " ${NODE_INSTANCE_PREFIX} -group-${num_migs} " \
762+ --zone " ${ZONE} " \
763+ --project " ${PROJECT} " || true ;
764+
727765 detect-node-names
728766 detect-master
729767
@@ -742,9 +780,12 @@ function kube-up {
742780 METRICS+=" --custom-metric-utilization metric=custom.cloudmonitoring.googleapis.com/kubernetes.io/memory/node_reservation,"
743781 METRICS+=" utilization-target=${TARGET_NODE_UTILIZATION} ,utilization-target-type=GAUGE "
744782
745- echo " Creating node autoscaler."
746- gcloud compute instance-groups managed set-autoscaling " ${NODE_INSTANCE_PREFIX} -group" --zone " ${ZONE} " --project " ${PROJECT} " \
747- --min-num-replicas " ${AUTOSCALER_MIN_NODES} " --max-num-replicas " ${AUTOSCALER_MAX_NODES} " ${METRICS} || true
783+ echo " Creating node autoscalers."
784+
785+ for i in $( seq ${num_migs} ) ; do
786+ gcloud compute instance-groups managed set-autoscaling " ${NODE_INSTANCE_PREFIX} -group-$i " --zone " ${ZONE} " --project " ${PROJECT} " \
787+ --min-num-replicas " ${AUTOSCALER_MIN_NODES} " --max-num-replicas " ${AUTOSCALER_MAX_NODES} " ${METRICS} || true
788+ done
748789 fi
749790
750791 echo " Waiting up to ${KUBE_CLUSTER_INITIALIZATION_TIMEOUT} seconds for cluster initialization."
@@ -810,46 +851,51 @@ function kube-up {
810851# down the firewall rules and routes.
811852function kube-down {
812853 detect-project
854+ detect-node-names # For INSTANCE_GROUPS
813855
814856 echo " Bringing down cluster"
815857 set +e # Do not stop on error
816858
817- # Delete autoscaler for nodes if present.
859+ # Delete autoscaler for nodes if present. We assume that all or none instance groups have an autoscaler
818860 local autoscaler
819861 autoscaler=( $( gcloud compute instance-groups managed list --zone " ${ZONE} " --project " ${PROJECT} " \
820- | grep " ${NODE_INSTANCE_PREFIX} -group" \
862+ | grep " ${NODE_INSTANCE_PREFIX} -group-1 " \
821863 | awk ' {print $7}' ) )
822864 if [[ " ${autoscaler:- } " == " yes" ]]; then
823- gcloud compute instance-groups managed stop-autoscaling " ${NODE_INSTANCE_PREFIX} -group" --zone " ${ZONE} " --project " ${PROJECT} "
865+ for group in ${INSTANCE_GROUPS[@]} ; do
866+ gcloud compute instance-groups managed stop-autoscaling " ${group} " --zone " ${ZONE} " --project " ${PROJECT} "
867+ done
824868 fi
825869
826870 # Get the name of the managed instance group template before we delete the
827871 # managed instange group. (The name of the managed instnace group template may
828872 # change during a cluster upgrade.)
829- local template=$( get-template " ${PROJECT} " " ${ZONE} " " ${NODE_INSTANCE_PREFIX} -group" )
873+ local template=$( get-template " ${PROJECT} " " ${ZONE} " " ${NODE_INSTANCE_PREFIX} -group-1 " )
830874
831875 # The gcloud APIs don't return machine parseable error codes/retry information. Therefore the best we can
832876 # do is parse the output and special case particular responses we are interested in.
833- if gcloud compute instance-groups managed describe " ${NODE_INSTANCE_PREFIX} -group" --project " ${PROJECT} " --zone " ${ZONE} " & > /dev/null; then
834- deleteCmdOutput=$( gcloud compute instance-groups managed delete --zone " ${ZONE} " \
835- --project " ${PROJECT} " \
836- --quiet \
837- " ${NODE_INSTANCE_PREFIX} -group" )
838- if [[ " $deleteCmdOutput " != " " ]]; then
839- # Managed instance group deletion is done asynchronously, we must wait for it to complete, or subsequent steps fail
840- deleteCmdOperationId=$( echo $deleteCmdOutput | grep " Operation:" | sed " s/.*Operation:[[:space:]]*\([^[:space:]]*\).*/\1/g" )
841- if [[ " $deleteCmdOperationId " != " " ]]; then
842- deleteCmdStatus=" PENDING"
843- while [[ " $deleteCmdStatus " != " DONE" ]]
844- do
845- sleep 5
846- deleteCmdOperationOutput=$( gcloud compute instance-groups managed --zone " ${ZONE} " --project " ${PROJECT} " get-operation $deleteCmdOperationId )
847- deleteCmdStatus=$( echo $deleteCmdOperationOutput | grep -i " status:" | sed " s/.*status:[[:space:]]*\([^[:space:]]*\).*/\1/g" )
848- echo " Waiting for MIG deletion to complete. Current status: " $deleteCmdStatus
849- done
877+ for group in ${INSTANCE_GROUPS[@]} ; do
878+ if gcloud compute instance-groups managed describe " ${group} " --project " ${PROJECT} " --zone " ${ZONE} " & > /dev/null; then
879+ deleteCmdOutput=$( gcloud compute instance-groups managed delete --zone " ${ZONE} " \
880+ --project " ${PROJECT} " \
881+ --quiet \
882+ " ${group} " )
883+ if [[ " $deleteCmdOutput " != " " ]]; then
884+ # Managed instance group deletion is done asynchronously, we must wait for it to complete, or subsequent steps fail
885+ deleteCmdOperationId=$( echo $deleteCmdOutput | grep " Operation:" | sed " s/.*Operation:[[:space:]]*\([^[:space:]]*\).*/\1/g" )
886+ if [[ " $deleteCmdOperationId " != " " ]]; then
887+ deleteCmdStatus=" PENDING"
888+ while [[ " $deleteCmdStatus " != " DONE" ]]
889+ do
890+ sleep 5
891+ deleteCmdOperationOutput=$( gcloud compute instance-groups managed --zone " ${ZONE} " --project " ${PROJECT} " get-operation $deleteCmdOperationId )
892+ deleteCmdStatus=$( echo $deleteCmdOperationOutput | grep -i " status:" | sed " s/.*status:[[:space:]]*\([^[:space:]]*\).*/\1/g" )
893+ echo " Waiting for MIG deletion to complete. Current status: " $deleteCmdStatus
894+ done
895+ fi
850896 fi
851897 fi
852- fi
898+ done
853899
854900 if gcloud compute instance-templates describe --project " ${PROJECT} " " ${template} " & > /dev/null; then
855901 gcloud compute instance-templates delete \
@@ -982,12 +1028,13 @@ function get-template {
9821028# KUBE_RESOURCE_FOUND
9831029function check-resources {
9841030 detect-project
1031+ detect-node-names
9851032
9861033 echo " Looking for already existing resources"
9871034 KUBE_RESOURCE_FOUND=" "
9881035
989- if gcloud compute instance-groups managed describe --project " ${PROJECT} " --zone " ${ZONE }" " ${NODE_INSTANCE_PREFIX} -group " & > /dev/null ; then
990- KUBE_RESOURCE_FOUND=" Managed instance group ${NODE_INSTANCE_PREFIX} -group "
1036+ if [[ -n " ${INSTANCE_GROUPS[@] :- } " ]] ; then
1037+ KUBE_RESOURCE_FOUND=" Managed instance groups ${INSTANCE_GROUPS[@]} "
9911038 return 1
9921039 fi
9931040
@@ -1090,11 +1137,13 @@ function prepare-push() {
10901137 create-node-instance-template $tmp_template_name
10911138
10921139 local template_name=" ${NODE_INSTANCE_PREFIX} -template"
1093- gcloud compute instance-groups managed \
1094- set-instance-template " ${NODE_INSTANCE_PREFIX} -group" \
1095- --template " $tmp_template_name " \
1096- --zone " ${ZONE} " \
1097- --project " ${PROJECT} " || true ;
1140+ for group in ${INSTANCE_GROUPS[@]} ; do
1141+ gcloud compute instance-groups managed \
1142+ set-instance-template " ${group} " \
1143+ --template " $tmp_template_name " \
1144+ --zone " ${ZONE} " \
1145+ --project " ${PROJECT} " || true ;
1146+ done
10981147
10991148 gcloud compute instance-templates delete \
11001149 --project " ${PROJECT} " \
@@ -1103,11 +1152,13 @@ function prepare-push() {
11031152
11041153 create-node-instance-template " $template_name "
11051154
1106- gcloud compute instance-groups managed \
1107- set-instance-template " ${NODE_INSTANCE_PREFIX} -group" \
1108- --template " $template_name " \
1109- --zone " ${ZONE} " \
1110- --project " ${PROJECT} " || true ;
1155+ for group in ${INSTANCE_GROUPS[@]} ; do
1156+ gcloud compute instance-groups managed \
1157+ set-instance-template " ${group} " \
1158+ --template " $template_name " \
1159+ --zone " ${ZONE} " \
1160+ --project " ${PROJECT} " || true ;
1161+ done
11111162
11121163 gcloud compute instance-templates delete \
11131164 --project " ${PROJECT} " \
0 commit comments