Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

signals-federation Zarf package

Dedicated air-gap control-plane package for federation sentinels on RKE2.

Pathzarf/federation/
Package namesignals-federation
Version0.1.0
Zarfv0.70.1
Specminifi_sentinels.md

Why dedicated

Knative / YuniKorn / MiNiFi lifecycle is not owned by cybersec-dask or the legacy zarf/zarf.yaml signals-360 scaffold. This package takes precedence: residual cybersec app namespaces can be removed with zarf/federation/scripts/teardown-precedence.sh. Cybersec later adopts these standards rather than the reverse.

Ships

  1. Knative Serving (CRDs → controllers, Kourier, KPA enable-scale-to-zero)
  2. YuniKorn 1.9.0 (resource-class queues; policy promoted from config/scheduler/federation-queues.yaml)
  3. MiNiFi C++ sentinel Knative Service (federation-signals/minifi-sentinel)
  4. DCGM exporter (federation-system/dcgm-exporter) — live GPU watts, no TSDB

Does not ship: host gRPC engines, Dask, Jupyter, Panel-Viz, Prometheus/ELK.

Images (linux/amd64 digests)

Zarf rejects multi-arch OCI indexes. Knative release digests in upstream YAML are indexes — pin platform digests in zarf.yaml and manifests (recorded in BOOTSTRAP_VERSIONS.txt). Rebuild:

cd zarf/federation
# re-resolve if versions change:
# podman manifest inspect <ref>  → digests[].platform.architecture=amd64
zarf package create . --confirm --output /raid/signals/zarf-build

Deploy

export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/rke2.yaml}"
# optional clean slate for cybersec apps
./zarf/federation/scripts/teardown-precedence.sh

zarf package deploy \
  /raid/signals/zarf-build/zarf-package-signals-federation-amd64-0.1.0.tar.zst \
  --confirm

cd zarf/federation && python3 -m converge verify

Converge FSM

zarf/federation/converge/ — Layer A/B catalog with live kubectl detects:

TierInvariants
T0node Ready, zarf ns
T2Knative CRDs, controllers, scale-to-zero CM
T3YuniKorn Ready, federation queues
T4ksvc present, STZ posture
T5C2 path packaged, DCGM exporter (pull-only OTel yield)
cd zarf/federation && python3 -m converge list
python3 -m converge verify

Scale-to-zero

config-autoscaler sets enable-scale-to-zero=true. Sentinel ksvc uses min-scale: "0". Idle revisions should drop to 0 pods after the grace period; activator wakes them on request.

Multi-engine K8s coordination (soon)

RKE2 on the lab node is scarce shared compute. Multiple sibling repos (Aegir, Atelier, Gaius, cybersec, Hermes, …) currently reach the same cluster via independent Tilt / Helm / ad-hoc apply paths. That collides with federation ownership:

Failure modeExample observed
Redeploy thrashAegir Tilt (infra/tilt/) recreated aegir-metaflow after teardown-precedence.sh
Image-pull noiseMetaflow images rewritten by Zarf agent to missing registry digests
Queue bypassWorkloads not submitted under root.{aegir,atelier,gaius,signals,hermes}
Scheduler conflictDefault kube-scheduler vs YuniKorn admission for capacity

Direction (federation-owned):

  1. YuniKorn is the scheduler of record for all federation and engine workloads on this RKE2 instance — queues already declared in package values (root.default + per-engine leaves).
  2. No long-running out-of-band Tilt against shared namespaces without an explicit engine queue + resource request/limit that YK can enforce.
  3. Engine admission via sentinels / package surface — host gRPC engines stay off-cluster; anything that does land on K8s goes through signals-federation (or a later per-engine Zarf component) so teardown and converge FSM remain authoritative.
  4. Coordination API (TBD) — signals control plane (signals-ui + protocol) should expose queue/capacity and “who may deploy what” so sibling devenvs do not fight for the same node.

Until that lands: stop engine-local process-compose / Tilt that targets RKE2 before federation teardown or redeploy (devenv processes down in Aegir, etc.).

See also