A complete build environment provides the scalable build capacity as well as good observability. In order to create and maintain one of these environments for production purposes you will need to create at least two environments. The first one being the production environment, the second one a test environment in which you can verify that changes to the resources are suitable.
Each of these environments should contain at least the following resources
In this list you will note that there are a number of resources of which multiple instances need to be created. This is done so that there is some redundancy in the resources, i.e. if one fails there will still be enough to keep going. Some resources, e.g. Consul hosts, Elasticsearch hosts and RabbitMQ hosts, should be deployed in uneven numbers to prevent split brain situations. For more specific information read the clustering guides for the respective applications.
Obviously for redundancy purposes it is wise to deploy the resources to different VM hosts so that a failure in one of the hosts does not lead to failures in the cluster.