Tenant Hypervisors

Tenant Hypervisors #

Fills the tenant hypervisor role — see Substrate Compute → Compute by purpose. The host is dv02hyp002p02.


Hardware #

Dell OptiPlex 7060 Micro: specs, cabling, power and console.

Requirements #

AttributeRequirementRationale
RAM32GB minimumMultiple tenant VMs
Storage1TB SSDVM images, local storage
CPUModern x86_64 with VT-xVirtualization support
NICsGigabit EthernetSubstrate network connectivity

Operating System #

AttributeValue
OSProxmox VE
VersionSoftware Catalog
BaseDebian

Automation Capability #

  • Installation: manual, from the standard Proxmox VE ISO ( Build a Hypervisor). An unattended ISO is unfinished work in deevnet-image-factory
  • Post-install: Ansible: deevnet.builder (node baseline, storage) and deevnet.net (proxmox_node_network: the bridge, transit routing and tenant egress)
  • VM provisioning: the Deevnet API, on behalf of each tenant’s Terraform
  • Templates: Packer-built Fedora templates stored locally

VM Templates #

TemplateDescription
FedoraAnsible-ready base image built via deevnet-image-factory

Templates are built using Packer and stored locally on each hypervisor. New VMs clone from templates for rapid, consistent deployment.

Build-time addressing #

The build VM takes a pinned address, 10.20.99.79 on the management segment, rather than a DHCP lease. It is not a reserved host: the address exists only for the duration of a build.

This is deliberate. The installer needs an address before it can fetch its kickstart, and the installed system needs one for Packer’s SSH provisioner. If that came from DHCP, building an image would depend on a substrate service being healthy — and when DHCP is unavailable the build does not fail quickly or clearly. It boots, waits, and drops into a dracut emergency shell roughly seven minutes later reporting “missing inst.stage2 or inst.repo”, which points at the install source rather than at the network. That is an expensive way to learn the DHCP pool is down.

Pinning the address means an image build either succeeds or fails for reasons inside the build.

It does not reach clones. The last step of the build removes the NetworkManager connection profile along with machine-id and the SSH host keys, so a clone inherits no address, no identity, and no host keys. Tenant workloads are addressed by cloud-init from the tenant fabric — see Tenant Fabric.

10.20.99.79 sits in the .70-.79 experimental/lab range of the addressing plan, clear of both the .2-.49 static infrastructure range and the .200-.230 DHCP pool. Override with build_ip, or set build_use_dhcp=true to go back to a lease.


Provisioning #

Tenant workloads are declared by each tenant in Terraform through the deevnet/deevnet provider and built by the Deevnet API; the management plane stays on Ansible. See Tenant Operations.


Non-Clustered Design #

The node is a standalone Proxmox host, not a cluster member: no HA manager, no shared storage, and its own web UI. Why is in Substrate Compute → Nothing is clustered; how the fabric is built to gain a second member later is in Tenant Fabric (SDN).


Tenant Networking #

The tenant network model is in Tenant Networking. This node implements it with Proxmox SDN — see Tenant Fabric (SDN).


Deterministic MAC Addressing #

Tenant workload MACs are derived by the Deevnet API from the tenant’s index, like the rest of a tenant’s identifiers ( Tenant → The Tenant Contract). Management-hypervisor VMs follow the inventory-defined policy on the Management Hypervisor.

Page last modified: November 1, 2026