1. A computer-implemented method comprising: automatically determining, with one or more processors, whether to execute a top-level software application on an application node in a set of application nodes in a distributed computing system based on status data from the set of application nodes; automatically identifying, with the one or more processors, sets of software applications, the sets of software applications comprising a first operating system and a second operating system, the first operating system different than the second operating system, wherein each of the sets of software applications comprises a stack of two or more software applications that, when executed, collaborate to provide an operating environment for the top-level software application, wherein the sets of software applications are identified when it is determined that the top-level software application is to be executed on the application node; automatically selecting, with the one or more processors, one of the identified sets of software applications based on at least one characteristic of the application node; deploying instances of each of the software applications in the selected set of software applications from the bottom to the top of the stack comprised by the selected set of software applications; and wherein automatically determining whether to execute top-level a software application comprises receiving status data for the distributed computing system, wherein the status data represents an actual state of the application nodes; processing the status data with rules in a set of rule engines to determine whether causing the application node to execute an instance of the top-level software application would reduce differences between an expected state and the actual state of the distributed computing system; and directing an application governor to perform actions to identify the sets of software applications.