Advanced Topics¶
Rolling updates, multi-arch, init systems, build from source.
Rolling Updates¶
SwarmCracker supports zero-downtime rolling updates via SwarmKit orchestration.
How It Works¶
- Manager creates new task with updated spec
- SwarmCracker starts new Firecracker VM
- VM reports RUNNING status
- Manager waits for Monitor period (default: 5s)
- Manager stops old task
- Executor removes old VM
Update a Service¶
# Update image (triggers rolling update)
swarmctl update svc-nginx --image nginx:1.25
# Update with environment
swarmctl update svc-app --env LOG_LEVEL=debug
Configuration¶
SwarmKit controls update behavior (not SwarmCracker):
| Parameter | Default | Description |
|---|---|---|
| Parallelism | 1 | Tasks updated simultaneously |
| Delay | 0s | Wait between batches |
| Monitor | 5s | Verify task stability |
| Failure Action | pause | On failure: pause/continue/rollback |
Multi-Architecture Support¶
SwarmCracker supports multiple CPU architectures via placement constraints.
Supported Architectures¶
| Arch | Firecracker Support | Notes |
|---|---|---|
| x86_64 | ✅ Full support | Primary target |
| arm64 | ✅ Experimental | AWS Graviton, Ampere |
Architecture Constraints¶
# Create service constrained to x86_64 nodes
swarmctl create-service nginx:latest --constraint arch==x86_64
# Create service constrained to arm64 nodes
swarmctl create-service arm-app:latest --constraint arch==arm64
Multi-Arch Images¶
Use OCI image indexes for cross-arch compatibility:
# Build multi-arch image
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .
# SwarmCracker pulls correct variant based on node arch
Init Systems¶
MicroVMs need an init system for proper process management.
Why Init Matters¶
- Zombie reaping — Orphan processes must be reaped
- Signal handling — Forward SIGTERM to children
- Process supervision — Restart failed processes
Supported Init Systems¶
| Init | Size | Features |
|---|---|---|
| tini | ~20KB | Minimal, Docker default |
| dumb-init | ~30KB | Signal proxy, lightweight |
| s6 | ~100KB | Process supervision |
| systemd | Large | Full service management |
Configure Init¶
executor:
init_system: tini # none | tini | dumb-init
init_grace_period: 10 # seconds before SIGKILL during shutdown
Rootfs with Init¶
# Install tini in rootfs
curl -fsSL https://github.com/krallin/tini/releases/download/v0.19.0/tini-static -o rootfs/sbin/tini
chmod +x rootfs/sbin/tini
Build from Source¶
Prerequisites¶
- Go 1.26+
- Git
- Make
Clone and Build¶
# Clone repository
git clone https://github.com/restuhaqza/SwarmCracker
cd SwarmCracker
# Build binaries
make all
# Output:
# build/swarmcracker
# build/swarmd-firecracker
# build/swarmcracker-agent
# Install
sudo make install
Build Targets¶
make all # Build all binaries
make swarmcracker # Build the main CLI
make test # Run unit tests
make lint # Run linters
make fmt # Format code
make clean # Clean build artifacts
make install # Install binaries to $GOPATH/bin
Development Build¶
# Build a debug/dev binary
go build -o build/swarmcracker ./cmd/swarmcracker
# Run the CLI
./build/swarmcracker --help
systemd Services¶
swarmcracker cluster init (manager) and swarmcracker cluster join (worker) generate and enable the systemd units for you:
swarmcracker-manager.service— runsswarmd-firecracker --manageron the managerswarmcracker-worker.service— runsswarmd-firecrackeron workers
Inspect and control them with systemd:
sudo systemctl status swarmcracker-manager
sudo systemctl restart swarmcracker-worker
# Logs
sudo journalctl -u swarmcracker-manager -f
sudo journalctl -u swarmcracker-worker -f
There is no standalone swarmcracker service.
File Management¶
Manage rootfs and kernel images.
Rootfs Directory¶
executor:
rootfs_dir: "/var/lib/swarmcracker/rootfs"
Kernel Management¶
executor:
kernel_path: "/usr/share/firecracker/vmlinux"
Image Storage¶
/var/lib/swarmcracker/
├── rootfs/
│ ├── nginx-rootfs.ext4
│ ├── redis-rootfs.ext4
├── kernels/
│ ├── vmlinux-6.1.176
│ ├── vmlinux-5.10
├── config.yaml
Troubleshooting¶
Rolling Update Stuck¶
# Check task status
swarmctl ls-tasks
# Check node availability
swarmctl ls-nodes
# Force rollback if needed
swarmctl update <service-id> --image nginx:1.25-alpine
Init Process Missing¶
# Check init in rootfs
ls rootfs/sbin/tini
# Verify init binary
file rootfs/sbin/tini
Build Fails¶
# Check Go version
go version # Must be 1.26+
# Check dependencies
go mod download
# Run lint for errors
make lint
See Also: Configuration | Contributing Guide