Remove gce-expander-ephemeral-storage-support flag
Always enable the feature
This commit is contained in:
		
							parent
							
								
									cb785f2f07
								
							
						
					
					
						commit
						e836e47c1e
					
				|  | @ -374,7 +374,7 @@ func BuildGCE(opts config.AutoscalingOptions, do cloudprovider.NodeGroupDiscover | |||
| 		klog.Fatalf("Failed to create GCE Manager: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	pricingModel := NewGcePriceModel(NewGcePriceInfo(), opts.GCEOptions.ExpanderEphemeralStorageSupport) | ||||
| 	pricingModel := NewGcePriceModel(NewGcePriceInfo()) | ||||
| 	provider, err := BuildGceCloudProvider(manager, rl, pricingModel) | ||||
| 	if err != nil { | ||||
| 		klog.Fatalf("Failed to create GCE cloud provider: %v", err) | ||||
|  |  | |||
|  | @ -30,15 +30,13 @@ import ( | |||
| 
 | ||||
| // GcePriceModel implements PriceModel interface for GCE.
 | ||||
| type GcePriceModel struct { | ||||
| 	PriceInfo               PriceInfo | ||||
| 	EphemeralStorageSupport bool | ||||
| 	PriceInfo PriceInfo | ||||
| } | ||||
| 
 | ||||
| // NewGcePriceModel gets a new instance of GcePriceModel
 | ||||
| func NewGcePriceModel(info PriceInfo, ephemeralStorageSupport bool) *GcePriceModel { | ||||
| func NewGcePriceModel(info PriceInfo) *GcePriceModel { | ||||
| 	return &GcePriceModel{ | ||||
| 		PriceInfo:               info, | ||||
| 		EphemeralStorageSupport: ephemeralStorageSupport, | ||||
| 		PriceInfo: info, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -81,36 +79,34 @@ func (model *GcePriceModel) NodePrice(node *apiv1.Node, startTime time.Time, end | |||
| 	} | ||||
| 
 | ||||
| 	// Ephemeral Storage
 | ||||
| 	if model.EphemeralStorageSupport { | ||||
| 		// Local SSD price
 | ||||
| 		if node.Labels[ephemeralStorageLocalSsdLabel] == "true" || node.Annotations[EphemeralStorageLocalSsdAnnotation] == "true" { | ||||
| 			localSsdCount, _ := strconv.ParseFloat(node.Annotations[LocalSsdCountAnnotation], 64) | ||||
| 			localSsdPrice := model.PriceInfo.LocalSsdPricePerHour() | ||||
| 			if hasPreemptiblePricing(node) { | ||||
| 				localSsdPrice = model.PriceInfo.SpotLocalSsdPricePerHour() | ||||
| 			} | ||||
| 			price += localSsdCount * float64(LocalSSDDiskSizeInGiB) * localSsdPrice * getHours(startTime, endTime) | ||||
| 	// Local SSD price
 | ||||
| 	if node.Labels[ephemeralStorageLocalSsdLabel] == "true" || node.Annotations[EphemeralStorageLocalSsdAnnotation] == "true" { | ||||
| 		localSsdCount, _ := strconv.ParseFloat(node.Annotations[LocalSsdCountAnnotation], 64) | ||||
| 		localSsdPrice := model.PriceInfo.LocalSsdPricePerHour() | ||||
| 		if hasPreemptiblePricing(node) { | ||||
| 			localSsdPrice = model.PriceInfo.SpotLocalSsdPricePerHour() | ||||
| 		} | ||||
| 
 | ||||
| 		// Boot disk price
 | ||||
| 		bootDiskSize, _ := strconv.ParseInt(node.Annotations[BootDiskSizeAnnotation], 10, 64) | ||||
| 		if bootDiskSize == 0 { | ||||
| 			klog.Errorf("Boot disk size is not found for node %s, using default size %v", node.Name, DefaultBootDiskSizeGB) | ||||
| 			bootDiskSize = DefaultBootDiskSizeGB | ||||
| 		} | ||||
| 		bootDiskType := node.Annotations[BootDiskTypeAnnotation] | ||||
| 		if val, ok := node.Labels[bootDiskTypeLabel]; ok { | ||||
| 			bootDiskType = val | ||||
| 		} | ||||
| 		if bootDiskType == "" { | ||||
| 			klog.Errorf("Boot disk type is not found for node %s, using default type %s", node.Name, DefaultBootDiskType) | ||||
| 			bootDiskType = DefaultBootDiskType | ||||
| 		} | ||||
| 		bootDiskPrice := model.PriceInfo.BootDiskPricePerHour()[bootDiskType] | ||||
| 
 | ||||
| 		price += bootDiskPrice * float64(bootDiskSize) * getHours(startTime, endTime) | ||||
| 		price += localSsdCount * float64(LocalSSDDiskSizeInGiB) * localSsdPrice * getHours(startTime, endTime) | ||||
| 	} | ||||
| 
 | ||||
| 	// Boot disk price
 | ||||
| 	bootDiskSize, _ := strconv.ParseInt(node.Annotations[BootDiskSizeAnnotation], 10, 64) | ||||
| 	if bootDiskSize == 0 { | ||||
| 		klog.Errorf("Boot disk size is not found for node %s, using default size %v", node.Name, DefaultBootDiskSizeGB) | ||||
| 		bootDiskSize = DefaultBootDiskSizeGB | ||||
| 	} | ||||
| 	bootDiskType := node.Annotations[BootDiskTypeAnnotation] | ||||
| 	if val, ok := node.Labels[bootDiskTypeLabel]; ok { | ||||
| 		bootDiskType = val | ||||
| 	} | ||||
| 	if bootDiskType == "" { | ||||
| 		klog.Errorf("Boot disk type is not found for node %s, using default type %s", node.Name, DefaultBootDiskType) | ||||
| 		bootDiskType = DefaultBootDiskType | ||||
| 	} | ||||
| 	bootDiskPrice := model.PriceInfo.BootDiskPricePerHour()[bootDiskType] | ||||
| 
 | ||||
| 	price += bootDiskPrice * float64(bootDiskSize) * getHours(startTime, endTime) | ||||
| 
 | ||||
| 	// GPUs
 | ||||
| 	if gpuRequest, found := node.Status.Capacity[gpu.ResourceNvidiaGPU]; found { | ||||
| 		gpuPrice := model.PriceInfo.BaseGpuPricePerHour() | ||||
|  | @ -196,12 +192,10 @@ func (model *GcePriceModel) getBasePrice(resources apiv1.ResourceList, instanceT | |||
| 	} | ||||
| 	price += float64(mem.Value()) / float64(units.GiB) * memPrice * hours | ||||
| 
 | ||||
| 	if model.EphemeralStorageSupport { | ||||
| 		ephemeralStorage := resources[apiv1.ResourceEphemeralStorage] | ||||
| 		// For simplification using a fixed price for default boot disk.
 | ||||
| 		ephemeralStoragePrice := model.PriceInfo.BootDiskPricePerHour()[DefaultBootDiskType] | ||||
| 		price += float64(ephemeralStorage.Value()) / float64(units.GiB) * ephemeralStoragePrice * hours | ||||
| 	} | ||||
| 	ephemeralStorage := resources[apiv1.ResourceEphemeralStorage] | ||||
| 	// For simplification using a fixed price for default boot disk.
 | ||||
| 	ephemeralStoragePrice := model.PriceInfo.BootDiskPricePerHour()[DefaultBootDiskType] | ||||
| 	price += float64(ephemeralStorage.Value()) / float64(units.GiB) * ephemeralStoragePrice * hours | ||||
| 
 | ||||
| 	return price | ||||
| } | ||||
|  |  | |||
|  | @ -86,7 +86,6 @@ func TestGetNodePrice(t *testing.T) { | |||
| 		cheaperNode                *apiv1.Node | ||||
| 		expensiveNode              *apiv1.Node | ||||
| 		priceComparisonCoefficient float64 | ||||
| 		expanderSupport            bool | ||||
| 	}{ | ||||
| 		// instance types
 | ||||
| 		"e2 is cheaper than n1": { | ||||
|  | @ -107,7 +106,7 @@ func TestGetNodePrice(t *testing.T) { | |||
| 		"custom node price scales linearly": { | ||||
| 			cheaperNode:                testNode(t, "small_custom", "custom-1", 1000, 3.75*units.GiB, "", 0, false, false), | ||||
| 			expensiveNode:              testNode(t, "large_custom", "custom-8", 8000, 30*units.GiB, "", 0, false, false), | ||||
| 			priceComparisonCoefficient: 1.0 / 7.9, | ||||
| 			priceComparisonCoefficient: 0.14, | ||||
| 		}, | ||||
| 		"custom node price scales linearly 2": { | ||||
| 			cheaperNode:                testNode(t, "large_custom", "custom-8", 8000, 30*units.GiB, "", 0, false, false), | ||||
|  | @ -194,36 +193,32 @@ func TestGetNodePrice(t *testing.T) { | |||
| 			expensiveNode:              testNode(t, "known", "n1-custom", 8000, 30*units.GiB, "", 0, false, false), | ||||
| 			priceComparisonCoefficient: 1.001, | ||||
| 		}, | ||||
| 		// Ephemeral storage support
 | ||||
| 		"ephemeral storage support: less local SSD count is cheaper": { | ||||
| 		// Ephemeral storage
 | ||||
| 		"ephemeral storage: less local SSD count is cheaper": { | ||||
| 			cheaperNode:                testNodeEphemeralStorage(t, "cheapNode", true, 2, "pd-standard", 100, false), | ||||
| 			expensiveNode:              testNodeEphemeralStorage(t, "expensiveNode", true, 4, "pd-standard", 100, false), | ||||
| 			priceComparisonCoefficient: 1, | ||||
| 			expanderSupport:            true, | ||||
| 		}, | ||||
| 		"ephemeral storage support: local SSD cheaper than boot disk": { | ||||
| 		"ephemeral storage: local SSD cheaper than boot disk": { | ||||
| 			cheaperNode:                testNodeEphemeralStorage(t, "cheapNode", true, 1, "pd-standard", 100, true), | ||||
| 			expensiveNode:              testNodeEphemeralStorage(t, "expensiveNode", false, 0, "pd-ssd", 100, false), | ||||
| 			priceComparisonCoefficient: 1, | ||||
| 			expanderSupport:            true, | ||||
| 		}, | ||||
| 		"ephemeral storage support: node with cheaper boot disk option is cheaper": { | ||||
| 		"ephemeral storage: node with cheaper boot disk option is cheaper": { | ||||
| 			cheaperNode:                testNodeEphemeralStorage(t, "cheapNode", false, 0, "pd-standard", 100, false), | ||||
| 			expensiveNode:              testNodeEphemeralStorage(t, "expensiveNode", false, 0, "pd-ssd", 100, false), | ||||
| 			priceComparisonCoefficient: 1, | ||||
| 			expanderSupport:            true, | ||||
| 		}, | ||||
| 		"node with default boot disk is cheaper that node with more expensive boot disk type": { | ||||
| 			cheaperNode:                testNode(t, "cheapNode", "", 8000, 30*units.GiB, "", 0, false, false), | ||||
| 			expensiveNode:              testNodeEphemeralStorage(t, "expensiveNode", false, 0, "pd-ssd", 100, false), | ||||
| 			priceComparisonCoefficient: 1, | ||||
| 			expanderSupport:            true, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for tn, tc := range cases { | ||||
| 		t.Run(tn, func(t *testing.T) { | ||||
| 			model := NewGcePriceModel(NewGcePriceInfo(), tc.expanderSupport) | ||||
| 			model := NewGcePriceModel(NewGcePriceInfo()) | ||||
| 			now := time.Now() | ||||
| 
 | ||||
| 			price1, err := model.NodePrice(tc.cheaperNode, now, now.Add(time.Hour)) | ||||
|  | @ -242,7 +237,7 @@ func TestGetPodPrice(t *testing.T) { | |||
| 	pod2 := BuildTestPodWithEphemeralStorage("a2", 2*100, 2*500*units.MiB, 2*100*units.GiB) | ||||
| 	pod3 := BuildTestPodWithEphemeralStorage("a2", 2*100, 2*500*units.MiB, 100*units.GiB) | ||||
| 
 | ||||
| 	model := NewGcePriceModel(NewGcePriceInfo(), true) | ||||
| 	model := NewGcePriceModel(NewGcePriceInfo()) | ||||
| 	now := time.Now() | ||||
| 
 | ||||
| 	price1, err := model.PodPrice(pod1, now, now.Add(time.Hour)) | ||||
|  |  | |||
|  | @ -60,8 +60,6 @@ type GCEOptions struct { | |||
| 	ConcurrentRefreshes int | ||||
| 	// MigInstancesMinRefreshWaitTime is the minimum time which needs to pass before GCE MIG instances from a given MIG can be refreshed.
 | ||||
| 	MigInstancesMinRefreshWaitTime time.Duration | ||||
| 	// ExpanderEphemeralStorageSupport is whether scale-up takes ephemeral storage resources into account.
 | ||||
| 	ExpanderEphemeralStorageSupport bool | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
|  |  | |||
|  | @ -206,9 +206,9 @@ var ( | |||
| 	awsUseStaticInstanceList  = flag.Bool("aws-use-static-instance-list", false, "Should CA fetch instance types in runtime or use a static list. AWS only") | ||||
| 
 | ||||
| 	// GCE specific flags
 | ||||
| 	concurrentGceRefreshes             = flag.Int("gce-concurrent-refreshes", 1, "Maximum number of concurrent refreshes per cloud object type.") | ||||
| 	gceMigInstancesMinRefreshWaitTime  = flag.Duration("gce-mig-instances-min-refresh-wait-time", 5*time.Second, "The minimum time which needs to pass before GCE MIG instances from a given MIG can be refreshed.") | ||||
| 	gceExpanderEphemeralStorageSupport = flag.Bool("gce-expander-ephemeral-storage-support", false, "Whether scale-up takes ephemeral storage resources into account for GCE cloud provider") | ||||
| 	concurrentGceRefreshes            = flag.Int("gce-concurrent-refreshes", 1, "Maximum number of concurrent refreshes per cloud object type.") | ||||
| 	gceMigInstancesMinRefreshWaitTime = flag.Duration("gce-mig-instances-min-refresh-wait-time", 5*time.Second, "The minimum time which needs to pass before GCE MIG instances from a given MIG can be refreshed.") | ||||
| 	_                                 = flag.Bool("gce-expander-ephemeral-storage-support", true, "Whether scale-up takes ephemeral storage resources into account for GCE cloud provider (Deprecated, to be removed in 1.30+)") | ||||
| 
 | ||||
| 	enableProfiling                    = flag.Bool("profiling", false, "Is debug/pprof endpoint enabled") | ||||
| 	clusterAPICloudConfigAuthoritative = flag.Bool("clusterapi-cloud-config-authoritative", false, "Treat the cloud-config flag authoritatively (do not fallback to using kubeconfig flag). ClusterAPI only") | ||||
|  | @ -357,9 +357,8 @@ func createAutoscalingOptions() config.AutoscalingOptions { | |||
| 		NodeDeletionDelayTimeout:         *nodeDeletionDelayTimeout, | ||||
| 		AWSUseStaticInstanceList:         *awsUseStaticInstanceList, | ||||
| 		GCEOptions: config.GCEOptions{ | ||||
| 			ConcurrentRefreshes:             *concurrentGceRefreshes, | ||||
| 			MigInstancesMinRefreshWaitTime:  *gceMigInstancesMinRefreshWaitTime, | ||||
| 			ExpanderEphemeralStorageSupport: *gceExpanderEphemeralStorageSupport, | ||||
| 			ConcurrentRefreshes:            *concurrentGceRefreshes, | ||||
| 			MigInstancesMinRefreshWaitTime: *gceMigInstancesMinRefreshWaitTime, | ||||
| 		}, | ||||
| 		ClusterAPICloudConfigAuthoritative: *clusterAPICloudConfigAuthoritative, | ||||
| 		CordonNodeBeforeTerminate:          *cordonNodeBeforeTerminate, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue