Make kubelet never delete files on mounted filesystems

With bug #27653, kubelet could remove mounted volumes and delete user data.
The bug itself is fixed, however our trust in kubelet is significantly lower.
Let's add an extra version of RemoveAll that does not cross mount boundary
(rm -rf --one-file-system).

It calls lstat(path) three times for each removed directory - once in
RemoveAllOneFilesystem and twice in IsLikelyNotMountPoint, however this way
it's platform independent and the directory that is being removed by kubelet
should be almost empty.
This commit is contained in:
Jan Safranek
2017-02-28 14:32:07 +01:00
parent d33f6b8a17
commit d7d039dba2
6 changed files with 309 additions and 2 deletions

View File

@@ -97,6 +97,7 @@ go_library(
"//pkg/util/node:go_default_library",
"//pkg/util/oom:go_default_library",
"//pkg/util/procfs:go_default_library",
"//pkg/util/removeall:go_default_library",
"//pkg/util/term:go_default_library",
"//pkg/version:go_default_library",
"//pkg/volume:go_default_library",

View File

@@ -18,7 +18,6 @@ package kubelet
import (
"fmt"
"os"
"github.com/golang/glog"
"k8s.io/apimachinery/pkg/types"
@@ -26,6 +25,7 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/pkg/api/v1"
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util/removeall"
"k8s.io/kubernetes/pkg/volume"
volumetypes "k8s.io/kubernetes/pkg/volume/util/types"
)
@@ -115,7 +115,7 @@ func (kl *Kubelet) cleanupOrphanedPodDirs(
continue
}
glog.V(3).Infof("Orphaned pod %q found, removing", uid)
if err := os.RemoveAll(kl.getPodDir(uid)); err != nil {
if err := removeall.RemoveAllOneFilesystem(kl.mounter, kl.getPodDir(uid)); err != nil {
glog.Errorf("Failed to remove orphaned pod %q dir; err: %v", uid, err)
errlist = append(errlist, err)
}