func createAutoscalingOptions()

in cluster-autoscaler/main.go [295:463]


func createAutoscalingOptions() config.AutoscalingOptions {
	minCoresTotal, maxCoresTotal, err := parseMinMaxFlag(*coresTotal)
	if err != nil {
		klog.Fatalf("Failed to parse flags: %v", err)
	}
	minMemoryTotal, maxMemoryTotal, err := parseMinMaxFlag(*memoryTotal)
	if err != nil {
		klog.Fatalf("Failed to parse flags: %v", err)
	}
	// Convert memory limits to bytes.
	minMemoryTotal = minMemoryTotal * units.GiB
	maxMemoryTotal = maxMemoryTotal * units.GiB

	parsedGpuTotal, err := parseMultipleGpuLimits(*gpuTotal)
	if err != nil {
		klog.Fatalf("Failed to parse flags: %v", err)
	}

	// in order to avoid inconsistent deletion thresholds for the legacy planner and the new actuator, the max-empty-bulk-delete,
	// and max-scale-down-parallelism flags must be set to the same value.
	if isFlagPassed("max-empty-bulk-delete") && !isFlagPassed("max-scale-down-parallelism") {
		*maxScaleDownParallelismFlag = *maxEmptyBulkDeleteFlag
		klog.Warning("The max-empty-bulk-delete flag will be deprecated in k8s version 1.29. Please use max-scale-down-parallelism instead.")
		klog.Infof("Setting max-scale-down-parallelism to %d, based on the max-empty-bulk-delete value %d", *maxScaleDownParallelismFlag, *maxEmptyBulkDeleteFlag)
	} else if !isFlagPassed("max-empty-bulk-delete") && isFlagPassed("max-scale-down-parallelism") {
		*maxEmptyBulkDeleteFlag = *maxScaleDownParallelismFlag
	}

	if isFlagPassed("node-autoprovisioning-enabled") {
		klog.Warning("The node-autoprovisioning-enabled flag is deprecated and will be removed in k8s version 1.31.")
	}

	if isFlagPassed("max-autoprovisioned-node-group-count") {
		klog.Warning("The max-autoprovisioned-node-group-count flag is deprecated and will be removed in k8s version 1.31.")
	}

	var parsedSchedConfig *scheduler_config.KubeSchedulerConfiguration
	// if scheduler config flag was set by the user
	if pflag.CommandLine.Changed(config.SchedulerConfigFileFlag) {
		parsedSchedConfig, err = scheduler_util.ConfigFromPath(*schedulerConfigFile)
	}
	if err != nil {
		klog.Fatalf("Failed to get scheduler config: %v", err)
	}

	if isFlagPassed("drain-priority-config") && isFlagPassed("max-graceful-termination-sec") {
		klog.Fatalf("Invalid configuration, could not use --drain-priority-config together with --max-graceful-termination-sec")
	}

	var drainPriorityConfigMap []kubelet_config.ShutdownGracePeriodByPodPriority
	if isFlagPassed("drain-priority-config") {
		drainPriorityConfigMap = actuation.ParseShutdownGracePeriodsAndPriorities(*drainPriorityConfig)
		if len(drainPriorityConfigMap) == 0 {
			klog.Fatalf("Invalid configuration, parsing --drain-priority-config")
		}
	}

	return config.AutoscalingOptions{
		NodeGroupDefaults: config.NodeGroupAutoscalingOptions{
			ScaleDownUtilizationThreshold:    *scaleDownUtilizationThreshold,
			ScaleDownGpuUtilizationThreshold: *scaleDownGpuUtilizationThreshold,
			ScaleDownUnneededTime:            *scaleDownUnneededTime,
			ScaleDownUnreadyTime:             *scaleDownUnreadyTime,
			IgnoreDaemonSetsUtilization:      *ignoreDaemonSetsUtilization,
			MaxNodeProvisionTime:             *maxNodeProvisionTime,
		},
		CloudConfig:                      *cloudConfig,
		CloudProviderName:                *cloudProviderFlag,
		NodeGroupAutoDiscovery:           *nodeGroupAutoDiscoveryFlag,
		MaxTotalUnreadyPercentage:        *maxTotalUnreadyPercentage,
		OkTotalUnreadyCount:              *okTotalUnreadyCount,
		ScaleUpFromZero:                  *scaleUpFromZero,
		ParallelScaleUp:                  *parallelScaleUp,
		EstimatorName:                    *estimatorFlag,
		ExpanderNames:                    *expanderFlag,
		GRPCExpanderCert:                 *grpcExpanderCert,
		GRPCExpanderURL:                  *grpcExpanderURL,
		IgnoreMirrorPodsUtilization:      *ignoreMirrorPodsUtilization,
		MaxBulkSoftTaintCount:            *maxBulkSoftTaintCount,
		MaxBulkSoftTaintTime:             *maxBulkSoftTaintTime,
		MaxEmptyBulkDelete:               *maxEmptyBulkDeleteFlag,
		MaxGracefulTerminationSec:        *maxGracefulTerminationFlag,
		MaxPodEvictionTime:               *maxPodEvictionTime,
		MaxNodesTotal:                    *maxNodesTotal,
		MaxCoresTotal:                    maxCoresTotal,
		MinCoresTotal:                    minCoresTotal,
		MaxMemoryTotal:                   maxMemoryTotal,
		MinMemoryTotal:                   minMemoryTotal,
		GpuTotal:                         parsedGpuTotal,
		NodeGroups:                       *nodeGroupsFlag,
		EnforceNodeGroupMinSize:          *enforceNodeGroupMinSize,
		ScaleDownDelayAfterAdd:           *scaleDownDelayAfterAdd,
		ScaleDownDelayTypeLocal:          *scaleDownDelayTypeLocal,
		ScaleDownDelayAfterDelete:        *scaleDownDelayAfterDelete,
		ScaleDownDelayAfterFailure:       *scaleDownDelayAfterFailure,
		ScaleDownEnabled:                 *scaleDownEnabled,
		ScaleDownUnreadyEnabled:          *scaleDownUnreadyEnabled,
		ScaleDownNonEmptyCandidatesCount: *scaleDownNonEmptyCandidatesCount,
		ScaleDownCandidatesPoolRatio:     *scaleDownCandidatesPoolRatio,
		ScaleDownCandidatesPoolMinCount:  *scaleDownCandidatesPoolMinCount,
		DrainPriorityConfig:              drainPriorityConfigMap,
		SchedulerConfig:                  parsedSchedConfig,
		WriteStatusConfigMap:             *writeStatusConfigMapFlag,
		StatusConfigMapName:              *statusConfigMapName,
		BalanceSimilarNodeGroups:         *balanceSimilarNodeGroupsFlag,
		ConfigNamespace:                  *namespace,
		ClusterName:                      *clusterName,
		NodeAutoprovisioningEnabled:      *nodeAutoprovisioningEnabled,
		MaxAutoprovisionedNodeGroupCount: *maxAutoprovisionedNodeGroupCount,
		UnremovableNodeRecheckTimeout:    *unremovableNodeRecheckTimeout,
		ExpendablePodsPriorityCutoff:     *expendablePodsPriorityCutoff,
		Regional:                         *regional,
		NewPodScaleUpDelay:               *newPodScaleUpDelay,
		StartupTaints:                    append(*ignoreTaintsFlag, *startupTaintsFlag...),
		StatusTaints:                     *statusTaintsFlag,
		BalancingExtraIgnoredLabels:      *balancingIgnoreLabelsFlag,
		BalancingLabels:                  *balancingLabelsFlag,
		KubeClientOpts: config.KubeClientOptions{
			Master:         *kubernetes,
			KubeConfigPath: *kubeConfigFile,
			APIContentType: *kubeAPIContentType,
		},
		NodeDeletionDelayTimeout: *nodeDeletionDelayTimeout,
		AWSUseStaticInstanceList: *awsUseStaticInstanceList,
		GCEOptions: config.GCEOptions{
			ConcurrentRefreshes:            *concurrentGceRefreshes,
			MigInstancesMinRefreshWaitTime: *gceMigInstancesMinRefreshWaitTime,
			LocalSSDDiskSizeProvider:       localssdsize.NewSimpleLocalSSDProvider(),
			BulkMigInstancesListingEnabled: *bulkGceMigInstancesListingEnabled,
		},
		ClusterAPICloudConfigAuthoritative: *clusterAPICloudConfigAuthoritative,
		CordonNodeBeforeTerminate:          *cordonNodeBeforeTerminate,
		DaemonSetEvictionForEmptyNodes:     *daemonSetEvictionForEmptyNodes,
		DaemonSetEvictionForOccupiedNodes:  *daemonSetEvictionForOccupiedNodes,
		UserAgent:                          *userAgent,
		InitialNodeGroupBackoffDuration:    *initialNodeGroupBackoffDuration,
		MaxNodeGroupBackoffDuration:        *maxNodeGroupBackoffDuration,
		NodeGroupBackoffResetTimeout:       *nodeGroupBackoffResetTimeout,
		MaxScaleDownParallelism:            *maxScaleDownParallelismFlag,
		MaxDrainParallelism:                *maxDrainParallelismFlag,
		RecordDuplicatedEvents:             *recordDuplicatedEvents,
		MaxNodesPerScaleUp:                 *maxNodesPerScaleUp,
		MaxNodeGroupBinpackingDuration:     *maxNodeGroupBinpackingDuration,
		MaxBinpackingTime:                  *maxBinpackingTimeFlag,
		NodeDeletionBatcherInterval:        *nodeDeletionBatcherInterval,
		SkipNodesWithSystemPods:            *skipNodesWithSystemPods,
		SkipNodesWithLocalStorage:          *skipNodesWithLocalStorage,
		MinReplicaCount:                    *minReplicaCount,
		NodeDeleteDelayAfterTaint:          *nodeDeleteDelayAfterTaint,
		ScaleDownSimulationTimeout:         *scaleDownSimulationTimeout,
		SkipNodesWithCustomControllerPods:  *skipNodesWithCustomControllerPods,
		NodeGroupSetRatios: config.NodeGroupDifferenceRatios{
			MaxCapacityMemoryDifferenceRatio: *maxCapacityMemoryDifferenceRatio,
			MaxAllocatableDifferenceRatio:    *maxAllocatableDifferenceRatio,
			MaxFreeDifferenceRatio:           *maxFreeDifferenceRatio,
		},
		DynamicNodeDeleteDelayAfterTaintEnabled:      *dynamicNodeDeleteDelayAfterTaintEnabled,
		BypassedSchedulers:                           scheduler_util.GetBypassedSchedulersMap(*bypassedSchedulers),
		ProvisioningRequestEnabled:                   *provisioningRequestsEnabled,
		AsyncNodeGroupsEnabled:                       *asyncNodeGroupsEnabled,
		ProvisioningRequestInitialBackoffTime:        *provisioningRequestInitialBackoffTime,
		ProvisioningRequestMaxBackoffTime:            *provisioningRequestMaxBackoffTime,
		ProvisioningRequestMaxBackoffCacheSize:       *provisioningRequestMaxBackoffCacheSize,
		CheckCapacityBatchProcessing:                 *checkCapacityBatchProcessing,
		CheckCapacityProvisioningRequestMaxBatchSize: *checkCapacityProvisioningRequestMaxBatchSize,
		CheckCapacityProvisioningRequestBatchTimebox: *checkCapacityProvisioningRequestBatchTimebox,
		ForceDeleteLongUnregisteredNodes:             *forceDeleteLongUnregisteredNodes,
	}
}