Skip to the content.

Linux/systemd Platform Architecture

The Linux/systemd platform is architecturally unique among Skupper V2 platforms. The router runs as a native process, not a container.

How Each Platform Runs the Router

Platform Router Runs As Controller Container Runtime Required
Kubernetes Pod (container) Controller Pod + Kube-Adaptor Yes (K8s)
Docker Docker container Controller container Yes
Podman Podman container Controller container Yes
Linux (systemd) Native skrouterd binary via systemd None Yes (bootstrap only)

The Two Systemd Service Templates

Skupper uses different templates based on platform:

Linux template (systemd_service.template)

[Service]
ExecStart=skrouterd -c /skrouterd.json
Environment="SKUPPER_SITE_ID="

Runs the router binary directly — no container.

Container template (systemd_container_service.template)

[Service]
ExecStart=/bin/bash /start.sh
ExecStop=/bin/bash /stop.sh

Runs scripts that manage a container.

Template selection (from systemd.go):

if s.platform == string(types.PlatformLinux) {
    // Native binary template
} else {
    // Container template
}

The Bootstrap Container

Despite running the router natively, the Linux platform does use a container during skupper system start — for config generation only.

Two Container Images

Image Purpose When Used
quay.io/skupper/cli Config generation (bootstrap) One-time during system start, then exits
quay.io/skupper/skupper-router Actual router data plane NOT used on Linux — only Docker/Podman/K8s

Bootstrap Flow

Step 1: Bootstrap (ephemeral container)
  quay.io/skupper/cli container:
    - Reads YAML resources from /input
    - Generates skrouterd.json, TLS certs, systemd service files
    - Writes output to /output
    - Container exits (--rm)

Step 2: Install systemd service (on host)
  bootstrap.sh copies service file → ~/.config/systemd/user/
  systemctl --user enable --now skupper-<ns>.service

Step 3: Router runs (native, ongoing)
  skrouterd -c <path>/skrouterd.json
  No container. Runs indefinitely.

Why Use a Container for Config Generation?

The bootstrap container enables site bundles — pre-packaged site configurations that can be deployed on remote hosts without the CLI installed. The same config generation logic works for both direct CLI usage and bundle deployment.

No Controller on Linux

Unlike Docker/Podman (which have a long-running controller container that auto-reconciles), Linux has no controller:

Platform Config Change Handling
Kubernetes Controller auto-reconciles via CRD watches
Docker/Podman (auto) Controller container auto-reconciles
Docker/Podman (manual) skupper system reload
Linux skupper system reload → re-runs bootstrap → regenerates config → restarts service

User vs Root Service Installation

Running As Service Location Control
Regular user ~/.config/systemd/user/skupper-<ns>.service systemctl --user
Root /etc/systemd/system/skupper-<ns>.service systemctl

Prerequisites for Linux Platform

Prerequisite Direct CLI Site Bundle
skrouterd binary ✅ Required ✅ Required
Container engine (Podman/Docker) ✅ Required (bootstrap) ❌ Not required
Skupper CLI ✅ Required ❌ Not required
systemd ✅ Required ✅ Required
Python ✅ Required (port selection)