From 73a0083a8449f2afe816f183dedcc0ade914cfde Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Thu, 2 Feb 2017 17:32:02 +0100 Subject: [PATCH] Add scheduler predicate to filter for max Azure disks attached --- .../algorithm/predicates/predicates.go | 17 +++++++++++++++++ .../defaults/compatibility_test.go | 6 ++++++ .../algorithmprovider/defaults/defaults.go | 17 ++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index cc6b2dd5f3..fe5c0b4159 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -349,6 +349,23 @@ var GCEPDVolumeFilter VolumeFilter = VolumeFilter{ }, } +// AzureDiskVolumeFilter is a VolumeFilter for filtering Azure Disk Volumes +var AzureDiskVolumeFilter VolumeFilter = VolumeFilter{ + FilterVolume: func(vol *v1.Volume) (string, bool) { + if vol.AzureDisk != nil { + return vol.AzureDisk.DiskName, true + } + return "", false + }, + + FilterPersistentVolume: func(pv *v1.PersistentVolume) (string, bool) { + if pv.Spec.AzureDisk != nil { + return pv.Spec.AzureDisk.DiskName, true + } + return "", false + }, +} + type VolumeZoneChecker struct { pvInfo PersistentVolumeInfo pvcInfo PersistentVolumeClaimInfo diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go index 5193a34d14..fc87095a13 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go @@ -138,6 +138,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "NoVolumeZoneConflict"}, {"name": "MaxEBSVolumeCount"}, {"name": "MaxGCEPDVolumeCount"}, + {"name": "MaxAzureDiskVolumeCount"}, {"name": "TestServiceAffinity", "argument": {"serviceAffinity" : {"labels" : ["region"]}}}, {"name": "TestLabelsPresence", "argument": {"labelsPresence" : {"labels" : ["foo"], "presence":true}}} ],"priorities": [ @@ -161,6 +162,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "NoVolumeZoneConflict"}, {Name: "MaxEBSVolumeCount"}, {Name: "MaxGCEPDVolumeCount"}, + {Name: "MaxAzureDiskVolumeCount"}, {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, }, @@ -194,6 +196,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "CheckNodeMemoryPressure"}, {"name": "MaxEBSVolumeCount"}, {"name": "MaxGCEPDVolumeCount"}, + {"name": "MaxAzureDiskVolumeCount"}, {"name": "MatchInterPodAffinity"}, {"name": "GeneralPredicates"}, {"name": "TestServiceAffinity", "argument": {"serviceAffinity" : {"labels" : ["region"]}}}, @@ -221,6 +224,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "CheckNodeMemoryPressure"}, {Name: "MaxEBSVolumeCount"}, {Name: "MaxGCEPDVolumeCount"}, + {Name: "MaxAzureDiskVolumeCount"}, {Name: "MatchInterPodAffinity"}, {Name: "GeneralPredicates"}, {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, @@ -257,6 +261,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "CheckNodeDiskPressure"}, {"name": "MaxEBSVolumeCount"}, {"name": "MaxGCEPDVolumeCount"}, + {"name": "MaxAzureDiskVolumeCount"}, {"name": "MatchInterPodAffinity"}, {"name": "GeneralPredicates"}, {"name": "TestServiceAffinity", "argument": {"serviceAffinity" : {"labels" : ["region"]}}}, @@ -287,6 +292,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {Name: "CheckNodeDiskPressure"}, {Name: "MaxEBSVolumeCount"}, {Name: "MaxGCEPDVolumeCount"}, + {Name: "MaxAzureDiskVolumeCount"}, {Name: "MatchInterPodAffinity"}, {Name: "GeneralPredicates"}, {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go index 382424b565..e7c9a148ce 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go @@ -36,9 +36,11 @@ import ( const ( // GCE instances can have up to 16 PD volumes attached. - DefaultMaxGCEPDVolumes = 16 - ClusterAutoscalerProvider = "ClusterAutoscalerProvider" - StatefulSetKind = "StatefulSet" + DefaultMaxGCEPDVolumes = 16 + // Larger Azure VMs can actually have much more disks attached. TODO We should determine the max based on VM size + DefaultMaxAzureDiskVolumes = 16 + ClusterAutoscalerProvider = "ClusterAutoscalerProvider" + StatefulSetKind = "StatefulSet" ) func init() { @@ -136,6 +138,15 @@ func defaultPredicates() sets.String { return predicates.NewMaxPDVolumeCountPredicate(predicates.GCEPDVolumeFilter, maxVols, args.PVInfo, args.PVCInfo) }, ), + // Fit is determined by whether or not there would be too many Azure Disk volumes attached to the node + factory.RegisterFitPredicateFactory( + "MaxAzureDiskVolumeCount", + func(args factory.PluginFactoryArgs) algorithm.FitPredicate { + // TODO: allow for generically parameterized scheduler predicates, because this is a bit ugly + maxVols := getMaxVols(DefaultMaxAzureDiskVolumes) + return predicates.NewMaxPDVolumeCountPredicate(predicates.AzureDiskVolumeFilter, maxVols, args.PVInfo, args.PVCInfo) + }, + ), // Fit is determined by inter-pod affinity. factory.RegisterFitPredicateFactory( "MatchInterPodAffinity",