-
Notifications
You must be signed in to change notification settings - Fork 38.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Distinguish between volume path and mount path #74653
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -341,7 +341,7 @@ func (rc *reconciler) StatesHasBeenSynced() bool { | |
type podVolume struct { | ||
podName volumetypes.UniquePodName | ||
volumeSpecName string | ||
mountPath string | ||
volumePath string | ||
pluginName string | ||
volumeMode v1.PersistentVolumeMode | ||
} | ||
|
@@ -477,7 +477,7 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, | |
pod.UID, | ||
volume.podName, | ||
volume.volumeSpecName, | ||
volume.mountPath, | ||
volume.volumePath, | ||
volume.pluginName) | ||
if err != nil { | ||
return nil, err | ||
|
@@ -492,15 +492,6 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, | |
} else { | ||
uniqueVolumeName = util.GetUniqueVolumeNameFromSpecWithPod(volume.podName, plugin, volumeSpec) | ||
} | ||
// Check existence of mount point for filesystem volume or symbolic link for block volume | ||
isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volume.mountPath, volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) | ||
if checkErr != nil { | ||
return nil, checkErr | ||
} | ||
// If mount or symlink doesn't exist, volume reconstruction should be failed | ||
if !isExist { | ||
return nil, fmt.Errorf("Volume: %q is not mounted", uniqueVolumeName) | ||
} | ||
|
||
volumeMounter, newMounterErr := plugin.NewMounter( | ||
volumeSpec, | ||
|
@@ -516,6 +507,16 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, | |
newMounterErr) | ||
} | ||
|
||
// Check existence of mount point for filesystem volume or symbolic link for block volume | ||
isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volumeMounter.GetPath(), volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) | ||
if checkErr != nil { | ||
return nil, checkErr | ||
} | ||
// If mount or symlink doesn't exist, volume reconstruction should be failed | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jingxu97 can this check be removed? This means that the directory still exists and should be cleaned up. Also this assumes that all volumes use mounts, which is not necessarily true (esp for ephemeral types). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For reference, this is the PR that introduced this check. Reading through the original bug and discussion, I'm not sure how this fix actually addresses the original issue... cc @chakri-nelluri There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok @jingxu97 and I discussed and I understand now. If the volume was partially torn down (ie the mount point is gone, but the directory still exists), then we don't want reconstruction to add the volume back to the ASW (because it's actually not mounted) and cause an empty directory to be mounted into the pod. Let's update the comment here to make that reason more obvious. However, this brings up some other issues:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
@msau42 This code is conditional and was only meant for plugins which support attach and needs to be reattached and mounted on a node reboot. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Block devices? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
@msau42 This might show up if we restart Kubelet to recover for any other issues.. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This CheckVolumeExistance function does handle raw block, although I wonder if it possible to the link to change across reboots? I think this is what the losetup is supposed to protect against. cc @wongma7 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. only kubelet manipulates these links, technically it can change but so can a mount device (we check that a mount point exists only, not if it points to the right thing). (losetup doesn't help here as the failure scenario the losetup code is intended to prevent is something different like: volume at /dev/sda somehow gets attached then another volume gets attached at /dev/sda, silently. The loop device holding onto /dev/sda is supposed to prevent detach from happening at all. If there's a reboot, I don't believe the loop devices persist anyhow.) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should test the reboot behavior for raw block separately to make sure we're not going to accidentally give the wrong device to container if the device names change on a reboot. |
||
if !isExist { | ||
return nil, fmt.Errorf("Volume: %q is not mounted", uniqueVolumeName) | ||
} | ||
|
||
// TODO: remove feature gate check after no longer needed | ||
var volumeMapper volumepkg.BlockVolumeMapper | ||
if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) && volume.volumeMode == v1.PersistentVolumeBlock { | ||
|
@@ -680,12 +681,12 @@ func getVolumesFromPodDir(podDir string) ([]podVolume, error) { | |
} | ||
unescapePluginName := utilstrings.UnescapeQualifiedName(pluginName) | ||
for _, volumeName := range volumePluginDirs { | ||
mountPath := path.Join(volumePluginPath, volumeName) | ||
klog.V(5).Infof("podName: %v, mount path from volume plugin directory: %v, ", podName, mountPath) | ||
volumePath := path.Join(volumePluginPath, volumeName) | ||
klog.V(5).Infof("podName: %v, volume path from volume plugin directory: %v, ", podName, volumePath) | ||
volumes = append(volumes, podVolume{ | ||
podName: volumetypes.UniquePodName(podName), | ||
volumeSpecName: volumeName, | ||
mountPath: mountPath, | ||
volumePath: volumePath, | ||
pluginName: unescapePluginName, | ||
volumeMode: volumeMode, | ||
}) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you update comment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment describes how
CheckVolumeExistenceOperation
works internally to check volume existence. It's correct.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think @saad-ali means to add a comment about the change? Instead of using volume.volumePath, we need to use volumeMounter.GetPath() because the mount point setup is different for different plugins. We have to be careful about this when adding/modifying code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh, sorry, because it's already merged, we can add it later.