Skip to content

Commit 2b62a7d

Browse files
committed
Add option for passing extended resources in node labels in GCE
on GCE, Cluster atuoscaler reads extended resource information from kubenv->AUTOSCALER_ENV_VARS->extended_resources in the managed scaling group template definition. However, users have no way to add a variable to extended resources, they are controlled from GKE side. This results in cluster autoscaler not supporting scale up from zero for all node pools that has extended resources (like GPU) on GCE. However, node labels are passed from the node pool to the managed scaling group template through the kubenv->AUTOSCALER_ENV_VARS->node_labels. This commit introduces the ability to pass extended resources as node labels with defined prefix on GCE, similar to how cluster autoscaler expects extended resources on AWS. This allows scaling from zero for node pools with extended resrouces.
1 parent 7b4069e commit 2b62a7d

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

cluster-autoscaler/cloudprovider/gce/templates.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -438,22 +438,44 @@ func extractExtendedResourcesFromKubeEnv(kubeEnv KubeEnv) (apiv1.ResourceList, e
438438
klog.Warningf("error while obtaining extended_resources from AUTOSCALER_ENV_VARS; %v", err)
439439
return nil, err
440440
}
441-
442-
if !found {
443-
return apiv1.ResourceList{}, nil
441+
var extendedResourcesMap map[string]string
442+
if found {
443+
extendedResourcesMap, err = parseKeyValueListToMap(extendedResourcesAsString)
444+
if err != nil {
445+
return apiv1.ResourceList{}, err
446+
}
447+
} else {
448+
extendedResourcesMap = make(map[string]string)
444449
}
445-
446-
extendedResourcesMap, err := parseKeyValueListToMap(extendedResourcesAsString)
450+
nodeLabelsAsString, found, err := extractAutoscalerVarFromKubeEnv(kubeEnv, "node_labels")
447451
if err != nil {
448-
return apiv1.ResourceList{}, err
452+
klog.Warningf("error while obtaining node_labels from AUTOSCALER_ENV_VARS; %v", err)
453+
return nil, err
454+
}
455+
if found {
456+
nodeLabelsMap, err := parseKeyValueListToMap(nodeLabelsAsString)
457+
if err != nil {
458+
return apiv1.ResourceList{}, err
459+
}
460+
const extendedResourcesKeyPrefix = "clusterautoscaler-nodetemplate-resources-"
461+
for key, value := range nodeLabelsMap {
462+
if strings.HasPrefix(key, extendedResourcesKeyPrefix) {
463+
key = strings.TrimPrefix(key, extendedResourcesKeyPrefix)
464+
extendedResourcesMap[key] = value
465+
}
466+
}
467+
}
468+
469+
if len(extendedResourcesMap) == 0 {
470+
return apiv1.ResourceList{}, nil
449471
}
450472

451473
extendedResources := apiv1.ResourceList{}
452474
for name, quantity := range extendedResourcesMap {
453475
if q, err := resource.ParseQuantity(quantity); err == nil && q.Sign() >= 0 {
454476
extendedResources[apiv1.ResourceName(name)] = q
455477
} else if err != nil {
456-
klog.Warningf("ignoring invalid value in extended_resources defined in AUTOSCALER_ENV_VARS; %v", err)
478+
klog.Warningf("ignoring invalid value in extended_resources or node_labels defined in AUTOSCALER_ENV_VARS; %v", err)
457479
}
458480
}
459481
return extendedResources, nil

cluster-autoscaler/cloudprovider/gce/templates_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,18 @@ func TestExtractExtendedResourcesFromKubeEnv(t *testing.T) {
13041304
expectedExtendedResources: apiv1.ResourceList{},
13051305
expectedErr: true,
13061306
},
1307+
{
1308+
name: "two valid values one of them defined in node labels",
1309+
kubeEnvValue: "AUTOSCALER_ENV_VARS: node_labels=a=b,c=d,clusterautoscaler-nodetemplate-resources-test.co/test-resource=3,cloud.google.com/gke-nodepool=pool-3,cloud.google.com/gke-preemptible=true;" +
1310+
"node_taints='dedicated=ml:NoSchedule,test=dev:PreferNoSchedule,a=b:c';" +
1311+
"kube_reserved=cpu=1000m,memory=300000Mi;" +
1312+
"extended_resources=foo=bar,baz=10G",
1313+
expectedExtendedResources: apiv1.ResourceList{
1314+
apiv1.ResourceName("baz"): *resource.NewQuantity(10*units.GB, resource.DecimalSI),
1315+
apiv1.ResourceName("test.co/test-resource"): *resource.NewQuantity(3, resource.DecimalSI),
1316+
},
1317+
expectedErr: false,
1318+
},
13071319
}
13081320

13091321
for _, tc := range testCases {

0 commit comments

Comments
 (0)