Contenuti

Kind su Docker Rootless non funziona su openSUSE Leap: analisi e soluzione definitiva

Kind su Docker Rootless non funziona su openSUSE Leap

/en/kind-opensuse/img.png

Analisi completa del problema “Delegate=yes” e soluzione definitiva

In questo articolo analizzo una casistica reale su openSUSE Leap dove kind fallisce durante la creazione di un cluster Kubernetes usando Docker rootless, mostrando il noto errore:

ERROR: failed to create cluster: running kind with rootless provider requires setting systemd property "Delegate=yes"

Il messaggio sembra indicare che Delegate=yes non sia configurato, ma in realtà si tratta di qualcosa di più profondo: la delega dei controller cgroup.

Vediamo passo per passo come sono arrivato alla diagnosi corretta e alla soluzione definitiva.


Contesto

  • Distribuzione: openSUSE Leap (ultima release disponibile)
  • Configurazione:
    • Docker rootless abilitato
    • cgroup v2 attivo
    • kind installato via Go (~/go/bin/kind)
  • Variabili d’ambiente corrette:
XDG_RUNTIME_DIR=/run/user/1000
DOCKER_HOST=unix:///run/user/1000/docker.sock

Nonostante ciò, il cluster non veniva creato.


Primo controllo: cgroup v2

Kind in modalità rootless richiede cgroup v2:

docker info --format '{{.CgroupVersion}}'

Output:

2


Verifica di Delegate=yes in systemd

systemctl show "user@$(id -u).service" -p Delegate

Output:

Delegate=yes

Ma nonostante questo kind falliva ancora.


Analisi dei controller cgroup realmente delegati

Verifica:

cat /sys/fs/cgroup/user.slice/cgroup.controllers

Output:

cpuset cpu io memory pids

Poi:

cat /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/cgroup.controllers

Output:

pids

E:

cat /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/cgroup.subtree_control

Output:

pids

Qui emerge il problema reale: vengono delegati solo i pids, non cpu, memory, io, cpuset.

Kind richiede almeno cpu e memory per funzionare in rootless.
Se non li trova, mostra il messaggio fuorviante relativo a “Delegate=yes”.


Tentativo alternativo: esecuzione in scope dedicato

systemd-run --scope --user -p "Delegate=yes" kind create cluster

Fallimento identico → conferma del problema sui controller cgroup.


Soluzione definitiva: delega esplicita dei controller

sudo mkdir -p /etc/systemd/system/user@.service.d

cat << 'EOF' | sudo tee /etc/systemd/system/user@.service.d/delegate.conf
[Service]
Delegate=cpu cpuset io memory pids
EOF

sudo systemctl daemon-reload
sudo reboot

Dopo il riavvio:

systemctl show "user@$(id -u).service" -p Delegate

Output:

Delegate=cpu cpuset io memory pids

E soprattutto:

cat /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/cgroup.controllers

Output corretto:

cpu cpuset io memory pids


Riavvio Docker rootless

systemctl --user restart docker


Kind funziona

kind create cluster

Cluster creato correttamente.

kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.34.0) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

Conclusioni

Il messaggio:

requires setting systemd property "Delegate=yes"

appare anche quando Delegate è già impostato, perché kind controlla i controller realmente delegati.

openSUSE Leap delega solo pids di default, quindi occorre delegare esplicitamente:

Delegate=cpu cpuset io memory pids

per permettere a Docker rootless di eseguire i container necessari a kind.


Codice completo della soluzione

sudo mkdir -p /etc/systemd/system/user@.service.d

cat << 'EOF' | sudo tee /etc/systemd/system/user@.service.d/delegate.conf
[Service]
Delegate=cpu cpuset io memory pids
EOF

sudo systemctl daemon-reload
sudo reboot