Last week we hosted Microsoft experiences event in Paris, France. I had a talk about the Microsoft Azure application platform with Nicolas Clerc (Cloud Architect, Microsoft France) and David Gageot (Core Engineer, Docker).
The idea of this talk was to give an overview of the different services that allow to host applications in Microsoft Azure. From the virtual machines to the containers, we tried to explain what are the pros and cons of each services.
The image below illustrates the different kind of services you can use to build and host cloud applications on Microsoft Azure:
Each Microsoft Azure regions is made of data centers. In each data center, there are physical servers. On these servers, Microsoft has built an Infrastructure as a Service layer that allows to create virtual machines, virtual networks, storage and all other services that rely on this infrastructure.
Over this layer, there are platform services: Azure Cloud Services which is the first “compute” service that was available in Microsoft Azure, even before virtual machines. Today, there are two other PaaS services that are available : Azure App Services, that allows to host web application, web APIs or backend for mobile applications and Azure Service Fabric that allows to build and orchestrate reliable and high-scalable micro-services applications.
Microsoft Azure propose also 500+ services that you can use in your applications: there are data services like Azure SQL Database, Azure Search, Azure Redis Cache, IoT related services that helps you to build great IoT solutions quicker, Big Data & Machine learning services etc… All these services are made available through the Azure Marketplace, directly by Microsoft or by our partners.
As you can understand, Microsoft Azure offers a lot of possibilities to build and host an application in the cloud! The first question that you may ask is “What is a cloud application ?”. Basically, it’s a collection of services / API that work together. I have chosen a very simple example to illustrate what could be a cloud application:
This Cloud application is composed by 4 services :
- Web Front : an ASP.NET Core 1.0 MVC application
- Products, Recommendations and Ratings API : three ASP.NET Core 1.0 Web API applications
These APIs does nothing but returning their names, their versions and the name of the host they are running on.
Of course, in a real-life project, there will be some storage or cache services behind the APIs but I wanted to keep it really simple. This case is great to understand how services can be hosted in the cloud.
Once the services that compose your application are defined, the first question you can ask for is “how I want to host these services”. Do I want to host them on a virtual machine ? Do I want to host them in a container ? Do I want to host them in a process ? Behind these questions is the “Isolation VS Density” topic:
If you want a strong isolation between all the services that compose a cloud application, you can choose to host each service in one different virtual machines. It will be very secure, but not dense at all! If you want to optimize the resources (CPU, Memory, Network…) available on the virtual machines, you can choose to host each services in a process or a container. It will be less isolated than the previous choice, but will have a lot of advantage. This choice will also determine the ability to scale of your application. There are two way to scale an application in the cloud :
- Scale up : you scale the size of the machines that execute your services / containers / process. For example, you can start with 2 CPUs and 8GB of memory and scale to a 4 CPUs and 16GB of memory machine. It will work, only if the application has been designed for.
- Scale out : instead of scaling the size of the machine, you add new machines / containers / processes to host other instances of the services that compose the application. It’s often a more efficient way to support more traffic on a web app or web API, for example.
If your application needs to scale quickly, you will prefer host the services within a container or a process. If the application does not need to scale quickly but requires a lot of isolation, you will prefer to host the services directly on a virtual machine.
The next question that you can ask for is: do I want to have a full control on the platform or do I want more simplicity ?
For example, if you want to keep full control on the infrastructure that hosts your application, you can choose to work with virtual machines. In this case, you will have to handle everything from the OS configurations / patching, Frameworks installation, web farms deployments, network and load balancers and of course, your application. You may also want simplify the way you handle IT in your company and choose a service like Azure Service Fabric or Azure App Services that handles a lot of stuff for you. For example, with Azure App Services, you do not have to deal with the OS configuration / patching, or any Framework installation. You want to run PHP ? Java ? Node.js ? .NET ? Just push your code on App Services and it will work ! If you need more machines to execute the different services that compose the application, just ask Azure to add more machines, and all the network and load balancers will be reconfigured automatically!
You can also choose to work with services like Azure Container Services or Docker Datacenter which are more “PaaS over IaaS” services or “Container as a Services” (CaaS). The idea here is to deploy high level container orchestrator like Docker Swarm or Mesosphere DCOS over the Microsoft Azure infrastructure layer. Once running, these orchestrators will help you to run containerized applications in the Cloud.
In the next posts of this series, I will go deeper in hosting the sample cloud application using Azure App Services, Azure Service Fabric, Azure Container Service and Docker Datacenter. All the code samples are already available on my GitHub : https://github.com/jcorioland/CloudArchi-Samples. You will find several branches in this repo:
- master: the base application code
- service-fabric: the application packaged for Azure Service Fabric
- docker-linux: the application with Linux Dockerfiles & bash scripts to run the application on Docker Swarm mode 1.12
- docker-windows: the application with the Windows containers Dockerfiles & Powershell script to run it on Windows Server 2016 & Windows 10