This directory contains the configuration and scripts to build a bootable container (bootc) image with MicroShift and the Jumpstarter operator pre-installed.
⚠️ Community Edition DisclaimerThis MicroShift-based deployment is a community-supported edition intended for development, testing, and evaluation scenarios. It is not officially supported for production use, although it can be OK for small labs.
For production deployments, we strongly recommend using the official Jumpstarter Controller deployment on Kubernetes or OpenShift clusters with proper high availability, security, and support. See the official installation documentation for production deployment guides.
This community edition deployment provides a lightweight, all-in-one solution ideal for:
- Edge devices with limited resources
- Development and testing environments
- Proof-of-concept deployments
- Local experimentation with Jumpstarter
Features:
- MicroShift 4.20 (OKD) - Lightweight Kubernetes distribution
- Jumpstarter Operator - Pre-installed and ready to use
- TopoLVM CSI - Dynamic storage provisioning using LVM
- Configuration Web UI - Easy setup and management at port 8880
- Pod Monitoring - Real-time pod status dashboard
- Fedora/RHEL-based system (tested on Fedora 42)
- Podman installed and configured
- Root/sudo access required for privileged operations
- At least 4GB RAM and 20GB disk space recommended
make bootc-buildThis builds a container image with MicroShift and all dependencies.
make bootc-runThis will:
- Create a 1GB LVM disk image at
/var/lib/microshift-okd/lvmdisk.image - Start MicroShift in a privileged container
- Set up LVM volume groups inside the container for TopoLVM
- Wait for MicroShift to be ready
Output example:
MicroShift is running in a bootc container
Hostname: jumpstarter.10.0.2.2.nip.io
Container: jumpstarter-microshift-okd
LVM disk: /var/lib/microshift-okd/lvmdisk.image
VG name: myvg1
Ports: HTTP:80, HTTPS:443, Config Service:8880
- URL:
http://localhost:8880 - Login:
root/jumpstarter(default - you'll be required to change it) - Features:
- Configure hostname and base domain
- Set controller image version
- Change root password (required on first use)
- Download kubeconfig
- Monitor pod status
- URL:
https://jumpstarter.<your-ip>.nip.io:6443 - Download kubeconfig from the web UI or extract from container
- URL:
http://localhost:8880/pods - Auto-refreshes every 5 seconds
- Shows all pods across all namespaces
sudo podman exec -it jumpstarter-microshift-okd oc get pods -Amake bootc-shmake bootc-stopmake bootc-rmThis will:
- Stop the container
- Remove the container
- Clean up LVM volume groups (myvg1)
- Detach loop devices
Note: The LVM disk image (/var/lib/microshift-okd/lvmdisk.image) is preserved. To remove it completely, use make clean.
make bootc-rm bootc-build bootc-runThis stops, removes, rebuilds, and restarts the container with the latest changes.
For production deployments, you can create a bootable QCOW2 disk image that can be:
- Installed on bare metal
- Used in virtual machines (KVM/QEMU, OpenStack, etc.)
- Deployed to edge devices
make build-imageThis will:
- Clean up any existing LVM resources to avoid conflicts
- Build the bootc container image (if not already built)
- Use
bootc-image-builderto create a bootable QCOW2 image - Output the image to
./output/qcow2/disk.qcow2
Note: This process takes several minutes and requires significant disk space (20GB+).
Important: If you're running the container (make bootc-run) and want to build the image, stop the container first with make bootc-rm to avoid LVM conflicts.
The QCOW2 image is configured via config.toml:
- LVM partitioning: Creates
myvg1volume group with 20GB minimum - Root filesystem: XFS on LVM (10GB minimum)
- Default password:
root:jumpstarter(change via web UI on first boot)
qemu-system-x86_64 \
-m 4096 \
-smp 2 \
-drive file=output/qcow2/disk.qcow2,format=qcow2 \
-net nic -net user,hostfwd=tcp::8880-:8880,hostfwd=tcp::443-:443# Convert to raw disk image
qemu-img convert -f qcow2 -O raw output/qcow2/disk.qcow2 output/disk.raw
# Convert to VirtualBox VDI
qemu-img convert -f qcow2 -O vdi output/qcow2/disk.qcow2 output/disk.vdi┌─────────────────────────────────────────────┐
│ Bootc Container / Image │
├─────────────────────────────────────────────┤
│ • Fedora CoreOS 9 base │
│ • MicroShift 4.20 (OKD) │
│ • Jumpstarter Operator │
│ • TopoLVM CSI (storage) │
│ • Configuration Service (Python/Flask) │
│ • Firewalld (ports 22, 80, 443, 8880) │
└─────────────────────────────────────────────┘
When running as a container:
- Script creates
/var/lib/microshift-okd/lvmdisk.image(1GB) - Image is copied into the container
- Loop device is created inside container
- LVM volume group
myvg1is created - TopoLVM uses
myvg1for dynamic PV provisioning
When deployed from QCOW2:
- Bootc image builder creates proper disk partitioning
- LVM volume group
myvg1is set up on disk - Root filesystem uses part of the VG
- Remaining space available for TopoLVM
BOOTC_IMG=quay.io/your-org/microshift-bootc:v1.0 make bootc-buildAdd Kubernetes manifests to /etc/microshift/manifests.d/002-jumpstarter/ by editing:
kustomization.yaml- Kustomize configuration- Additional YAML files will be automatically applied
Edit config-svc/app.py and rebuild:
make bootc-buildFor live testing without rebuild:
make bootc-reload-appCheck if volume group exists in container:
sudo podman exec jumpstarter-microshift-okd vgs
sudo podman exec jumpstarter-microshift-okd pvsIf TopoLVM pods are crashing, recreate the LVM setup:
make bootc-rm # Automatically cleans up VG and loop devices
make clean # Remove the disk image for a fresh start
make bootc-runCheck logs:
sudo podman logs jumpstarter-microshift-okd
sudo podman exec jumpstarter-microshift-okd journalctl -u microshift -fCheck service status:
sudo podman exec jumpstarter-microshift-okd systemctl status config-svc
sudo podman exec jumpstarter-microshift-okd journalctl -u config-svc -fIf ports 80, 443, or 8880 are in use, modify run-microshift.sh:
HTTP_PORT=8080
HTTPS_PORT=8443
CONFIG_SVC_PORT=9880Ensure sufficient disk space and clean up:
sudo podman system prune -a
sudo rm -rf output/| Target | Description |
|---|---|
make help |
Display all available targets |
make bootc-build |
Build the bootc container image |
make bootc-run |
Run MicroShift in a container |
make bootc-stop |
Stop the running container |
make bootc-rm |
Remove container and clean up LVM resources |
make bootc-sh |
Open shell in container |
make bootc-reload-app |
Reload config service without rebuild (dev mode) |
make build-image |
Create bootable QCOW2 image |
make bootc-push |
Push image to registry |
make clean |
Clean up images, artifacts, and LVM disk |
| File | Description |
|---|---|
Containerfile |
Container build definition |
config.toml |
Bootc image builder configuration |
run-microshift.sh |
Container startup script |
kustomization.yaml |
Kubernetes manifests configuration |
config-svc/app.py |
Configuration web UI service |
config-svc/config-svc.service |
Systemd service definition |
The system uses nip.io for automatic DNS resolution:
- Default:
jumpstarter.<host-ip>.nip.io - Example:
jumpstarter.10.0.2.2.nip.ioresolves to10.0.2.2
| Port | Service | Description |
|---|---|---|
| 80 | HTTP | MicroShift ingress |
| 443 | HTTPS | MicroShift API and ingress |
| 8880 | Config UI | Web configuration interface |
| 6443 | API Server | Kubernetes API (internal) |
- Default Password: The system ships with
root:jumpstarteras the default password- Console login: You will be forced to change the password on first SSH/console login
- Web UI: You must change the password before accessing the configuration interface
- TLS Certificates: MicroShift uses self-signed certs by default
- Privileged Container: Required for systemd, LVM, and networking
- Authentication: Web UI uses PAM authentication with root credentials
- Production Use: Consider additional hardening for production deployments
Typical development cycle:
# 1. Make changes to code/configuration
vim config-svc/app.py
# 2. Quick reload (no rebuild needed)
make bootc-reload-app
# 3. Access and test
curl http://localhost:8880
# 4. Check logs if issues
make bootc-sh
journalctl -u config-svc -f
# 5. For major changes, do full rebuild
make bootc-rm bootc-build bootc-run-
Build QCOW2 image:
make build-image
-
Copy image to target system:
scp output/qcow2/disk.qcow2 target-host:/var/lib/libvirt/images/
-
Create VM or write to disk:
# For VM virt-install --name jumpstarter \ --memory 4096 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/disk.qcow2 \ --import \ --os-variant fedora39 # For bare metal dd if=output/qcow2/disk.qcow2 of=/dev/sdX bs=4M status=progress
-
First boot:
- Console login will require password change from default
jumpstarter - Access web UI at
http://<host-ip>:8880and set new password
- Console login will require password change from default