Running Web API using Docker and Kubernetes
Context
As companies are continuously seeking ways to become more Agile and embracing DevOps culture and practices, new designs principles have emerged that are more closely aligned with those aspirations. One such a design principle that had gained more popularity and adoption lately is Microservices. By decomposing applications to smaller independent components, companies are able to achieve the following benefits:
- Ability to scale specific components of the system. If “Feature1” is experiencing an unexpected rise in traffic, that component could be scaled without the need to scale the other components which enhances efficiency of infrastructure use
- Improves fault isolation/resiliency: System can remain functional despite the failure of certain modules
- Easy to maintain: teams can work on system components independent of one another which enhances agility and accelerates value delivery
- Flexibility to use different technology stack for each component if desired
- Allows for container based deployment which optimizes components’ use of computing resources and streamlines deployment process
I wrote a detailed blog on the topic of Microservices here
In this blog, I will focus more on the last bullet. We will see how easy it is to get started with Containers and have them a deploy mechanism of our Microservices. I will also cover the challenge that teams might face when dealing with a large number of Microservices and Containers and how to overcome that challenge
Creating a simple web API with Docker Support using Visual Studio
For this section, I am using Visual Studio 2017 Enterprise Edition to create the Web API.
- In Visual Studio, go to File => New => Project => Web => ASP.NET Core Web Application (.NET Core)

- Select Web API and make sure that Enable Docker Support is enabled and then click OK to generate the code for the web API

Note that the code generated by Visual Studio has the files needed by Docker to compile and run the generated application
- Open docker-compose.yml file and prefix the image name with your docker repository name. For example, if your Docker repository name is xyz then the entry in the docker-compose.yml should be: image: xyz/sampleapi Here is how that file should look like:
version: '1'
services:
sampleapi:
image: xyz/sampleapi
build:
context: ./SampleAPI
dockerfile: Dockerfile
- Check in the generated Web API code into Version Control System. You can use the git repository within Visual Studio Team Services for free here
- Checkout the code to an Ubuntu machine with Docker engine installed. In Azure you can provision an Ubuntu machine with Docker using “Docker on Ubuntu Server” as shown below

- Run the code by navigating to the directory where the repository was cloned and then run the following command
docker-compose -f docker-compose.ci.build.yml up && docker-compose up
- Verify that the container is running by entering this command
docker ps
- This should return the container that was just created in the previous step. The output should look something similar to below

- Finally push the docker image created (i.e. xyz/sampleapi) to the Docker image Registry

docker push xyz/sampleapi:latest
As your application becomes more popular and users ask for more features, new microservices will need to be created. As the number of microservices increases, so is the complexity of deploying, monitoring, scaling and managing the communication among them. Luckily there are orchestration tools available that make this task more manageable.
Orchestrating Microservices
Managing a large number of Microservices can be a daunting task. Not only will you need to to track their health, you will also need to ensure that they are scaled properly, deployed without interrupting users and also recover when there are failures. The following are orchestrators that have been created to meet this need:
- Service Fabric
- Docker Swarm
- DC/OS
- Kubernetes
Stacking up these tools against one another is out of scope for this blog. Instead, I will focus more on how we can deploy the Web API we created earlier into Kubernetes using Azure Container Service.
Creating Kubernetes in Azure Container Service (ACS)
For this section, I am using a Windows Server 2016 machine. You can use any platform to achieve this but you might need to make a few minor changes to the steps detailed below
- Install Azure CLI using this link
- Login to Azure using Azure CLI by entering the following command
az login
- Follow the steps to login to Azure using Azure CLI. Also if you have access to multiple subscriptions, make sure the right subscription is selected
az account set –subscription “your subscription ID”
- Create a resource group
az group create -l eastus -n webAPIK8s
- Create Kubernetes cluster in ACS under the resource group created
az acs create -n myKubeCluster -d myKube -g webAPIK8s –generate-ssh-keys –orchestrator-type kubernetes –agent-count 1 –agent-vm-size Standard_D1
- Download the Kubernetes client by entering this command:
az acs kubernetes install-cli –install-location=C:\kubectl\kubectl.exe
Note: Ensure that kubectl folder exists otherwise the command would throw an error
- Get the Kubernetes cluster credentials
az acs kubernetes get-credentials –resource-group=webAPIK8s –name=myKubeCluster
- Tunnel into the Kubernetes cluster
C:\kubectl\kubectl.exe proxy
- Open a web browser and navigate to http://localhost:8001/ui

Deploying the Web API
To deploy to the Kubernetes cluster, a deployment descriptor is needed. Create a file called sampleapi.yml in the machine you have used to connect to the Kubernetes cluster and fill it with the following:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sampleapi-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: sampleapi
spec:
containers:
- name: sampleapi
image: xyz/sampleapi:latest
ports:
- containerPort: 80
- Deploy the app by opening a command line, navigating to where the yml file is located and running
C:\kubectl\kubectl.exe apply -f sampleapi.yml
- To expose the API outside of the cluster, run the following command
C:\kubectl\kubectl.exe expose deployments sampleapi-deployment –port=80 –type=LoadBalancer
- Periodically check whether the service is exposed. Keep running this command until the service gets an External-IP
C:\kubectl\kubectl.exe get services

- Once the service is exposed, obtain its external IP (i.e. xxx.xxx.xxx.xxx) and check whether you can access the api by using either Rest client (i.e. Postman) or simply opening a web browser and entering:
http://xxx.xxx.xxx.xxx/api/values
Running Web API using Docker and Kubernetes的更多相关文章
- Gitlab CI 自动部署 asp.net core web api 到Docker容器
为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...
- 如何将.NET 4.0写的Windows service和Web API部署到docker上面
Web API. 看这篇文章: https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc Win ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- Docker容器环境下ASP.NET Core Web API
Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
- 在Docker容器中运行.Net Core web Api项目
安装Docker环境 参考本人这篇<CentOS 7 下Docker的安装>文章进行安装以及环境配置,这里不做赘述. 通过.NetCore开发WebApi项目 1. 创建.Net Core ...
- 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署
部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...
- .net core 微服务架构-docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务(asp.net core web api)
本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构,部署的微服务主要包括统一网关(使用Ocelot开发).统一认证(IdentityServer4).应用服务(asp.net c ...
随机推荐
- P1440 求m区间内的最小值--洛谷luogu
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- ODOO(ERP源码安装)
cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 IP:192.1 ...
- 【LOJ 3049】「十二省联考 2019」字符串问题
这个D1T2绝对有毒... 首先我们构造一把反串的后缀自动机. 然后我们就需要找到每一个子串在SAM上的节点. 这个可以通过扫描线+树上倍增处理. 首先我们把所有的子串按照左端点排序, 然后从右往左扫 ...
- Android测试(一):在Android中测试App
原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...
- mysql 实现树形的遍历
前言:关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经常会遇到的头痛问题,下面通过存储过程 ...
- Windows下安装RabbitMQ报错:unable to perform an operation on node时的解决方案
在计算机领域中,想要程序完成各种功能,那么数据的交流和计算是非常重要的.现在已知的程序动作机制有协程,线程和进程. 在同一个程序中,或者说同一个进程中,数据的交流,传递,计算是非常的简单,只要把相关数 ...
- IDEA搭建本地服务器解决无法连接https://start.spring.io
通过IntellJ IDEA创建Spring Boot项目时,发生以下的问题.如图: 报错: 也许你搜到的都是诸如此类的回答: 在学习springboot的时候,使用IDEA的快速新建springbo ...
- vim 正则非贪婪模式
比如多匹配使用 .* 效果自然是贪婪模式,JS 的非贪婪很简单,是 .*? 即可,而 vim 不同,语法是 .\{-},注意 \ 转义.
- 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享
福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...