Skip to content

Commit b49f304

Browse files
committed
KIC rootless: drop fuse-overlayfs; bump kernel requirement to 5.11
minikube 1.23 (PR 12359) added fuse-overlayfs snapshotter for rootless Docker driver, but got broken in minikube 1.25 (issue 13534). We can drop fuse-overlayfs for kernel >= 5.11. Fix issue 13534 We may add back fuse-overlayfs later if there is a huge demand to support kernel < 5.11. That will require packing preloadable tarballs for fuse-overlayfs snapshotter. Signed-off-by: Akihiro Suda <[email protected]>
1 parent 3f9212c commit b49f304

File tree

7 files changed

+41
-53
lines changed

7 files changed

+41
-53
lines changed

deploy/kicbase/Dockerfile

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ RUN clean-install \
126126
openssh-server \
127127
dnsutils \
128128
# libglib2.0-0 is required for conmon, which is required for podman
129-
libglib2.0-0 \
130-
# fuse3 is required for fuse-overlayfs
131-
fuse3
129+
libglib2.0-0
132130

133131
# install docker
134132
# use the bionic packages for arm32
@@ -139,19 +137,6 @@ RUN export ARCH=$(dpkg --print-architecture | sed 's/armhf/arm-v7/') && \
139137
apt-key add - < docker.key && \
140138
clean-install docker-ce docker-ce-cli containerd.io
141139

142-
# install fuse-overlayfs (used by rootless; apt-get version is old)
143-
RUN curl -sSL --retry 5 --output /usr/local/bin/fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/${FUSE_OVERLAYFS_VERSION}/fuse-overlayfs-$(uname -m) \
144-
&& chmod +x /usr/local/bin/fuse-overlayfs
145-
146-
# install containerd-fuse-overlayfs (used by rootless)
147-
RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') \
148-
&& echo "Installing containerd-fuse-overlayfs..." \
149-
&& export CONTAINERD_FUSE_OVERLAYFS_BASE_URL="https://github.com/containerd/fuse-overlayfs-snapshotter/releases/download/v${CONTAINERD_FUSE_OVERLAYFS_VERSION}" \
150-
&& curl -sSL --retry 5 --output /tmp/containerd-fuse-overlayfs.tgz "${CONTAINERD_FUSE_OVERLAYFS_BASE_URL}/containerd-fuse-overlayfs-${CONTAINERD_FUSE_OVERLAYFS_VERSION}-linux-${ARCH}.tar.gz" \
151-
&& tar -C /usr/local/bin -xzvf /tmp/containerd-fuse-overlayfs.tgz \
152-
&& rm -rf /tmp/containerd-fuse-overlayfs.tgz
153-
COPY deploy/kicbase/containerd-fuse-overlayfs.service /etc/systemd/system/containerd-fuse-overlayfs.service
154-
155140
# install buildkit
156141
RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') \
157142
&& echo "Installing buildkit ..." \

deploy/kicbase/containerd-fuse-overlayfs.service

Lines changed: 0 additions & 13 deletions
This file was deleted.

pkg/drivers/kic/oci/oci.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,6 @@ func CreateContainerNode(p CreateParams) error {
162162
// including some ones docker would otherwise do by default.
163163
// for now this is what we want. in the future we may revisit this.
164164
"--privileged",
165-
// enable /dev/fuse explicitly for fuse-overlayfs
166-
// (Rootless Docker does not automatically mount /dev/fuse with --privileged)
167-
"--device", "/dev/fuse",
168165
"--security-opt", "seccomp=unconfined", // ignore seccomp
169166
"--tmpfs", "/tmp", // various things depend on working /tmp
170167
"--tmpfs", "/run", // systemd wants a writable /run

pkg/minikube/cruntime/containerd.go

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@ oom_score = 0
7070
[cgroup]
7171
path = ""
7272
73-
[proxy_plugins]
74-
# fuse-overlayfs is used for rootless
75-
[proxy_plugins."fuse-overlayfs"]
76-
type = "snapshot"
77-
address = "/run/containerd-fuse-overlayfs.sock"
78-
7973
[plugins]
8074
[plugins."io.containerd.monitor.v1.cgroups"]
8175
no_prometheus = false
@@ -208,9 +202,6 @@ func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semve
208202
}
209203
pauseImage := images.Pause(kv, imageRepository)
210204
snapshotter := "overlayfs"
211-
if inUserNamespace {
212-
snapshotter = "fuse-overlayfs"
213-
}
214205
opts := struct {
215206
PodInfraContainerImage string
216207
SystemdCgroup bool
@@ -239,6 +230,16 @@ func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semve
239230

240231
// Enable idempotently enables containerd on a host
241232
func (r *Containerd) Enable(disOthers, forceSystemd, inUserNamespace bool) error {
233+
if inUserNamespace {
234+
if err := CheckKernelCompatibility(r.Runner, 5, 11); err != nil {
235+
// For using overlayfs
236+
return fmt.Errorf("kernel >= 5.11 is required for rootless mode: %w", err)
237+
}
238+
if err := CheckKernelCompatibility(r.Runner, 5, 13); err != nil {
239+
// For avoiding SELinux error with overlayfs
240+
klog.Warningf("kernel >= 5.13 is recommended for rootless mode %v", err)
241+
}
242+
}
242243
if disOthers {
243244
if err := disableOthers(r, r.Runner); err != nil {
244245
klog.Warningf("disableOthers: %v", err)
@@ -254,12 +255,6 @@ func (r *Containerd) Enable(disOthers, forceSystemd, inUserNamespace bool) error
254255
return err
255256
}
256257

257-
if inUserNamespace {
258-
if err := r.Init.EnableNow("containerd-fuse-overlayfs"); err != nil {
259-
return err
260-
}
261-
}
262-
263258
// Otherwise, containerd will fail API requests with 'Unimplemented'
264259
return r.Init.Restart("containerd")
265260
}

pkg/minikube/cruntime/crio.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,18 +150,13 @@ func enableIPForwarding(cr CommandRunner) error {
150150
// enableRootless enables configurations for running CRI-O in Rootless Docker.
151151
//
152152
// 1. Create /etc/systemd/system/crio.service.d/10-rootless.conf to set _CRIO_ROOTLESS=1
153-
// 2. Create /etc/crio/crio.conf.d/10-fuse-overlayfs.conf to enable fuse-overlayfs
154-
// 3. Reload systemd
153+
// 2. Reload systemd
155154
//
156155
// See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-in-userns/#configuring-cri
157156
func (r *CRIO) enableRootless() error {
158157
files := map[string]string{
159158
"/etc/systemd/system/crio.service.d/10-rootless.conf": `[Service]
160159
Environment="_CRIO_ROOTLESS=1"
161-
`,
162-
"/etc/crio/crio.conf.d/10-fuse-overlayfs.conf": `[crio]
163-
storage_driver = "overlay"
164-
storage_option = ["overlay.mount_program=/usr/local/bin/fuse-overlayfs"]
165160
`,
166161
}
167162
for target, content := range files {
@@ -211,6 +206,14 @@ func (r *CRIO) Enable(disOthers, forceSystemd, inUserNamespace bool) error {
211206
}
212207
}
213208
if inUserNamespace {
209+
if err := CheckKernelCompatibility(r.Runner, 5, 11); err != nil {
210+
// For using overlayfs
211+
return fmt.Errorf("kernel >= 5.11 is required for rootless mode: %w", err)
212+
}
213+
if err := CheckKernelCompatibility(r.Runner, 5, 13); err != nil {
214+
// For avoiding SELinux error with overlayfs
215+
klog.Warningf("kernel >= 5.13 is recommended for rootless mode %v", err)
216+
}
214217
if err := r.enableRootless(); err != nil {
215218
return err
216219
}

pkg/minikube/cruntime/cruntime.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package cruntime
2020
import (
2121
"fmt"
2222
"os/exec"
23+
"strings"
2324

2425
"github.com/blang/semver/v4"
2526
"github.com/pkg/errors"
@@ -316,3 +317,22 @@ func CheckCompatibility(cr Manager) error {
316317
}
317318
return compatibleWithVersion(cr.Name(), v)
318319
}
320+
321+
// CheckKernelCompatibility returns an error when the kernel is older than the specified version.
322+
func CheckKernelCompatibility(cr CommandRunner, major, minor int) error {
323+
expected := fmt.Sprintf("%d.%d", major, minor)
324+
unameRes, err := cr.RunCmd(exec.Command("uname", "-r"))
325+
if err != nil {
326+
return err
327+
}
328+
actual := strings.TrimSpace(string(unameRes.Stdout.Bytes()))
329+
sortRes, err := cr.RunCmd(exec.Command("sh", "-euc", fmt.Sprintf(`(echo %s; echo %s) | sort -V | head -n1`, actual, expected)))
330+
if err != nil {
331+
return err
332+
}
333+
comparison := strings.TrimSpace(string(sortRes.Stdout.Bytes()))
334+
if comparison != expected {
335+
return NewErrServiceVersion("kernel", expected, actual)
336+
}
337+
return nil
338+
}

site/content/en/docs/drivers/docker.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ minikube config set driver docker
3434
## Requirements
3535
- Docker 20.10 or higher, see https://rootlesscontaine.rs/getting-started/docker/
3636
- Cgroup v2 delegation, see https://rootlesscontaine.rs/getting-started/common/cgroup2/
37+
- Kernel 5.11 or later (5.13 or later is recommended when SELinux is enabled), see https://rootlesscontaine.rs/how-it-works/overlayfs/
3738

3839
## Usage
3940

0 commit comments

Comments
 (0)