Skip to content

Commit f105fef

Browse files
authored
Merge pull request kubernetes#81429 from huffmanca/resize_block_volume
Enables resizing of block volumes.
2 parents 5ced737 + 9dbe0b3 commit f105fef

File tree

13 files changed

+511
-333
lines changed

13 files changed

+511
-333
lines changed

pkg/kubelet/volumemanager/populator/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ go_library(
1111
srcs = ["desired_state_of_world_populator.go"],
1212
importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator",
1313
deps = [
14-
"//pkg/api/v1/pod:go_default_library",
1514
"//pkg/features:go_default_library",
1615
"//pkg/kubelet/config:go_default_library",
1716
"//pkg/kubelet/container:go_default_library",

pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"k8s.io/apimachinery/pkg/util/wait"
3636
utilfeature "k8s.io/apiserver/pkg/util/feature"
3737
clientset "k8s.io/client-go/kubernetes"
38-
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
3938
"k8s.io/kubernetes/pkg/features"
4039
"k8s.io/kubernetes/pkg/kubelet/config"
4140
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
@@ -384,22 +383,15 @@ func (dswp *desiredStateOfWorldPopulator) checkVolumeFSResize(
384383
// or online resize in subsequent loop(after we confirm it has been mounted).
385384
return
386385
}
387-
fsVolume, err := util.CheckVolumeModeFilesystem(volumeSpec)
388-
if err != nil {
389-
klog.Errorf("Check volume mode failed for volume %s(OuterVolumeSpecName %s): %v",
390-
uniqueVolumeName, podVolume.Name, err)
391-
return
392-
}
393-
if !fsVolume {
394-
klog.V(5).Infof("Block mode volume needn't to check file system resize request")
395-
return
396-
}
397386
if processedVolumesForFSResize.Has(string(uniqueVolumeName)) {
398387
// File system resize operation is a global operation for volume,
399388
// so we only need to check it once if more than one pod use it.
400389
return
401390
}
402-
if mountedReadOnlyByPod(podVolume, pod) {
391+
// volumeSpec.ReadOnly is the value that determines if volume could be formatted when being mounted.
392+
// This is the same flag that determines filesystem resizing behaviour for offline resizing and hence
393+
// we should use it here. This value comes from Pod.spec.volumes.persistentVolumeClaim.readOnly.
394+
if volumeSpec.ReadOnly {
403395
// This volume is used as read only by this pod, we don't perform resize for read only volumes.
404396
klog.V(5).Infof("Skip file system resize check for volume %s in pod %s/%s "+
405397
"as the volume is mounted as readonly", podVolume.Name, pod.Namespace, pod.Name)
@@ -411,28 +403,6 @@ func (dswp *desiredStateOfWorldPopulator) checkVolumeFSResize(
411403
processedVolumesForFSResize.Insert(string(uniqueVolumeName))
412404
}
413405

414-
func mountedReadOnlyByPod(podVolume v1.Volume, pod *v1.Pod) bool {
415-
if podVolume.PersistentVolumeClaim.ReadOnly {
416-
return true
417-
}
418-
419-
return podutil.VisitContainers(&pod.Spec, func(c *v1.Container) bool {
420-
if !mountedReadOnlyByContainer(podVolume.Name, c) {
421-
return false
422-
}
423-
return true
424-
})
425-
}
426-
427-
func mountedReadOnlyByContainer(volumeName string, container *v1.Container) bool {
428-
for _, volumeMount := range container.VolumeMounts {
429-
if volumeMount.Name == volumeName && !volumeMount.ReadOnly {
430-
return false
431-
}
432-
}
433-
return true
434-
}
435-
436406
func getUniqueVolumeName(
437407
podName volumetypes.UniquePodName,
438408
outerVolumeSpecName string,

pkg/kubelet/volumemanager/populator/desired_state_of_world_populator_test.go

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,6 @@ func TestCreateVolumeSpec_Invalid_Block_VolumeMounts(t *testing.T) {
568568
}
569569

570570
func TestCheckVolumeFSResize(t *testing.T) {
571-
mode := v1.PersistentVolumeFilesystem
572-
573571
setCapacity := func(pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim, capacity int) {
574572
pv.Spec.Capacity = volumeCapacity(capacity)
575573
pvc.Spec.Resources.Requests = volumeCapacity(capacity)
@@ -580,6 +578,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
580578
verify func(*testing.T, []v1.UniqueVolumeName, v1.UniqueVolumeName)
581579
enableResize bool
582580
readOnlyVol bool
581+
volumeMode v1.PersistentVolumeMode
583582
}{
584583
{
585584
// No resize request for volume, volumes in ASW shouldn't be marked as fsResizeRequired
@@ -591,6 +590,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
591590
}
592591
},
593592
enableResize: true,
593+
volumeMode: v1.PersistentVolumeFilesystem,
594594
},
595595
{
596596
// Disable the feature gate, so volume shouldn't be marked as fsResizeRequired
@@ -603,6 +603,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
603603
}
604604
},
605605
enableResize: false,
606+
volumeMode: v1.PersistentVolumeFilesystem,
606607
},
607608
{
608609
// Make volume used as ReadOnly, so volume shouldn't be marked as fsResizeRequired
@@ -616,6 +617,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
616617
},
617618
readOnlyVol: true,
618619
enableResize: true,
620+
volumeMode: v1.PersistentVolumeFilesystem,
619621
},
620622
{
621623
// Clear ASW, so volume shouldn't be marked as fsResizeRequired because they are not mounted
@@ -629,6 +631,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
629631
}
630632
},
631633
enableResize: true,
634+
volumeMode: v1.PersistentVolumeFilesystem,
632635
},
633636
{
634637
// volume in ASW should be marked as fsResizeRequired
@@ -647,6 +650,26 @@ func TestCheckVolumeFSResize(t *testing.T) {
647650
}
648651
},
649652
enableResize: true,
653+
volumeMode: v1.PersistentVolumeFilesystem,
654+
},
655+
{
656+
// volume in ASW should be marked as fsResizeRequired
657+
resize: func(_ *testing.T, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim, _ *desiredStateOfWorldPopulator) {
658+
setCapacity(pv, pvc, 2)
659+
},
660+
verify: func(t *testing.T, vols []v1.UniqueVolumeName, volName v1.UniqueVolumeName) {
661+
if len(vols) == 0 {
662+
t.Fatalf("Request resize for volume, but volume in ASW hasn't been marked as fsResizeRequired")
663+
}
664+
if len(vols) != 1 {
665+
t.Errorf("Some unexpected volumes are marked as fsResizeRequired: %v", vols)
666+
}
667+
if vols[0] != volName {
668+
t.Fatalf("Mark wrong volume as fsResizeRequired: %s", vols[0])
669+
}
670+
},
671+
enableResize: true,
672+
volumeMode: v1.PersistentVolumeBlock,
650673
},
651674
}
652675

@@ -659,7 +682,7 @@ func TestCheckVolumeFSResize(t *testing.T) {
659682
PersistentVolumeSource: v1.PersistentVolumeSource{RBD: &v1.RBDPersistentVolumeSource{}},
660683
Capacity: volumeCapacity(1),
661684
ClaimRef: &v1.ObjectReference{Namespace: "ns", Name: "file-bound"},
662-
VolumeMode: &mode,
685+
VolumeMode: &tc.volumeMode,
663686
},
664687
}
665688
pvc := &v1.PersistentVolumeClaim{
@@ -677,20 +700,31 @@ func TestCheckVolumeFSResize(t *testing.T) {
677700

678701
dswp, fakePodManager, fakeDSW := createDswpWithVolume(t, pv, pvc)
679702
fakeASW := dswp.actualStateOfWorld
703+
containers := []v1.Container{}
680704

681-
// create pod
682-
containers := []v1.Container{
683-
{
705+
if tc.volumeMode == v1.PersistentVolumeFilesystem {
706+
containers = append(containers, v1.Container{
684707
VolumeMounts: []v1.VolumeMount{
685708
{
686709
Name: pv.Name,
687710
MountPath: "/mnt",
688711
ReadOnly: tc.readOnlyVol,
689712
},
690713
},
691-
},
714+
})
715+
} else {
716+
containers = append(containers, v1.Container{
717+
VolumeDevices: []v1.VolumeDevice{
718+
{
719+
Name: pv.Name,
720+
DevicePath: "/mnt/foobar",
721+
},
722+
},
723+
})
692724
}
725+
693726
pod := createPodWithVolume("dswp-test-pod", "dswp-test-volume-name", "file-bound", containers)
727+
pod.Spec.Volumes[0].VolumeSource.PersistentVolumeClaim.ReadOnly = tc.readOnlyVol
694728
uniquePodName := types.UniquePodName(pod.UID)
695729
uniqueVolumeName := v1.UniqueVolumeName("fake-plugin/" + pod.Spec.Volumes[0].Name)
696730

0 commit comments

Comments
 (0)