1. A method for deploying an application having a plurality of functional components that are executed on a plurality of different nodes, the method comprising: receiving, by a deployment module, a specification for the application, wherein the specification specifies (i) a number of instances of each functional component of the application that is to be deployed, and (ii) hardware properties that would be required by any node executing any one of the functional components; requesting a virtual infrastructure platform to launch a plurality of virtual machines (VMs) that is sufficient to execute each instance of a functional component in a separate VM, wherein each of the VMs (i) is configured to support hardware properties required by at least one of the functional components, and (ii) includes an agent component configured to communicate with the deployment module; and directing each of the agent components in each of the VMs to install code in the VM that implements one of the functional components that is compatible with the hardware properties of the VM, thereby causing the VM to execute as one of the instances of the functional components of the application.