.NET on Pivotal Cloud Foundry
In my latest post, I tested Lattice.cf, the single VM smaller brother of Pivotal Cloud Foundry (PCF). Considering a full installation of PCF has a footprint of about 25 Virtual Machines (VM) requiring a total of over 33Gb RAM, 500+ Gb storage, and some serious CPU power, it’s not hard to see why Lattice is more developer friendly. However, that wasn’t my real motivation to try it out: more important was Lattice’s incorporation of the new elastic runtime architecture codename ‘Diego’ which will replace the current Droplet Execution Agent (DEA) based runtime in due time.
For me, the main reasons to get excited about Diego are two-fold:
- Diego can run Docker containers: I demoed this in my latest post
- Diego can run Windows (.NET) based workloads
In this post, I’ll demo the Windows based workloads by deploying an ASP.NET MVC application, which uses the full-fledged production ready .NET stack and requires a Windows kernel - as opposed to .NET Core which is cross-platform, runs on a plentitude of OSes, and is very exciting, but not production ready yet.
Diego on PCF
At this point we have to resort to PCF as Lattice can’t run Windows workloads. This is because Lattice’s strong point (all services in 1 VM) is also its weakness: since Lattice incorporates all required services in a single Linux VM it quite obviously loses the ability to schedule Windows workloads.
Let’s take a quick look at the Diego architecture overview:
Diego architecture overview
Diego consists of a ‘brain’ and a number of ‘cells’. These cells run a container backend implementing Garden - a platform-neutral API for containerization (and the Go version of Warden). The default backend - garden-linux - is Linux based and compatible with various container technologies found on Linux (including Docker).
As soon as we run the various services in the overview on seperate VMs (as we do on PCF), it becomes possible to provision a Windows cell. ‘All’ we need is a Windows backend for garden and the various supporting services, and we should be good to go. Preferably in the form of a convenient installer.
One problem remains: we still need the Diego runtime in Pivotal Cloud Foundry. Kaushik Bhattacharya at Pivotal supplied me with an internal beta of ‘Diego for PCF’ (version 0.2) which I could install in my Pivotal on VMware vSphere lab environment. Installed, the Ops Manager tile looks like this:
Diego for PCF tile
And the default VMs and resources that come with Diego for PCF (notice the single default cell which is a garden-linux cell):
Diego for PCF default resources
garden-windows cell
To provision a Windows cell, we have to create a new VM manually and install a Windows server OS, and run a setup powershell script as well as the installer with the correct configuration. I’ll skip the details here, but when all is done, you can hit the receptor service url (in my case https://receptor.system.cf.lab.local/v1/cells), and it should show 2 cells: 1 installed as part of Diego for PCF, as well as the one we just created:
[
{
"cell_id": "DiegoWinCell",
"zone": "d48224618511a8ac44df",
"capacity": {
"memory_mb": 16383,
"disk_mb": 40607,
"containers": 256
}
},
{
"cell_id": "cell-partition-d48224618511a8ac44df-0",
"zone": "d48224618511a8ac44df",
"capacity": {
"memory_mb": 16049,
"disk_mb": 16325,
"containers": 256
}
}
]
Intermezzo: Containerization on Windows?
There must be some readers who are intrigued by the garden-windows implementation by now. After all, since when does Windows have support for containers? In fact, Microsoft has announced container support in the next Server OS, and the Windows Server 2016 Technical Preview 3 with container support was just released. However, this is not the ‘containerization’ used in the current version of garden-windows.
So how does it work?
Some of you may know Hostable Web Core: an API by which you can load a copy of IIS inside your process. So what happens when you push an app to Cloud Foundry and select the windows stack, is that app is hosted inside a new process on the cell, in which it gets its own copy of IIS after which it’s started.
I know what you’re thinking by now: “but that’s not containerization at all”. Indeed, strictly speaking it isn’t: it doesn’t use things like cgroups and namespaces used by Linux (and future Windows) container technologies in order to guarantee container isolation. However, from the perspective of containers as ‘shipping vehicles for code’ it’s very much containerization, as long as you understand the security implications.
Deploying to the Windows cell
Deployment to the Windows cell isn’t harder than to default cells, however, there are a couple of things to keep in mind:
- as the windows stack isn’t the default, you have to specify it explicitly
- as for now the DEA mode of running tasks is still default, you have to enable Diego support explicitly
Using the Diego Beta CLI the commands to push a full .NET stack demo MVC app are as follows (assuming you cloned it from github):
cf push diegoMVC -m 2g -s windows2012R2 -b https://github.com/ryandotsmith/null-buildpack.git --no-start -p ./
cf enable-diego diegoMVC
cf start diegoMVC
After pushing and scaling the Pivotal Apps Manager:
Pivotal CF Apps Manager with DiegoMVC .NET app
And the app itself:
DiegoMVC .NET application on Windows cell on Pivotal CF
Summary
Diego for PCF is still in internal beta, but soon Pivotal Cloud Foundry will have support for running applications using the full .NET stack.