Installing Cisco Catalyst Center (formerly DNA Center) 2.3.7.9 on VMware ESXi 8, from OVA import and Advanced Install to the uber-dnac release checks. Ours took 1 hour 49 minutes, and System 360 showed all 118 services healthy.
By LabFabric · Published · Catalyst Center 2.3.7.9 on VMware ESXi 8.0 U3 · 14 min read
A real install in 21 seconds, from the Advanced Install to all 118 services Up.
This guide records our installation findings: the exact errors and fixes, the settings that matter, the API calls we used and the memory curve during the install. Every screenshot comes from the real deployment; click any of them to enlarge it. If you are studying the controller-based networking topics in the CCNA 200-301 or planning an ENCOR lab, this shows the installation behavior we observed.
Our recorded lab did not meet those requirements: the host had 64 GB physical DRAM plus an NVMe tier, and the VM used 32 vCPUs, 180 GB configured memory, a 48 GB memory reservation and a 40 GHz CPU reservation. The OVA resource settings were modified for that experiment. Installation and UI observations below do not establish Cisco support, production suitability or long-term stability.
How machine_profile selects vm_medium
During setup the installer picks a machine profile from /mnt/install-artifacts/machine_profile.json by matching the vCPU count and the memory Linux can see.
With 32 vCPUs the target is vm_medium, which needs about 172 GiB visible to the guest in the 2.3.7.9 image. That threshold comes from the installer's internal table, not a supported minimum: Cisco's published requirement is still 256 GB. If the VM matches no profile, the installer stops at the Kubernetes reservation step (see the troubleshooting reference).
The install log confirms the selection:
Add node label machine_profile vm_medium
Machine profiles in the 2.3.7.9 image
Profile
Min vCPU
Min GiB
t2_2xlarge
148
500
t2_large
92
300
medium
40
172
vm_mediumtarget
32
172
dev
20
156
Machine profiles in the 2.3.7.9 image.
ESXi 8.0 U3 memory tiering and NVMe backing
Broadcom's ESXi 8.0 U3 memory-tiering technical preview introduces host-level memory tiering over NVMe devices. This is an optional lab experiment, not a supported substitute for Cisco's dedicated-DRAM sizing. Broadcom recommends this preview for test environments and advises against memory-latency-sensitive workloads.
Key parameters and behaviors for memory tiering in ESXi include:
Mem.TierNvmePct: Configures NVMe tier capacity relative to physical DRAM (accepts values from 1 to 400). Read the setting on the ESXi host using esxcfg-advcfg -g /Mem/TierNvmePct.
Host Reboot Required: Changes to tiering settings require a host reboot. Shut down or migrate virtual machines prior to modifying or applying tiering configurations.
DRAM-Backed Reservations: VM memory reservations must still be backed by physical DRAM; NVMe tier capacity does not increase reservable RAM or substitute for Cisco's dedicated DRAM requirements.
Snapshot Incompatibility: Broadcom documents failures of memory-inclusive VM snapshots with Software Memory Tiering enabled in vSphere 8 (msg.snapshot.take.notswMemTieringReady). According to Broadcom KB 439056, this limitation stems from missing Fast Suspend and Resume (FSR) support in vSphere 8.x, with support for FSR-based operations introduced in vSphere 9.0. This does not establish support for every snapshot option. Independently, Cisco does not support VMware snapshots as a Catalyst Center VA backup method; use the application's supported backup and restore workflow regardless of hypervisor version.
These steps assume an NVMe tier device is already configured. To enable tiering from scratch, follow the device requirements, maintenance-mode procedure and tier-partition setup in the technical guide attached to Broadcom's preview article. The device must be dedicated to tiering; do not repurpose a datastore containing data.
Read the current percentage on the ESXi host. Broadcom documents a default of 25 and recommends an NVMe tier no larger than physical DRAM, even though the setting accepts up to 400.
For a planned lab change, shut down or migrate the host's VMs and use esxcfg-advcfg -s <percentage> /Mem/TierNvmePct. Reboot the host for the new ratio to take effect.
Verify the host's Tier 0 (DRAM), Tier 1 (NVMe) and total memory in vSphere. Available VM capacity is lower than that total because ESXi uses some memory.
Assign memory to the powered-off VM through Edit Settings → Virtual Hardware → Memory. Changing the host ratio does not resize the VM or increase DRAM-backed reservation capacity.
For example, 64 GB of DRAM at 100% gives a theoretical 64 GB NVMe tier and 128 GB combined; 300% gives 192 GB and 256 GB combined; 400% gives 256 GB and 320 GB combined, before host overhead and assuming sufficient tier-device capacity. The 300% and 400% examples exceed Broadcom's recommended ratio. Our notes recorded approximately 256 GB combined, but did not verify the host's percentage; no tiering change was performed during the recorded installation.
When configuring storage or memory limits for Catalyst Center, remember that tier capacity alone does not provide DRAM performance or bypass Cisco's physical memory sizing guidelines.
How to install Catalyst Center (DNA Center) on ESXi 8
1Prepare the host for the appliance
Run the install with no competing workloads on the host; vCenter is only needed for the import. The release wait is the most memory-hungry stretch, so leave other VMs off until the release checks in Validating the deployment pass.
2Import the OVA with dnac-esxi-launcher
Cisco ships dnac-esxi-launcher in the 2.3.7.9 launcher bundle (CatC-SW-Launcher-2.3.7.9-VA). In our run, silent mode imported the OVA, applied the enterprise network settings and powered the VM on. The command we used included -d to skip certificate validation; omit that flag when the server certificate is trusted:
The config.json tells the launcher where to import the OVA and which enterprise address to give the appliance. Here is an example with placeholder values; replace each one with your own. For a vCenter-managed host, host_info.ip is the vCenter address and host_name is the ESXi host inside it.
Two errors came up during the import. Each has a simple fix:
Swipe the table sideways to see every column.
Attempt
Error
Fix
Pointing it at the extracted .ovf
Unsupported file format for import!
The launcher only accepts the single-file OVA (point config.json at it).
Targeting the ESXi host directly
Access to resource settings on the host is restricted to the server that is managing it
The host was managed by vCenter, so vCenter had to be running and the launcher pointed at it (datacenter, cluster and host names).
The 33 GB OVA import took about an hour. The launcher has no option to skip power-on, and it warned that Storage I/O Control was off on the datastore.
3Consider disabling ESXi memory ballooning
The launcher powers the VM on straight after the import. About three minutes into that boot we shut the guest down through VMware Tools, before starting the appliance configuration, and added one advanced parameter under VM Options, Advanced, Configuration Parameters: sched.mem.maxmemctl = 0. It caps the balloon driver at zero for this VM only. Ballooning reduces the memory available to the guest, and with no guest swap that can put pressure on the appliance's Java and Elasticsearch backends. Whether to do this depends on your host: Broadcom treats it case by case. In this deployment the install that followed completed.
sched.mem.maxmemctl = 0 disables ballooning for this VM.
4Configure Catalyst Center with Advanced Install
After we interrupted the boot, the launcher's automatic initialisation did not run and the appliance came up on DHCP at the configuration wizard on port 9004. The simple Install workflow reported that the management interface was already configured:
In this deployment the simple workflow refused once the launcher had configured the interface.
Advanced Install showed the launcher's values pre-filled. For a single node we used one enterprise interface plus the intracluster link, left the cluster VIPs and FQDN empty, kept the default container (169.254.32.0/20) and cluster (169.254.48.0/20) subnets, set DNS and NTP, and left FIPS off. Make sure the container and cluster subnets do not overlap anything on your network, and that DNS and NTP actually answer. Subnetting explained covers how to check for overlap.
Enterprise and intracluster interfaces.
No VIPs for a single node; default internal subnets.
The last page asked for the maglev CLI password. In our browser automation, if the form complained Missing required value for ‘linux password’ after the fields were filled, typing into each field and tabbing out allowed us to continue. Then review the summary and select Start Configuration.
5Monitor the uber-dnac release wait
In this deployment the progress bar restarted between phases and lagged the backend. The useful view is the VM console, where apps_deployer logs each task. The timelapse at the top runs through every stage below.
Our timeline, in UTC on 27 October:
00:08:58
Start Configuration in the Advanced Install wizard
00:16:48
Pre-Install: networking applied through netplan
00:17:55
Cleanup and initramfs rebuild, a “Still Working” notice, then a reboot
00:20:22
Post-reboot Kubernetes setup (the UI bar says 93% while the API says Post-Install 5%)
00:28:36
Add node label machine_profile vm_medium
00:29:11
Install release uber-dnac, then the long release wait
The uber-dnac release wait took 1 hour 28 minutes of a 1 hour 49 minute install, and no ABORT or failure line appeared in the log. The progress bar can lag the backend, so watch the VM console and the installer endpoints; Install-Completed alone does not confirm that uber-dnac is DEPLOYED. The bootstrap service also exposes read-only progress and log endpoints you can poll from a workstation (not a documented public API):
Done. The page shows the temporary admin password in plain text (redacted here), so blur it in any screenshot you share.
Memory during the install
ESXi “consumed host memory” for the appliance VM during the uber-dnac release wait, with other VMs powered off; ESXi itself was still running.
00:31
12.8 GB
00:42
37.9 GB
00:51
63.8 GB
01:02
90.4 GB
01:13
98.4 GB
01:26
120.8 GB
~01:38
142.9 GB
01:47
114.6 GB
Catalyst Center VM consumed memory, 27 Oct 2026 UTC.
Memory climbed at about 2.4 GB per minute, slowed after 01:02 and peaked at 142.9 GB around 01:38, then fell during the remaining release wait. We did not establish whether that drop came from host reclamation or guest startup jobs ending. This was a demanding window in our install; size the VM to Cisco's published requirements.
Validate the deployment with maglevreleases
In this deployment, the first login with the temporary credential required a new SUPER-ADMIN user and replaced the temporary account. Quick Start followed: Cisco.com authentication (Skip is available) and the EULA, which states that telemetry is sent to Cisco. Until you close Quick Start, deep links redirect back to /firstTimeSetup.
Then check that each of these works:
Software Management loads and shows release 2.3.7.9-75335 with no failure banner.
System 360 shows Node Status and Services Status Healthy, with all 118 services Up, including grouping-service and spf-service-manager-service.
Inventory opens immediately with no “gather all the device data” wait.
System Health draws the topology for the enterprise address.
Finally, confirm from the maglev shell (SSH on port 2222) before you add devices or start other VMs. The installer can report Install-Completed even when the application release did not finish, so do not take a green dashboard as proof. We validated through the UI above and had not yet recorded these two outputs at the time of writing; run them yourself:
ssh -p 2222 maglev@<appliance-ip>
kubectl get maglevreleases -A # uber-dnac must be DEPLOYED, not ABORTED
kubectl get maglevservicereleases -A # nothing at INSTALL_REQUESTED or FAILED
In this image, the maglev login used a restricted shell: kubectl, free, uptime, ls and cat work, grep was rejected, a sudo systemctl attempt did not provide host-service access, and _shell asks for a Cisco TAC consent token rather than giving you bash.
Where the memory goes
In a kubectl sample from our testing on 2.3.7.9, summed container memory requests came to 155.9 GiB (limits 373.5 GiB). The biggest namespaces were assurance-backend (57.4 GiB) and ndp, the Network Data Platform (36.8 GiB). The largest single pods were asc-timeseries and asc-assurance-1 at about 10 GiB each, then graphwriter and queryengine at 8 GiB. These samples include core Assurance and Network Data Platform services; they must not be assumed to be optional add-ons. We did not test whether disabling telemetry or AI Analytics frees memory, so we cannot claim any saving from it.
Catalyst Center API calls and sample responses
Most of the diagnosis above came from a handful of HTTP calls rather than the UI. Two are served by the bootstrap installer on port 9004 during setup; the rest use HTTPS on port 443 once you have created the web admin, and cover authentication, device management and an internal status endpoint. The POST creates an authentication token; the PUT changes the controller's inventory management address rather than readdressing the network device. The TEST-NET example is only our workaround for a stale lab record, not a procedure for a live managed device. Replace the placeholders with your own values and use -k only until the appliance has a trusted certificate.
GET:9004/api/mks/v1/webinstall/install/progress
Installer progress
Served by the bootstrap installer while it runs, no login needed. More honest than the progress bar in the wizard.
state Post-Install (while waiting for uber-dnac)
state Install-Completed (at the end)
percent_complete 100
active step (empty once complete)
Values we observed; field layout abbreviated. Install-Completed here does not prove the release deployed.
GET:9004/api/mks/v1/webinstall/install/logs
Installer log tail
The same lines the wizard shows, as JSON. If post-install fails, the tail may show an error, though often only a generic traceback; the release state from kubectl is more specific.
Log lines transcribed from the wizard at the end of our install (extra_vars trimmed), in the JSON wrapper this endpoint returns.
POST/dna/system/api/v1/auth/token
Get an API token
Basic auth with the web admin you created at first login. In our testing a request returned HTTP 500, while a later request with an explicit JSON body and Content-Type succeeded; that did not establish the cause of the earlier error.
Our workaround for a record locked in SERIAL-NUMBER-CONFLICT: park it on a TEST-NET address so the real IP is free to discover again. The stale record itself still could not be deleted.
HTTP 200
{ "isOnboarded": false, ... } (no customer ID)
What we observed in our testing; not a documented public API.
Adding a first device
An empty controller is not much of a lab. In our testing on 2.3.7.9 we tried two virtual devices:
Swipe the table sideways to see every column.
Device
Discovery
Inventory status
Catalyst 8000V, IOS XE 17.16.1a
CLI, SNMP and NETCONF all succeed
Reachable, Managed, Supported
Nexus 9300v, NX-OS 10.4(2)
CLI and SNMP succeed, NETCONF fails
Reachable, Managed, Unsupported Cisco Device
The C8000V worked in this test; check Cisco's device compatibility matrix for your exact controller and device releases. Give it a privilege 15 user for the controller, an enable secret, an SNMPv2c read-only community and netconf-yang.
Do not reuse a management IP for a different device without deleting the old one from Inventory first. Doing so can leave a record stuck in SERIAL-NUMBER-CONFLICT that could not be deleted; the management-address call frees the IP, though the old record stays.
Catalyst Center install stuck: errors and fixes
Errors you may meet, what causes them and how to fix them.
Installer stops at kubernetes : Set the reserve values based on machine_profile with 'dict object' has no attribute 'default'
Cause
In this image, the undersized VM matched no machine profile and fell back to a default with no reservation entry. Confirm the same failure in the logs before applying this diagnosis.
Fix
Size the VM to Cisco's published requirements so a profile matches, then rerun the wizard.
Installer says Install-Completed, but Inventory is stuck on “Please wait while we gather all the device data”
Cause
In our failed deployment, uber-dnac was ABORTED after a post-install scale-up failed. This symptom alone does not identify the cause; check the release state and trace.
Fix
Check kubectl get maglevreleases -A and the release trace to see which step failed. If it is ABORTED, redeploy with nothing else competing for host memory, and consider disabling ballooning if memory reclamation was involved.
In our failed deployment, uber-dnac was ABORTED and grouping-service and spf-service-manager-service were never deployed. HTTP 502 or 404 alone does not prove that diagnosis.
Fix
Inspect the release state and trace first. If the same incomplete deployment is confirmed, contact TAC for a supported recovery path; our recovery used a fresh deployment.
Guest heartbeat turns red, SSH and HTTPS time out, load average above 100
Cause
Memory pressure on the host, such as ballooning in a guest that has no swap, can stall the Java backends.
Fix
Free host memory by powering off other VMs. If ballooning is involved, Broadcom covers disabling it per VM case by case (sched.mem.maxmemctl = 0).
SSH to port 2222 accepts the connection but the banner takes exactly 60 seconds
Cause
Consistent with sshd waiting on a reverse DNS lookup of the client address.
Fix
Use ssh -o ConnectTimeout=90, make the appliance DNS server answer, or add a PTR record for your workstation.
Device delete fails with “Device with IP address ... is being provisioned”
Cause
In our test, reusing a management IP for a different device left a SERIAL-NUMBER-CONFLICT record locked. The error alone does not establish that cause.
Fix
Our lab workaround moved only the stale inventory record to a TEST-NET address through the management-address API. It freed the real IP in this test but left the stale record undeletable; do not apply it to a live managed device.
Catalyst Center ESXi installation checklist
Run the install with no competing workloads on the host.
Size the VM to Cisco's specification so the installer selects a supported machine profile.
Decide on ballooning before configuration; we set sched.mem.maxmemctl = 0.
Use Advanced Install if the simple workflow refuses.
Plan for Cisco's estimate of 180 to 210 minutes plus 15 to 30 to settle (ours took 1 h 49 min), and watch the console rather than the percentage.
Confirm uber-dnac is DEPLOYED before you add devices or start other VMs.
Catalyst Center ESXi installation FAQ
How long does the Catalyst Center ESXi install take?
Cisco's deployment guide allows roughly 180 to 210 minutes for the Advanced Install plus 15 to 30 minutes for services to settle. Our install took 1 hour 49 minutes from Start Configuration to Install-Completed, 1 hour 28 minutes of which was the uber-dnac release wait. Importing the 33 GB OVA took about another hour beforehand.
What does uber-dnac ABORTED mean?
uber-dnac is the main application release that the installer deploys onto the appliance's Kubernetes cluster. ABORTED means the release deployment was aborted; inspect the release trace to see why. A failed post-install scale-up of the automation services is one possible cause. The installer can still report Install-Completed, so always confirm the release state with kubectl get maglevreleases -A.
Why does the simple Install workflow say to use Advanced Install?
In this deployment, after Cisco's ESXi launcher had already configured the management interface, the simple Install workflow showed “Management Interface is configured. Please use the Advanced Install to proceed”. Advanced Install then showed the saved network values pre-filled.
Should I disable memory ballooning for Catalyst Center?
It depends on the host; Broadcom treats disabling ballooning as a case-by-case setting. Ballooning reduces the memory available to the guest, and with no guest swap that can put pressure on the appliance's application backends. In this deployment we set sched.mem.maxmemctl = 0 before starting the appliance configuration, and the install completed; that is one observation, not proof the setting was required.
Which virtual devices can a Catalyst Center lab manage?
A Catalyst 8000V running IOS XE 17.16 was discovered over CLI, SNMP and NETCONF and shown as Supported and Managed. A Nexus 9300v running NX-OS 10.4(2) was discovered but listed as an Unsupported Cisco Device in 2.3.7.9.
How do I check whether Catalyst Center installed successfully?
Install-Completed alone does not confirm that the application release deployed. Run kubectl get maglevreleases -A and confirm that uber-dnac is DEPLOYED, then run kubectl get maglevservicereleases -A and check that nothing remains at INSTALL_REQUESTED or FAILED. In the web interface, check Software Management, System 360, Inventory and System Health.
Practise the network Catalyst Center automates.
Catalyst Center automates the switching and routing you still have to understand. LabFabric's browser labs drill VLANs, spanning tree and routing faults on real Cisco CLI, with no hypervisor to build.
Recorded in October 2026 against Catalyst Center 2.3.7.9 (2.3.7.9-75335) on ESXi 8.0 U3. Cisco references: ESXi deployment guide, validated design review. LabFabric is independent and not affiliated with Cisco Systems.