
Automatic merge from submit-queue Run mount in its own systemd scope. Kubelet needs to run /bin/mount in its own cgroup. - When kubelet runs as a systemd service, "systemctl restart kubelet" may kill all processes in the same cgroup and thus terminate fuse daemons that are needed for gluster and cephfs mounts. - When kubelet runs in a docker container, restart of the container kills all fuse daemons started in the container. Killing fuse daemons is bad, it basically unmounts volumes from running pods. This patch runs mount via "systemd-run --scope /bin/mount ...", which makes sure that any fuse daemons are forked in its own systemd scope (= cgroup) and they will survive restart of kubelet's systemd service or docker container. This helps with #34965 As a downside, each new fuse daemon will run in its own transient systemd service and systemctl output may be cluttered. @kubernetes/sig-storage-pr-reviews @kubernetes/sig-node-pr-reviews ```release-note fuse daemons for GlusterFS and CephFS are now run in their own systemd scope when Kubernetes runs on a system with systemd. ```
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
// +build !linux
|
|
|
|
/*
|
|
Copyright 2014 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package mount
|
|
|
|
type Mounter struct {
|
|
mounterPath string
|
|
}
|
|
|
|
// New returns a mount.Interface for the current system.
|
|
// It provides options to override the default mounter behavior.
|
|
// mounterPath allows using an alternative to `/bin/mount` for mounting.
|
|
func New(mounterPath string) Interface {
|
|
return &Mounter{
|
|
mounterPath: mounterPath,
|
|
}
|
|
}
|
|
|
|
func (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error {
|
|
return nil
|
|
}
|
|
|
|
func (mounter *Mounter) Unmount(target string) error {
|
|
return nil
|
|
}
|
|
|
|
func (mounter *Mounter) List() ([]MountPoint, error) {
|
|
return []MountPoint{}, nil
|
|
}
|
|
|
|
func (mounter *Mounter) IsMountPointMatch(mp MountPoint, dir string) bool {
|
|
return (mp.Path == dir)
|
|
}
|
|
|
|
func (mounter *Mounter) IsNotMountPoint(dir string) (bool, error) {
|
|
return IsNotMountPoint(mounter, dir)
|
|
}
|
|
|
|
func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) {
|
|
return true, nil
|
|
}
|
|
|
|
func (mounter *Mounter) GetDeviceNameFromMount(mountPath, pluginDir string) (string, error) {
|
|
return "", nil
|
|
}
|
|
|
|
func (mounter *Mounter) DeviceOpened(pathname string) (bool, error) {
|
|
return false, nil
|
|
}
|
|
|
|
func (mounter *Mounter) PathIsDevice(pathname string) (bool, error) {
|
|
return true, nil
|
|
}
|
|
|
|
func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, fstype string, options []string) error {
|
|
return nil
|
|
}
|
|
|
|
func (mounter *SafeFormatAndMount) diskLooksUnformatted(disk string) (bool, error) {
|
|
return true, nil
|
|
}
|