GuiderUtveckling och driftKubernetes utan root med k3s

Kör k3s, en liten Kubernetes, utan root

k3s på Debian 13 i rootless-läge, en certifierad Kubernetes i en enda binär som körs under en egen oprivilegierad användare, med Traefik bakom Caddy, beständiga volymer och besökarens riktiga adress hela vägen fram till dina appar.

Testad på k3s v1.36.4+k3s1 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 26 september 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

k3s är en liten, certifierad Kubernetes i en enda binär, från teamet bakom Rancher. Den levereras med det ett kluster behöver för att vara användbart direkt: Traefik som leder webbtrafik till dina appar, CoreDNS, en metrics-server och lagring på serverns egen disk.

Här körs den i rootless-läget i k3s, under en egen användare som heter k3s, så att en container som bryter sig ut ur Kubernetes hamnar som den oprivilegierade användaren, inte som root. Webbtrafiken kommer in via Caddy från Podman-guiden, som hämtar certifikaten, precis som för de andra apparna på servern.

k3s märker rootless-läget som experimentellt, och det har begränsningar som är bra att känna till innan du börjar:

  • Det stöder bara en nod. Ett kluster med flera servrar kräver den vanliga k3s-installationen, som root, på egna servrar.
  • Bara Services av typen LoadBalancer får en port på servern, och portar under 1024 flyttas upp med 10000: Traefiks 80 och 443 blir 10080 och 10443.

Varje steg nedan har körts på en server hos Melonslab med Debian 13, bredvid apparna från våra andra guider:

  • k3s v1.36.4 startade rootless, med CoreDNS, Traefik, metrics-servern och lagringstjänsten igång.
  • En demoapp med två repliker svarade via Caddy över HTTPS och fick besökarens riktiga adress.
  • Med ufw gick det inte att nå Kubernetes API eller Traefiks portar från internet.
  • En beständig volym behöll sina data över en omstart av servern, och allt startade igen av sig självt.

k3s använde omkring 740 MB minne med demoappen. k3s kräver minst 2 GB på servern.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång och ufw från säkerhetsguiden;
  • en A-post och en AAAA-post för demo.example.com som pekar på din server, för demoappen.

Byt ut demo.example.com mot ditt eget namn genomgående.

1. Förbered servern

Som root installerar du verktygen som rootless k3s använder för sitt nätverk och sin lagring. De flesta installerade du redan i Podman-guiden:

apt install -y slirp4netns fuse-overlayfs uidmap

Låt användarnas tjänster styra användningen av CPU, minne och disk, vilket rootless-kubelet kräver:

mkdir -p /etc/systemd/system/user@.service.d
printf '[Service]\nDelegate=cpu cpuset io memory pids\n' > /etc/systemd/system/user@.service.d/delegate.conf
systemctl daemon-reload

Och slå på IP-vidarebefordran, utan vilken k3s vägrar starta:

printf 'net.ipv4.ip_forward=1\n' > /etc/sysctl.d/90-k3s.conf
sysctl --system

ufw blockerar fortfarande trafik som vidarebefordras via servern, om ingen regel tillåter den, som WireGuard-guiden gör för sin egen.

2. Installera k3s

curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_ENABLE=true INSTALL_K3S_SKIP_START=true sh -

Det här är installationsprogrammet från k3s, och det installerar den senaste stabila versionen. De två inställningarna hindrar det från att starta k3s som root: det installerar /usr/local/bin/k3s med kubectl bredvid, plus en root-tjänst, k3s.service, som förblir avstängd. k3s --version visar versionen.

3. Skapa användaren

useradd -m -s /bin/bash k3s
loginctl enable-linger k3s
machinectl shell k3s@

Allt fram till steg 6 körs som k3s.

4. Starta k3s

Installera tjänstefilen som k3s tillhandahåller för rootless-läget och starta den:

mkdir -p ~/.config/systemd/user
curl -sfL -o ~/.config/systemd/user/k3s-rootless.service https://raw.githubusercontent.com/k3s-io/k3s/main/k3s-rootless.service
systemctl --user daemon-reload
systemctl --user enable --now k3s-rootless

Kontrollera klustret efter en minut eller två:

kubectl get nodes
kubectl get pods -A

kubectl hittar själv sin inloggning till rootless-klustret, ~/.kube/k3s.yaml. Noden är Ready, och poddarna för CoreDNS, Traefik, metrics-servern och lagringstjänsten är Running. De två helm-install-poddarna visar Completed: de installerade Traefik.

5. Håll portarna stängda

k3s öppnar tre portar på servern: 6443 för Kubernetes API, och Traefiks 10080 och 10443. ufw blockerar alla tre från internet, och den här guiden öppnar dem aldrig: Caddy når Traefik lokalt på servern, och du använder kubectl som k3s på servern.

6. Driftsätt en app

Som exempel driftsätter du whoami, en pytteliten webbserver som visar förfrågan den fick. Skapa ~/whoami.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: docker.io/traefik/whoami:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  selector:
    app: whoami
  ports:
    - port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami
spec:
  rules:
    - host: demo.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  number: 80

Deploymenten kör två kopior av appen, Servicen ger dem en adress inne i klustret, och Ingressen säger åt Traefik att skicka förfrågningar för demo.example.com dit. Tillämpa filen:

kubectl apply -f ~/whoami.yaml
kubectl rollout status deploy/whoami

7. Sätt Caddy framför

Traefik ersätter besökarens adress, som Caddy skickar med, om den inte litar på var anslutningen kommer ifrån. I rootless-läge når Caddys anslutningar Traefik från 10.42.0.1. Skapa ~/traefik-config.yaml:

apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    ports:
      web:
        forwardedHeaders:
          # Caddy's connections reach Traefik from this address.
          trustedIPs:
            - 10.42.0.1/32
kubectl apply -f ~/traefik-config.yaml

k3s installerar om Traefik med ändringen inom en minut. Gå sedan tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:

demo.example.com {
    reverse_proxy 127.0.0.1:10080
}

Starta om Caddy med systemctl --user restart caddy och öppna https://demo.example.com. whoami visar förfrågan, med din egen adress först i X-Forwarded-For och X-Forwarded-Proto: https. Varje ny app får en egen Ingress med sitt eget namn och ett eget block i Caddyfile, som pekar på samma 127.0.0.1:10080.

8. Behåll data

Appar som sparar data ber om en beständig volym. k3s skapar dem med sin lagringstjänst, som kataloger under /home/k3s/.rancher/k3s/storage. Till exempel:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
spec:
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 1Gi

En podd monterar den sedan under volumes med persistentVolumeClaim: {claimName: data}. Dina data finns kvar när podden ersätts och när servern startar om.

9. Håll den uppdaterad

k3s uppdaterar sig inte själv. För att uppdatera kör du installationsprogrammet från steg 2 igen som root, vilket installerar den senaste stabila versionen, och startar sedan om k3s som k3s:

systemctl --user restart k3s-rootless

Traefik, CoreDNS och de andra delarna som följer med k3s uppdateras samtidigt. Läs versionsanteckningarna på k3s-projektets GitHub-sida före en ny mindre version, som 1.37.

10. Säkerhetskopiera

Som k3s:

mkdir -p ~/backup
systemctl --user stop k3s-rootless
tar -czf ~/backup/k3s.tar.gz -C ~/.rancher/k3s server/db server/token server/cred server/tls storage
systemctl --user start k3s-rootless

Säkerhetskopian innehåller klustrets databas, med allt du har tillämpat, dess nycklar och certifikat, och de beständiga volymerna. Behåll också dina YAML-filer, så att du kan tillämpa dem igen var som helst. Kopiera ~/backup till en annan maskin och förvara den säkert.

Felsökning

k3s stannar direkt, och journalctl --user -u k3s-rootless visar expected sysctl value "net.ipv4.ip_forward" to be "1". Gör sista delen av steg 1.

Din app ser 10.42.0.1 som besökarens adress, eller http i stället för https. Tillämpa Traefik-ändringen från steg 7 och vänta tills Traefik-podden har ersatts.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider