mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Return no volume match if prebound PV node affinity doesn't match node
This commit is contained in:
parent
2aeace402a
commit
c26debecef
@ -169,12 +169,13 @@ func findMatchingVolume(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nodeAffinityValid := true
|
||||||
if node != nil {
|
if node != nil {
|
||||||
// Scheduler path, check that the PV NodeAffinity
|
// Scheduler path, check that the PV NodeAffinity
|
||||||
// is satisfied by the node
|
// is satisfied by the node
|
||||||
err := volumeutil.CheckNodeAffinity(volume, node.Labels)
|
err := volumeutil.CheckNodeAffinity(volume, node.Labels)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
nodeAffinityValid = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,6 +186,14 @@ func findMatchingVolume(
|
|||||||
if volumeQty.Cmp(requestedQty) < 0 {
|
if volumeQty.Cmp(requestedQty) < 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If PV node affinity is invalid, return no match.
|
||||||
|
// This means the prebound PV (and therefore PVC)
|
||||||
|
// is not suitable for this node.
|
||||||
|
if !nodeAffinityValid {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
return volume, nil
|
return volume, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,6 +208,7 @@ func findMatchingVolume(
|
|||||||
// - volumes bound to another claim
|
// - volumes bound to another claim
|
||||||
// - volumes whose labels don't match the claim's selector, if specified
|
// - volumes whose labels don't match the claim's selector, if specified
|
||||||
// - volumes in Class that is not requested
|
// - volumes in Class that is not requested
|
||||||
|
// - volumes whose NodeAffinity does not match the node
|
||||||
if volume.Spec.ClaimRef != nil {
|
if volume.Spec.ClaimRef != nil {
|
||||||
continue
|
continue
|
||||||
} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) {
|
} else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) {
|
||||||
@ -207,6 +217,9 @@ func findMatchingVolume(
|
|||||||
if v1helper.GetPersistentVolumeClass(volume) != requestedClass {
|
if v1helper.GetPersistentVolumeClass(volume) != requestedClass {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if !nodeAffinityValid {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if node != nil {
|
if node != nil {
|
||||||
// Scheduler path
|
// Scheduler path
|
||||||
|
@ -1218,7 +1218,7 @@ func TestFindMatchVolumeWithNode(t *testing.T) {
|
|||||||
pvc.Spec.StorageClassName = &classWait
|
pvc.Spec.StorageClassName = &classWait
|
||||||
pvc.Name = "claim02"
|
pvc.Name = "claim02"
|
||||||
}),
|
}),
|
||||||
node: node2,
|
node: node3,
|
||||||
},
|
},
|
||||||
"success-bad-and-good-node-affinity": {
|
"success-bad-and-good-node-affinity": {
|
||||||
expectedMatch: "affinity-pv3",
|
expectedMatch: "affinity-pv3",
|
||||||
|
@ -1475,12 +1475,12 @@ func (c *VolumeBindingChecker) predicate(pod *v1.Pod, meta algorithm.PredicateMe
|
|||||||
|
|
||||||
failReasons := []algorithm.PredicateFailureReason{}
|
failReasons := []algorithm.PredicateFailureReason{}
|
||||||
if !boundSatisfied {
|
if !boundSatisfied {
|
||||||
glog.V(5).Info("Bound PVs not satisfied for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
glog.V(5).Infof("Bound PVs not satisfied for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
||||||
failReasons = append(failReasons, ErrVolumeNodeConflict)
|
failReasons = append(failReasons, ErrVolumeNodeConflict)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !unboundSatisfied {
|
if !unboundSatisfied {
|
||||||
glog.V(5).Info("Couldn't find matching PVs for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
glog.V(5).Infof("Couldn't find matching PVs for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
||||||
failReasons = append(failReasons, ErrVolumeBindConflict)
|
failReasons = append(failReasons, ErrVolumeBindConflict)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1489,6 +1489,6 @@ func (c *VolumeBindingChecker) predicate(pod *v1.Pod, meta algorithm.PredicateMe
|
|||||||
}
|
}
|
||||||
|
|
||||||
// All volumes bound or matching PVs found for all unbound PVCs
|
// All volumes bound or matching PVs found for all unbound PVCs
|
||||||
glog.V(5).Info("All PVCs found matches for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
glog.V(5).Infof("All PVCs found matches for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name)
|
||||||
return true, nil, nil
|
return true, nil, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user