Part I – Kubernetes DevOps : Introduction to the Historic Events Microservice

This is the first post in a multi part blog series on Kubernetes DevOps using Azure. I am co-authoring this series with the help of my colleague at Microsoft, Daniel Selman. We recently worked on K8s project together and thought to share out learnings.

Anyways, below is a high-level structure of the blog posts we are planning to publish:

Part I: Introduction to the Historic Events Microservice <-- This post
Part II: Getting started with Helm
Part III: VSTS Build (Helm package + containerization of application)
Part IV: VSTS Release (using Helm)
Part V: Learned – When things go wrong!

We do assume that you have basic knowledge of K8s and Docker containers, as we don’t really cover the basics of either of those in this blog series.


Following is the list of software you want to install on your machine.

• Kubectl
• Helm
• Docker
• Minikube (optional, only needed for local testing)
• Git
• Azure CLI

If you like to use a script to install these software on a Linux VM (tested on Ubuntu 16.04), you can download it here:

On the services side, we will be using Azure AKS and VSTS. In case you don’t have Azure subscription you can get yourself Azure trial for free here:

Alright, so for the demonstration purposes, we have created a simple Historic Events microservice. We thought, it won’t hurt to throw some history while working on modern technologies!


From a technical perspective, we have a micro service that serves the UI which is written in ASP.NET Core 2.0. It pulls data by talking to various RESTful endpoints exposed by Node JS API that is serve by another microservice. The actual content storing the details about historic
events), that is serve by API is stored in various JSON files, that are persisted as a blog on Azure Storage.

In a nutshell, from an end user standpoint the web app home page looks like below:


When a user wants to learn more about a particular historic event, they can either select particular historic event from the top menu, or they can simply click on the description of a particular event provided on the home page.

For example, French Revolution event page is shown below. All event details pages follow similar table based layout to list critical events.


Code Walkthrough

The code and all relevant artifacts are available on GitHub:


This is a plain vanilla ASP.NET Core 2.0 web application.

HistoricEvent ( define a basic entity, that represents an event object. The actual attributes are date and description of historic event.


Most of the actual work happens inside the HomeConroller, which provides methods to connect to backend api service and fetch the data.

The GetEvent ( method takes a url of an endpoint as a parameter. It then connects to the url endpoint and read the content as a string asynchronously but ultimately converting it into JSON objects stored in a List of type HistoricEvent. Finally, it returns the List object containing all the events.


If you are wondering who call GetEvent it is inside the method called Event. (


The is basically an action tied to the View. The parameter id essentially act as a key referring to the event we are interested to fetch from the backend service (e.g. ww2, ww1 etc). The method itself is trivial and we have left most of the optimization out. It does the bare minimum at the moment of printing on the console which endpoint its going to connect and port at the moment is set to 8080. Finally, it call GetEvent return the HistoricEvent objects stored in the List and send the back as a View.

The Event.cshtml ( View presents the list of events in a table format.


Data Api (NodeJS)

The backend service code is placed inside NodeJSApi folder

The server.js runs the server that listens to port 8080.
Since the actual files containing the event data are stored on Azure Blob Storage, we set url variable to the blob storage endpoint, which is passed through an environment variable.

Let’s take a look at the endpoint that returns ww1 (World War 1) related events ( First it connects to the url, which points to the Azure Blob file e.g. (https://name. and then it reads the relevant JSON file (e.g. ww1.json). We do check to see if the status is 200, meaning file is pulled from the blob, in which case content of the response is set to the JSON.


Historic Events JSON Files

All the data related to various historic events is available in the JSON file format. You can find the link of each of the historic event JSON file below.


NOTE: Azure blob storage requires file names to be in the lower case.


Name Description URL
frenchrevolution French Revolution
renaissance Renaissance
ww1 World War I
ww2 World War II

Docker Files

Both the front end and back end service are packaged as Docker Linux container image.

1. Frontend UI:

2. Backend API:

Building and Running an Auditing Solution on Blockchain

On 21st February, I will be conducting an event at Microsoft NYC campus on building and running a fully functional blockchain based audit trail application.

The first half is a good fit for both business and technical audiences, as it covers auditing scenarios using blockchain. The latter half will showcase an open source project that provides tracking of Wikipedia change logs using blockchain.

I will do a deep dive into the running solution that leverages the Ethereum Rinkeby Network. I will showcasing open source project
Wikipedia logs change tracking” that I am currently working on.

Session Summary

  • 6:30 PM | Overview of auditing capabilities of blockchain
  • 7 PM – 9 PM | Project Showcase – Tracking/Auditing Changes from Wikipedia Logs.
  • Q&A + Demos
  • Developers are encouraged to bring their laptops running Mac OS or Windows 10 (or Windows Server 2016). Instructions to setup the project will be provided during the session.

    Building and Running an Auditing Solution on Blockchain

    Wednesday, Feb 21, 2018, 6:30 PM

    11 Times Square New York, NY

    53 Members Went

    • What we’ll do In this session, you will learn about how to build and run a fully functional blockchain based audit trail application. As usual, everyone is welcome. The first half is a good fit for both business and technical audiences, as it covers auditing scenarios using blockchain. The latter half will showcase an open source project that pro…

    Check out this Meetup →

    DevOps with Containers

    Recently I did a video series for Microsoft Channel9 on DevOps with Containers (thanks to Lex Thomas and Chris Caldwell for recording these). The idea was simple- show and tell how container technology can help in improving the DevOps experience.

    It’s a ~2-hour long recording (divided into three parts for easy viewing) covers topics including containerization of applications, continuous integration and deployment of containerized applications using Visual Studio Team Services, Azure Container Services, Docker Swarm, DC/OS and monitoring containers using Operations Management Suite and 3rd party tools.

    Here is the break down of each session. If you’re interested in looking at the sample application that I have deployed in the last session (asp net core web app and ape) its available on my Git repo.

    Part 1 – Getting Started with Containers

    In the first part the focus is to introduce the basic concepts of containers and the process of application containerization. I did target Windows Containers in this part though later parts do show how to leverage multi-container applications based on ASP.NET Core using Linux container. If you wanted to try Windows Containers I have provided this link that will allow you to automatically provision Windows Server 2016 Virtual Machine with containers support (including docker-compose). Also, the Azure ARM Template that provisions the virtual machine is available here.

    • [2:01] What is a Container and how can it benefit organizations?
    • [5:20DEMO: Windows Containers 101- Basics and Overview
    • [9:33DEMO: How to create a Container on Nano Server
    • [15:39DEMO: Windows Server Core and Containers
    • [19:36DEMO: How to containerize legacy ASP.NET 4.5 application
    • [43:48DEMO: Running  Microsoft SQL Server Express inside Container

    Part 2 – Building CI/CD pipeline with VSTS and Azure Container Service

    The second part focuses on building a Continuous Integration (CI) and Continuous Deployment (CD) pipeline for multi-container applications using Visual Studio Team Services (VSTS) with deployment target of Azure Container Service (ACS) hosting DC/OS and Docker Swarm.

    I developed a sample application that represents a canonical web app and ape (in this case I used ASP.NET Core 1.1 but really can be NodeJS, Python , Java etc.). Then demos show workflow that starts by submitting code along with Dockerfile and docker-compose that actually will be used by VSTS build to create a new container image every time build is run {container name:buildnumber} format. Containers are hosted in Azure Container Registry which is a private DTR (docker trusted registry). After container image is ready the continuous deployment happens and VSTS kicks off the release which targets both DC/OS and Docker Swarm that are actually hosted on Azure Container Service (ACS).

    • [2:54] The Big Picture – Making DevOps successful
    • [6:34DEMO: Building a Continuous Integration and Continuous Deployment system with Azure Container Service and Visual Studio Team System
      • Multi-Container Application | ASP.NET Core
      • Container Images Storage | Azure Private Docker Registry
      • Build & Release Deployment | Visual Studio Team System

    Part 3 (Final) – Monitoring and Analytics

    This is the final part which focuses on doing Monitoring and Analytics of container applications running on Azure Container Service. Microsoft Operations Management Suite (OMS) is the primary service used in the demos but I did mention 3rd party services that are supported on Azure Container Service and provide monitoring, analytics and debugging functionality

    • [3:20] Does Orchestration = Containers?
    • [5:40] DEMO: Monitoring and Analytics

    Final Thoughts

    Containers are a massively useful technology for both Green Field and Brown field based application development. Also, organizations today have various levels of maturity when it comes to DevOps and containers provide them with a great option to enable DevOps in an effective way. Off course there are considerations like learning curve, lack of proven practices and reference architectures compared to traditional technologies. However, this is going to be lesser concern as with time, the knowledge gap is going to be filled and reference architectures will emerge.

    Finally, you should also broaden your design choices to include a combination of containers with server less computing (e.g. Azure Function which actually runs inside a container itself!). This is a particularly interesting option when your service is mainly stateless. This is something I would like to cover in future blog post.

    How To Set Custom Resolution On MacBook Pro Retina

    I recently experience an inconvenience when I discovered that on MacBook Pro Retina running OS X El Captain (and even few of its predecessors as I found out) you cannot set custom resolution. Well long story short for recording a video I need to set resolution to 1270×720 which was not among the preset choices of resolution that apple provides. You can see available choices in the screen shot below (click on the image to see it in higher resolution)

    MacBook Pro Retina Display Settings

    As someone who regularly use Windows OS this came across as limitation in the Apple operating system.

    I manage to find a working solution to this problem. Apparently there is a software Retina DisplayMenu that provides list of most common resolutions to select for and it works perfectly. You can see all the available resolutions in the screen shot below (click on the image to see it in higher resolution)

    Retina DisplayMenu Resolutions

    Retina DisplayMenu is available for download here. Please note that I do not own this software nor can vouch for its quality so please use it at your own discretion.