defaults.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. Copyright 2014 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package defaults
  14. import (
  15. "k8s.io/klog"
  16. "k8s.io/apimachinery/pkg/util/sets"
  17. utilfeature "k8s.io/apiserver/pkg/util/feature"
  18. "k8s.io/kubernetes/pkg/features"
  19. "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
  20. "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
  21. "k8s.io/kubernetes/pkg/scheduler/factory"
  22. )
  23. const (
  24. // ClusterAutoscalerProvider defines the default autoscaler provider
  25. ClusterAutoscalerProvider = "ClusterAutoscalerProvider"
  26. )
  27. func init() {
  28. registerAlgorithmProvider(defaultPredicates(), defaultPriorities())
  29. }
  30. func defaultPredicates() sets.String {
  31. return sets.NewString(
  32. predicates.NoVolumeZoneConflictPred,
  33. predicates.MaxEBSVolumeCountPred,
  34. predicates.MaxGCEPDVolumeCountPred,
  35. predicates.MaxAzureDiskVolumeCountPred,
  36. predicates.MaxCSIVolumeCountPred,
  37. predicates.MatchInterPodAffinityPred,
  38. predicates.NoDiskConflictPred,
  39. predicates.GeneralPred,
  40. predicates.CheckNodeMemoryPressurePred,
  41. predicates.CheckNodeDiskPressurePred,
  42. predicates.CheckNodePIDPressurePred,
  43. predicates.CheckNodeConditionPred,
  44. predicates.PodToleratesNodeTaintsPred,
  45. predicates.CheckVolumeBindingPred,
  46. )
  47. }
  48. // ApplyFeatureGates applies algorithm by feature gates.
  49. func ApplyFeatureGates() {
  50. if utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition) {
  51. // Remove "CheckNodeCondition", "CheckNodeMemoryPressure", "CheckNodePIDPressure"
  52. // and "CheckNodeDiskPressure" predicates
  53. factory.RemoveFitPredicate(predicates.CheckNodeConditionPred)
  54. factory.RemoveFitPredicate(predicates.CheckNodeMemoryPressurePred)
  55. factory.RemoveFitPredicate(predicates.CheckNodeDiskPressurePred)
  56. factory.RemoveFitPredicate(predicates.CheckNodePIDPressurePred)
  57. // Remove key "CheckNodeCondition", "CheckNodeMemoryPressure", "CheckNodePIDPressure" and "CheckNodeDiskPressure"
  58. // from ALL algorithm provider
  59. // The key will be removed from all providers which in algorithmProviderMap[]
  60. // if you just want remove specific provider, call func RemovePredicateKeyFromAlgoProvider()
  61. factory.RemovePredicateKeyFromAlgorithmProviderMap(predicates.CheckNodeConditionPred)
  62. factory.RemovePredicateKeyFromAlgorithmProviderMap(predicates.CheckNodeMemoryPressurePred)
  63. factory.RemovePredicateKeyFromAlgorithmProviderMap(predicates.CheckNodeDiskPressurePred)
  64. factory.RemovePredicateKeyFromAlgorithmProviderMap(predicates.CheckNodePIDPressurePred)
  65. // Fit is determined based on whether a pod can tolerate all of the node's taints
  66. factory.RegisterMandatoryFitPredicate(predicates.PodToleratesNodeTaintsPred, predicates.PodToleratesNodeTaints)
  67. // Fit is determined based on whether a pod can tolerate unschedulable of node
  68. factory.RegisterMandatoryFitPredicate(predicates.CheckNodeUnschedulablePred, predicates.CheckNodeUnschedulablePredicate)
  69. // Insert Key "PodToleratesNodeTaints" and "CheckNodeUnschedulable" To All Algorithm Provider
  70. // The key will insert to all providers which in algorithmProviderMap[]
  71. // if you just want insert to specific provider, call func InsertPredicateKeyToAlgoProvider()
  72. factory.InsertPredicateKeyToAlgorithmProviderMap(predicates.PodToleratesNodeTaintsPred)
  73. factory.InsertPredicateKeyToAlgorithmProviderMap(predicates.CheckNodeUnschedulablePred)
  74. klog.Infof("TaintNodesByCondition is enabled, PodToleratesNodeTaints predicate is mandatory")
  75. }
  76. // Prioritizes nodes that satisfy pod's resource limits
  77. if utilfeature.DefaultFeatureGate.Enabled(features.ResourceLimitsPriorityFunction) {
  78. klog.Infof("Registering resourcelimits priority function")
  79. factory.RegisterPriorityFunction2(priorities.ResourceLimitsPriority, priorities.ResourceLimitsPriorityMap, nil, 1)
  80. // Register the priority function to specific provider too.
  81. factory.InsertPriorityKeyToAlgorithmProviderMap(factory.RegisterPriorityFunction2(priorities.ResourceLimitsPriority, priorities.ResourceLimitsPriorityMap, nil, 1))
  82. }
  83. }
  84. func registerAlgorithmProvider(predSet, priSet sets.String) {
  85. // Registers algorithm providers. By default we use 'DefaultProvider', but user can specify one to be used
  86. // by specifying flag.
  87. factory.RegisterAlgorithmProvider(factory.DefaultProvider, predSet, priSet)
  88. // Cluster autoscaler friendly scheduling algorithm.
  89. factory.RegisterAlgorithmProvider(ClusterAutoscalerProvider, predSet,
  90. copyAndReplace(priSet, priorities.LeastRequestedPriority, priorities.MostRequestedPriority))
  91. }
  92. func defaultPriorities() sets.String {
  93. return sets.NewString(
  94. priorities.SelectorSpreadPriority,
  95. priorities.InterPodAffinityPriority,
  96. priorities.LeastRequestedPriority,
  97. priorities.BalancedResourceAllocation,
  98. priorities.NodePreferAvoidPodsPriority,
  99. priorities.NodeAffinityPriority,
  100. priorities.TaintTolerationPriority,
  101. priorities.ImageLocalityPriority,
  102. priorities.CustomRequestedPriority,
  103. )
  104. }
  105. func copyAndReplace(set sets.String, replaceWhat, replaceWith string) sets.String {
  106. result := sets.NewString(set.List()...)
  107. if result.Has(replaceWhat) {
  108. result.Delete(replaceWhat)
  109. result.Insert(replaceWith)
  110. }
  111. return result
  112. }