Merge pull request #131524 from carlory/automated-cherry-pick-of-#131495-release-1.32

Automated cherry pick of #131495: Handle unsupported node expansion for RWX volumes
This commit is contained in:
Kubernetes Prow Robot 2025-05-13 23:05:23 -07:00 committed by GitHub
commit 3f75cae603
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 0 deletions

View File

@ -144,6 +144,26 @@ func (ne *NodeExpander) expandOnPlugin() (bool, resource.Quantity, error) {
}
_, resizeErr := ne.volumePlugin.NodeExpand(ne.pluginResizeOpts)
if resizeErr != nil {
// In order to support node volume expansion for RWX volumes on different nodes,
// we bypass the check for VolumeExpansionPendingOnNode state during the pre-check
// and then directly call the NodeExpandVolume method on the plugin.
//
// However, it does not make sense where the csi driver does not support node expansion.
// We should not treat this as a failure. It is a workaround for this issue:
// https://github.com/kubernetes/kubernetes/issues/131381.
//
// For other access modes, we should not hit this state, because we will wait for
// VolumeExpansionPendingOnNode before trying to expand volume in kubelet.
// See runPreCheck() above.
//
// If volume is already expanded, then we should not retry expansion on the node if
// driver returns OperationNotSupportedError.
if volumetypes.IsOperationNotSupportedError(resizeErr) && ne.pvcAlreadyUpdated {
klog.V(4).InfoS(ne.vmt.GenerateMsgDetailed("MountVolume.NodeExpandVolume failed", "NodeExpandVolume not supported"), "pod", klog.KObj(ne.vmt.Pod))
ne.testStatus = testResponseData{assumeResizeFinished: true, resizeCalledOnPlugin: false}
return true, ne.pluginResizeOpts.NewSize, nil
}
if volumetypes.IsOperationFinishedError(resizeErr) {
var markFailedError error
ne.actualStateOfWorld.MarkVolumeExpansionFailedWithFinalError(ne.vmt.VolumeName)

View File

@ -151,6 +151,17 @@ func TestNodeExpander(t *testing.T) {
expectFinalErrors: false,
expectedStatusSize: resource.MustParse("2G"),
},
{
name: "RWX pv.spec.cap = pvc.status.cap, resizeStatus='', desiredSize > actualSize, reize_op=unsupported",
pvc: addAccessMode(getTestPVC(volumetesting.FailWithUnSupportedVolumeName, "2G", "2G", "2G", nil), v1.ReadWriteMany),
pv: getTestPV(volumetesting.FailWithUnSupportedVolumeName, "2G"),
expectError: false,
expectedResizeStatus: "",
expectResizeCall: false,
assumeResizeOpAsFinished: true,
expectFinalErrors: false,
expectedStatusSize: resource.MustParse("2G"),
},
}
for i := range tests {