add toleration match in rescheduling

Signed-off-by: changzhen <changzhen5@huawei.com>
This commit is contained in:
changzhen 2021-07-31 15:32:52 +08:00
parent 7a35aa069d
commit db441697e8
1 changed files with 27 additions and 17 deletions

View File

@ -19,6 +19,7 @@ import (
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue" "k8s.io/client-go/util/workqueue"
"k8s.io/klog/v2" "k8s.io/klog/v2"
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1" clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1" policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
@ -729,12 +730,14 @@ func (s *Scheduler) rescheduleResourceBinding(resourceBinding *workv1alpha1.Reso
return nil return nil
} }
func calcReservedCluster(total, ready sets.String) sets.String { // calcReservedCluster eliminates the not-ready clusters from the 'bindClusters'.
return total.Difference(total.Difference(ready)) func calcReservedCluster(bindClusters, readyClusters sets.String) sets.String {
return bindClusters.Difference(bindClusters.Difference(readyClusters))
} }
func calcAvailableCluster(total, ready sets.String) sets.String { // calcAvailableCluster returns a list of ready clusters that not in 'bindClusters'.
return ready.Difference(total) func calcAvailableCluster(bindCluster, readyClusters sets.String) sets.String {
return readyClusters.Difference(bindCluster)
} }
func (s *Scheduler) obtainTargetCluster(bindingClusters []workv1alpha1.TargetCluster, placement policyv1alpha1.Placement) (sets.String, error) { func (s *Scheduler) obtainTargetCluster(bindingClusters []workv1alpha1.TargetCluster, placement policyv1alpha1.Placement) (sets.String, error) {
@ -744,10 +747,13 @@ func (s *Scheduler) obtainTargetCluster(bindingClusters []workv1alpha1.TargetClu
reservedClusters := calcReservedCluster(totalClusters, readyClusters) reservedClusters := calcReservedCluster(totalClusters, readyClusters)
availableClusters := calcAvailableCluster(totalClusters, readyClusters) availableClusters := calcAvailableCluster(totalClusters, readyClusters)
filterPredicate := func(t *corev1.Taint) bool {
// now only interested in NoSchedule taint which means do not allow new resource to schedule onto the cluster unless they tolerate the taint
// todo: supprot NoExecute taint
return t.Effect == corev1.TaintEffectNoSchedule
}
candidateClusters := sets.NewString() candidateClusters := sets.NewString()
if placement.ClusterAffinity == nil {
candidateClusters.Insert(availableClusters.List()...)
} else {
for clusterName := range availableClusters { for clusterName := range availableClusters {
clusterObj, err := s.clusterLister.Get(clusterName) clusterObj, err := s.clusterLister.Get(clusterName)
if err != nil { if err != nil {
@ -755,9 +761,13 @@ func (s *Scheduler) obtainTargetCluster(bindingClusters []workv1alpha1.TargetClu
return nil, err return nil, err
} }
if util.ClusterMatches(clusterObj, *placement.ClusterAffinity) { if placement.ClusterAffinity != nil && !util.ClusterMatches(clusterObj, *placement.ClusterAffinity) {
candidateClusters.Insert(clusterName) continue
} }
_, isUntolerated := v1helper.FindMatchingUntoleratedTaint(clusterObj.Spec.Taints, placement.ClusterTolerations, filterPredicate)
if !isUntolerated {
candidateClusters.Insert(clusterName)
} }
} }