Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
12b9da8f
Commit
12b9da8f
authored
Jul 31, 2015
by
Mike Danese
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9976 from smarterclayton/nsenter_mount_broken
Fix mount issues in containerized Kubelet
parents
b56edd13
93b14b9e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
65 additions
and
16 deletions
+65
-16
server.go
cmd/kubelet/app/server.go
+1
-1
nsenter_mount.go
pkg/util/mount/nsenter_mount.go
+60
-15
nsenter_mount_unsupported.go
pkg/util/mount/nsenter_mount_unsupported.go
+4
-0
No files found.
cmd/kubelet/app/server.go
View file @
12b9da8f
...
@@ -319,7 +319,7 @@ func (s *KubeletServer) Run(_ []string) error {
...
@@ -319,7 +319,7 @@ func (s *KubeletServer) Run(_ []string) error {
mounter
:=
mount
.
New
()
mounter
:=
mount
.
New
()
if
s
.
Containerized
{
if
s
.
Containerized
{
glog
.
V
(
2
)
.
Info
(
"Running kubelet in containerized mode (experimental)"
)
glog
.
V
(
2
)
.
Info
(
"Running kubelet in containerized mode (experimental)"
)
mounter
=
&
mount
.
NsenterMounter
{}
mounter
=
mount
.
NewNsenterMounter
()
}
}
var
dockerExecHandler
dockertools
.
ExecHandler
var
dockerExecHandler
dockertools
.
ExecHandler
...
...
pkg/util/mount/nsenter_mount.go
View file @
12b9da8f
...
@@ -19,6 +19,7 @@ limitations under the License.
...
@@ -19,6 +19,7 @@ limitations under the License.
package
mount
package
mount
import
(
import
(
"os"
"path/filepath"
"path/filepath"
"strings"
"strings"
...
@@ -39,14 +40,48 @@ import (
...
@@ -39,14 +40,48 @@ import (
// performed in the host's mount namespace do not propagate out to the
// performed in the host's mount namespace do not propagate out to the
// bind-mount in this docker version.
// bind-mount in this docker version.
// 2. The host's root filesystem must be available at /rootfs
// 2. The host's root filesystem must be available at /rootfs
// 3. The nsenter binary must be at /nsenter in the container's filesystem.
// 3. The nsenter binary must be on the Kubelet process' PATH in the container's
// filesystem.
// 4. The Kubelet process must have CAP_SYS_ADMIN (required by nsenter); at
// 4. The Kubelet process must have CAP_SYS_ADMIN (required by nsenter); at
// the present, this effectively means that the kubelet is running in a
// the present, this effectively means that the kubelet is running in a
// privileged container.
// privileged container.
// 5. The volume path used by the Kubelet must be the same inside and outside
// the container and be writable by the container (to initialize volume)
// contents. TODO: remove this requirement.
// 6. The host image must have mount, findmnt, and umount binaries in /bin,
// /usr/sbin, or /usr/bin
//
//
// For more information about mount propagation modes, see:
// For more information about mount propagation modes, see:
// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
type
NsenterMounter
struct
{}
type
NsenterMounter
struct
{
// a map of commands to their paths on the host filesystem
paths
map
[
string
]
string
}
func
NewNsenterMounter
()
*
NsenterMounter
{
m
:=
&
NsenterMounter
{
paths
:
map
[
string
]
string
{
"mount"
:
""
,
"findmnt"
:
""
,
"umount"
:
""
,
},
}
// search for the mount command in other locations besides /usr/bin
for
binary
:=
range
m
.
paths
{
// default to root
m
.
paths
[
binary
]
=
filepath
.
Join
(
"/"
,
binary
)
for
_
,
path
:=
range
[]
string
{
"/bin"
,
"/usr/sbin"
,
"/usr/bin"
}
{
binPath
:=
filepath
.
Join
(
hostRootFsPath
,
path
,
binary
)
if
_
,
err
:=
os
.
Stat
(
binPath
);
err
!=
nil
{
continue
}
m
.
paths
[
binary
]
=
binPath
break
}
// TODO: error, so that the kubelet can stop if the mounts don't exist
}
return
m
}
// NsenterMounter implements mount.Interface
// NsenterMounter implements mount.Interface
var
_
=
Interface
(
&
NsenterMounter
{})
var
_
=
Interface
(
&
NsenterMounter
{})
...
@@ -54,30 +89,30 @@ var _ = Interface(&NsenterMounter{})
...
@@ -54,30 +89,30 @@ var _ = Interface(&NsenterMounter{})
const
(
const
(
hostRootFsPath
=
"/rootfs"
hostRootFsPath
=
"/rootfs"
hostProcMountsPath
=
"/rootfs/proc/mounts"
hostProcMountsPath
=
"/rootfs/proc/mounts"
nsenterPath
=
"
/
nsenter"
nsenterPath
=
"nsenter"
)
)
// Mount runs mount(8) in the host's root mount namespace. Aside from this
// Mount runs mount(8) in the host's root mount namespace. Aside from this
// aspect, Mount has the same semantics as the mounter returned by mount.New()
// aspect, Mount has the same semantics as the mounter returned by mount.New()
func
(
*
NsenterMounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
options
[]
string
)
error
{
func
(
n
*
NsenterMounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
options
[]
string
)
error
{
bind
,
bindRemountOpts
:=
isBind
(
options
)
bind
,
bindRemountOpts
:=
isBind
(
options
)
if
bind
{
if
bind
{
err
:=
doNsenterMount
(
source
,
target
,
fstype
,
[]
string
{
"bind"
})
err
:=
n
.
doNsenterMount
(
source
,
target
,
fstype
,
[]
string
{
"bind"
})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
return
doNsenterMount
(
source
,
target
,
fstype
,
bindRemountOpts
)
return
n
.
doNsenterMount
(
source
,
target
,
fstype
,
bindRemountOpts
)
}
}
return
doNsenterMount
(
source
,
target
,
fstype
,
options
)
return
n
.
doNsenterMount
(
source
,
target
,
fstype
,
options
)
}
}
// doNsenterMount nsenters the host's mount namespace and performs the
// doNsenterMount nsenters the host's mount namespace and performs the
// requested mount.
// requested mount.
func
doNsenterMount
(
source
,
target
,
fstype
string
,
options
[]
string
)
error
{
func
(
n
*
NsenterMounter
)
doNsenterMount
(
source
,
target
,
fstype
string
,
options
[]
string
)
error
{
glog
.
V
(
5
)
.
Infof
(
"nsenter Mounting %s %s %s %v"
,
source
,
target
,
fstype
,
options
)
glog
.
V
(
5
)
.
Infof
(
"nsenter Mounting %s %s %s %v"
,
source
,
target
,
fstype
,
options
)
args
:=
makeNsenterArgs
(
source
,
target
,
fstype
,
options
)
args
:=
n
.
makeNsenterArgs
(
source
,
target
,
fstype
,
options
)
glog
.
V
(
5
)
.
Infof
(
"Mount command: %v %v"
,
nsenterPath
,
args
)
glog
.
V
(
5
)
.
Infof
(
"Mount command: %v %v"
,
nsenterPath
,
args
)
exec
:=
exec
.
New
()
exec
:=
exec
.
New
()
...
@@ -91,10 +126,11 @@ func doNsenterMount(source, target, fstype string, options []string) error {
...
@@ -91,10 +126,11 @@ func doNsenterMount(source, target, fstype string, options []string) error {
// makeNsenterArgs makes a list of argument to nsenter in order to do the
// makeNsenterArgs makes a list of argument to nsenter in order to do the
// requested mount.
// requested mount.
func
makeNsenterArgs
(
source
,
target
,
fstype
string
,
options
[]
string
)
[]
string
{
func
(
n
*
NsenterMounter
)
makeNsenterArgs
(
source
,
target
,
fstype
string
,
options
[]
string
)
[]
string
{
nsenterArgs
:=
[]
string
{
nsenterArgs
:=
[]
string
{
"--mount=/rootfs/proc/1/ns/mnt"
,
"--mount=/rootfs/proc/1/ns/mnt"
,
"/usr/bin/mount"
,
"--"
,
n
.
absHostPath
(
"mount"
),
}
}
args
:=
makeMountArgs
(
source
,
target
,
fstype
,
options
)
args
:=
makeMountArgs
(
source
,
target
,
fstype
,
options
)
...
@@ -103,10 +139,11 @@ func makeNsenterArgs(source, target, fstype string, options []string) []string {
...
@@ -103,10 +139,11 @@ func makeNsenterArgs(source, target, fstype string, options []string) []string {
}
}
// Unmount runs umount(8) in the host's mount namespace.
// Unmount runs umount(8) in the host's mount namespace.
func
(
*
NsenterMounter
)
Unmount
(
target
string
)
error
{
func
(
n
*
NsenterMounter
)
Unmount
(
target
string
)
error
{
args
:=
[]
string
{
args
:=
[]
string
{
"--mount=/rootfs/proc/1/ns/mnt"
,
"--mount=/rootfs/proc/1/ns/mnt"
,
"/usr/bin/umount"
,
"--"
,
n
.
absHostPath
(
"umount"
),
target
,
target
,
}
}
...
@@ -127,13 +164,13 @@ func (*NsenterMounter) List() ([]MountPoint, error) {
...
@@ -127,13 +164,13 @@ func (*NsenterMounter) List() ([]MountPoint, error) {
// IsMountPoint determines whether a path is a mountpoint by calling findmnt
// IsMountPoint determines whether a path is a mountpoint by calling findmnt
// in the host's root mount namespace.
// in the host's root mount namespace.
func
(
*
NsenterMounter
)
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
func
(
n
*
NsenterMounter
)
IsMountPoint
(
file
string
)
(
bool
,
error
)
{
file
,
err
:=
filepath
.
Abs
(
file
)
file
,
err
:=
filepath
.
Abs
(
file
)
if
err
!=
nil
{
if
err
!=
nil
{
return
false
,
err
return
false
,
err
}
}
args
:=
[]
string
{
"--mount=/rootfs/proc/1/ns/mnt"
,
"
/usr/bin/findmnt"
,
"-o"
,
"target"
,
"--noheadings"
,
"--target"
,
file
}
args
:=
[]
string
{
"--mount=/rootfs/proc/1/ns/mnt"
,
"
--"
,
n
.
absHostPath
(
"findmnt"
)
,
"-o"
,
"target"
,
"--noheadings"
,
"--target"
,
file
}
glog
.
V
(
5
)
.
Infof
(
"findmnt command: %v %v"
,
nsenterPath
,
args
)
glog
.
V
(
5
)
.
Infof
(
"findmnt command: %v %v"
,
nsenterPath
,
args
)
exec
:=
exec
.
New
()
exec
:=
exec
.
New
()
...
@@ -151,3 +188,11 @@ func (*NsenterMounter) IsMountPoint(file string) (bool, error) {
...
@@ -151,3 +188,11 @@ func (*NsenterMounter) IsMountPoint(file string) (bool, error) {
return
false
,
nil
return
false
,
nil
}
}
func
(
n
*
NsenterMounter
)
absHostPath
(
command
string
)
string
{
path
,
ok
:=
n
.
paths
[
command
]
if
!
ok
{
return
command
}
return
path
}
pkg/util/mount/nsenter_mount_unsupported.go
View file @
12b9da8f
...
@@ -20,6 +20,10 @@ package mount
...
@@ -20,6 +20,10 @@ package mount
type
NsenterMounter
struct
{}
type
NsenterMounter
struct
{}
func
NewNsenterMounter
()
*
NsenterMounter
{
return
&
NsenterMounter
{}
}
var
_
=
Interface
(
&
NsenterMounter
{})
var
_
=
Interface
(
&
NsenterMounter
{})
func
(
*
NsenterMounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
options
[]
string
)
error
{
func
(
*
NsenterMounter
)
Mount
(
source
string
,
target
string
,
fstype
string
,
options
[]
string
)
error
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment