Verify the Installation⚓︎
When the Site reports Ready, confirm each layer before connecting radios or handing the core over:
the operator's view of the Site, the workloads it created, the Agent's registration in xControl,
and the monitoring path. The commands below use the xcore namespace and release name.
The Site⚓︎
kubectl -n xcore get sites.expeto.io
kubectl -n xcore describe site acmecorp-campus
All conditions must be True. For the combined core example:
Status:
Conditions:
Type: InfrastructureReady Status: True Reason: InfrastructureReady
Type: GatewaysReady Status: True Reason: AllGatewaysReady Message: 3 child UPF(s) ready
Type: ControlPlaneReady Status: True Reason: ControlPlaneReady Message: Control-plane children ready: smf, mm, mme, sdm
Type: Ready Status: True Reason: Ready Message: Site agent and all 3 child UPF(s) are ready
Last Reconcile Time: 2026-10-26T16:29:11Z
Last Reconcile Time advances on every pass. If it stops moving the operator is not running:
kubectl -n xcore rollout status deployment/xcore-xfabric
Workloads⚓︎
kubectl -n xcore get pods
kubectl -n xcore get smf,upf,udsf,nfcm,mm,mme,sdm,mariadb,dragonfly
Every pod must be Running (the Ignite initialisation Job ends Completed). The set depends on the
Site; a public core produces these, with one controller Deployment and one dataplane StatefulSet per
user plane:
| Workload | Kind |
|---|---|
smf |
Deployment |
upf-<user plane>-controller, upf-<user plane>-dataplane |
Deployment, StatefulSet |
udsf, udsf-idallocator, udsf-timer |
Deployment, Deployment, StatefulSet |
nfcm-monitoring, nfcm-statistics |
Deployment |
ignite, ignite-proxy, ignite-init |
StatefulSet, Deployment, Job |
mariadb |
StatefulSet, managed by the MariaDB operator |
cache |
StatefulSet, managed by the Dragonfly operator |
xcore-xfabric, xcore-xfabric-agent |
Deployment, StatefulSet (the operator and the Agent) |
The control-plane blocks of a private or combined core add their own workloads:
| Workload | Kind | Present with |
|---|---|---|
mm-ranhandler, mm-communication, mm-uehandler |
Deployment | amf |
mme-mme, mme-stc |
Deployment | mme: the MME and its S1 transport controller |
mme-cache |
StatefulSet, managed by the Dragonfly operator | mme: the MME's session store |
sdm-hss |
Deployment | subscriber store in mode 4G or Dual |
sdm-udr, sdm-udm, sdm-ausf |
Deployment | subscriber store in mode 5G or Dual |
sdm-cache |
StatefulSet, managed by the Dragonfly operator | subscriber store |
The user planes' radio-facing and data-network addresses live on Multus attachments, not on Services. Confirm each dataplane pod holds the addresses the Site pins:
kubectl -n xcore exec upf-psa-upf-dataplane-0 -- ip -br addr
Prerequisite check⚓︎
The operator's preflight lists every dependency it found, with a fix hint for anything missing. Run it as the chart's Helm test or directly on the operator pod:
helm test xcore -n xcore --filter name=xcore-xfabric-test-preflight --logs
kubectl -n xcore exec deployment/xcore-xfabric -- /opt/taiga/app preflight
Taiga preflight check
✓ Multus CNI installed
✓ cert-manager installed
! MetalLB (optional) NOT INSTALLED
→ Optional — BGP fabric (Site.Spec.Network.Bgp) is not supported without MetalLB.
...
2 of 2 required prerequisites satisfied.
Registration in xControl⚓︎
Open Sites in xControl. The Site whose ID you gave the chart shows Connected, with the Agent version and the address it connects from on its detail page. It turns Disconnected after five minutes without contact.
If it stays Disconnected, check the Agent:
kubectl -n xcore logs statefulset/xcore-xfabric-agent -c agent --tail=100
The usual causes are a siteId that does not match the Site in xControl, a token that was issued
for another Site, or an xControl hostname the pod cannot resolve or reach on port 443.
Operations CLI⚓︎
The Agent pod carries a CLI sidecar that reads live state from every network function on the Site:
kubectl -n xcore exec -it xcore-xfabric-agent-0 -c agent-cli -- cli
At the expeto_shell> prompt, ls lists the command folders (lte, nr, nf, ops), and
cd nr followed by read smf shows the SMF's sessions. The CLI Guide
covers the grammar.
Monitoring path⚓︎
The operator publishes each Site's conditions as a metric on its metrics Service:
kubectl -n xcore port-forward service/xcore-xfabric-metrics 8080:8080 &
curl -s http://127.0.0.1:8080/metrics | grep taiga_site_condition
taiga_site_condition{namespace="xcore",site="acmecorp-campus",type="ControlPlaneReady"} 1
taiga_site_condition{namespace="xcore",site="acmecorp-campus",type="GatewaysReady"} 1
taiga_site_condition{namespace="xcore",site="acmecorp-campus",type="InfrastructureReady"} 1
taiga_site_condition{namespace="xcore",site="acmecorp-campus",type="Ready"} 1
The Agent exposes the Site's network-function metrics on the agent-prom Service (port 9767); the
xCore metrics page lists the families. They reach xView
the way every site's metrics do: a Prometheus in the Site's namespace scrapes them, and the Agent
uploads that Prometheus's federation endpoint to xControl for each Monitoring Endpoint configured
on the Site in xControl; see xView architecture. The xfabric
chart does not install that Prometheus by default. Use the platform's prometheus-operator, or bundle
one with kube-prometheus-stack.enabled=true, set nfMonitoring.enabled=true so that the chart
renders the scrape configuration of the network functions, and add the Monitoring Endpoint to the
Site in xControl, as agreed with Expeto Support.
Acceptance tests⚓︎
With radios connected and Mobile Assets provisioned, run the installation and upgrade verification set: attach, detach, idle mode, throughput and the other checks an installation must pass before it is handed over.