eShopOnContainers 知多少[10]:部署到 K8S | AKS

640?wx_fmt=png

1. 引言

断断续续,感觉这个系列又要半途而废了。趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云。

2. 先了解下 Helm

读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同学,想必对K8S有了个大致了解。K8S引入了Pod、Service、ReplicationSet等概念,来简化容器的编排工作。然而,发布一个应用,依旧很繁琐,比如要定义Pod,要关心如何暴露Service,如何自动伸缩。更不用说一个包括多个模块(Web、DB)的的复杂应用了,想一想要维护一堆 yaml文件,就很奔溃。为了解决这一个问题,Helm横空出世。Helm 简单来说就像NuGet包管理器,通过NuGet包管理器,我们可以很容易的管理依赖,借助它可以很方便的查找、安装、卸载、升级、降级需要的包。只不过Helm管理的包,叫做Helm Chart。Chart 的包定义结构如下:

  1. $ helm create mongodb

  2. $ tree mongodb

  3. mongodb

  4. ├── Chart.yaml #Chart本身的版本和配置信息

  5. ├── charts #依赖的chart

  6. ├── templates #配置模板目录

  7. ├── NOTES.txt #helm提示信息

  8. ├── _helpers.tpl #用于修改kubernetes objcet配置的模板

  9. ├── deployment.yaml #kubernetes Deployment object

  10. └── service.yaml #kubernetes Serivce

  11. └── values.yaml #kubernetes object configuration

对于Helm,还有两个基本概念:Repository和Release。Repository是Helm Chart的存储仓库,Release是指Chart的部署实例。

另外,Helm包括两个部分:Client(客户端)和Tiller(服务端)。客户端用于管理Chart,服务端用于管理Release。

640?wx_fmt=png

从上面这张图中我们可以看到Tiller通过API与Kubernetes进行交互,来完成Chart包的部署。

以上就是Helm的简单介绍,若需深入了解,请访问官网Helm。

3. 使用Helm Chart 部署 eShopOnContainers 到 K8S

下面就直接按照装官方文档Deploying-to-Kubernetes-(AKS-and-local)-using-Helm-Charts-using-Helm-Charts) )进行实操。

3.1. 安装Helm

毫无疑问,我们首先得本地安装Helm,建议直接使用 Chocolatey安装,命令如下 choco install kubernetes-helm。在K8S中提供了认证机制,以确保应用程序的安全访问。Tiller要想与K8S建立连接进行交互,就必须提前在K8S中创建一个ServiceAccount并分配给Tiller以完成基于角色的访问控制(RBAC)。

  1. # 在k8s目录下执行以下命令,完成ServiceAccount的创建

  2. $ kubectl apply -f helm-rbac.yaml # 创建名为tiller的ServiceAccount

  3. # 安装Tiller(Helm服务端),并指定使用上面创建的ServiceAccount

  4. $ helm init --service-account tiller

3.2. 安装 Nginx ingress controller

Ingress是用来暴露服务的,本质上和Service类似,但是一个Service只可以暴露一个服务,而一个Ingress可以暴露多个服务,Ingress可以根据请求的主机名和路径进行请求转发。但创建Ingress的前提是K8S必须已经有相应的Ingress Controller运行。然而,Dockers-For-Windows中默认并未提供Ingress Controller。我们可以在 /k8s目录下执行以下脚本,以安装`Nginx ingress controller。

  1. $ .\deploy-ingress.ps1

  2. $ .\deploy-ingress-dockerlocal.ps1

3.3. 使用 Helm 部署 eShopOnContainers

在项目 k8s\Helm文件夹下,已经分别为eShopOnContainers的各个部分定义了相应的Chart,如下图所示。

640?wx_fmt=png

仅需执行 .\deploy-all.ps1-imageTag dev-useLocalk8s $true脚本,即可一键部署。等脚本执行完毕,可以执行 helm list来查看所有的release。

  1. $ helm list

  2. NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE

  3. eshop-apigwmm 1 Fri Apr 5 16:55:45 2019 DEPLOYED apigwmm-0.1.0 1.0 default

  4. eshop-apigwms 1 Fri Apr 5 16:55:46 2019 DEPLOYED apigwms-0.1.0 1.0 default

  5. eshop-apigwwm 1 Fri Apr 5 16:55:47 2019 DEPLOYED apigwwm-0.1.0 1.0 default

  6. eshop-apigwws 1 Fri Apr 5 16:55:48 2019 DEPLOYED apigwws-0.1.0 1.0 default

  7. eshop-basket-api 1 Fri Apr 5 16:55:49 2019 DEPLOYED basket-api-0.1.0 1.0 default

  8. eshop-basket-data 1 Fri Apr 5 16:55:44 2019 DEPLOYED basket-data-0.1.0 1.0 default

  9. eshop-catalog-api 1 Fri Apr 5 16:55:50 2019 DEPLOYED catalog-api-0.1.0 1.0 default

  10. eshop-identity-api 1 Fri Apr 5 16:55:51 2019 DEPLOYED identity-api-0.1.0 1.0 default

  11. eshop-keystore-data 1 Fri Apr 5 16:55:43 2019 DEPLOYED keystore-data-0.1.0 1.0 default

  12. eshop-locations-api 1 Fri Apr 5 16:55:52 2019 DEPLOYED locations-api-0.1.0 1.0 default

  13. eshop-marketing-api 1 Fri Apr 5 16:55:53 2019 DEPLOYED marketing-api-0.1.0 1.0 default

  14. eshop-mobileshoppingagg 1 Fri Apr 5 16:55:54 2019 DEPLOYED mobileshoppingagg-0.1.0 1.0 default

  15. eshop-nosql-data 1 Fri Apr 5 16:55:42 2019 DEPLOYED nosql-data-0.1.0 1.0 default

  16. eshop-ordering-api 1 Fri Apr 5 16:55:55 2019 DEPLOYED ordering-api-0.1.0 1.0 default

  17. eshop-ordering-backgroundtasks 1 Fri Apr 5 16:55:56 2019 DEPLOYED ordering-backgroundtasks-0.1.0 1.0 default

  18. eshop-ordering-signalrhub 1 Fri Apr 5 16:55:57 2019 DEPLOYED ordering-signalrhub-0.1.0 1.0 default

  19. eshop-payment-api 1 Fri Apr 5 16:55:58 2019 DEPLOYED payment-api-0.1.0 1.0 default

  20. eshop-rabbitmq 1 Fri Apr 5 16:55:42 2019 DEPLOYED rabbitmq-0.1.0 1.0 default

  21. eshop-sql-data 1 Fri Apr 5 16:55:41 2019 DEPLOYED sql-data-0.1.0 1.0 default

  22. eshop-webhooks-api 1 Fri Apr 5 16:56:03 2019 DEPLOYED webhooks-api-0.1.0 1.0 default

  23. eshop-webhooks-web 1 Fri Apr 5 16:56:04 2019 DEPLOYED webhooks-web-0.1.0 1.0 default

  24. eshop-webmvc 1 Fri Apr 5 16:55:59 2019 DEPLOYED webmvc-0.1.0 1.0 default

  25. eshop-webshoppingagg 1 Fri Apr 5 16:56:00 2019 DEPLOYED webshoppingagg-0.1.0 1.0 default

  26. eshop-webspa 1 Fri Apr 5 16:56:01 2019 DEPLOYED webspa-0.1.0 1.0 default

  27. eshop-webstatus 1 Fri Apr 5 16:56:02 2019 DEPLOYED webstatus-0.1.0 1.0 default

3.4. 验证部署

使用 kubectlgetdeployment可以查看所有的弹性部署,使用 kubectlgetingress可以查看通过ingress暴露的所有服务,使用 kubectlgetpod,可以查看所有运行的pod,等所有的pod的STATUS均为Running时,就可以直接通过http://localhost访问应用了,也可以访问http://localhost/webstatus监控应用运行状态。

至此,已成功部署eShopOnContainers到本地K8S集群。

4. 上云

微服务不上云简直就是浪费感情。有了本地部署的经验,那么部署上云也就简单了。除了需要额外创建并配置AKS(Azure Kubernetes Service)外,其他步骤都如出一辙。下面就来梳理下如何部署应用到AKS集群上。

首先你得有Azure账号,这是第一步,如果没有请自行前往https://azure.microsoft.com/zh-cn/申请免费账号把玩。

4.1. 创建AKS

创建AKS有两种方式一种是基于 AzureCLI,一种是直接通过门户网站直接创建。这里使用第一种方式。首先确保本地安装Azure CLI,可使用 choco install azure-cli安装。下面直接通过命令演示。

  1. $ az login #登录Azure,完成客户端认证

  2. $ az group create --name aks-group --location eastasia #在East Asia 创建资源组

  3. $ az aks create `

  4. --resource-group aks-group `

  5. --name eshop `

  6. --node-count 1 `

  7. --enable-addons http_application_routing,monitoring ` # 启用Http Routing(包含Ingress Controller和External-DNS)和监控

  8. --generate-ssh-keys # 创建 ask 集群

  9. $ az aks get-credentials --resource-group aks-group --name eshop # 获取证书以便从本地连接到AKS集群

  10. $ kubectl config current-context # 查看当前上下文是不是eshop

  11. $ kubectl get nodes # 获取aks集群节点

4.2. AKS 中安装 Helm

AKS上和本机一样需要安装Helm,不过AKS上主要是要用到服务端(Tiller)以便进行Chart的管理。不过好消息是AKS上Helm Client默认已经安装好了,所以只需要安装Tiller就Ok了。

  1. 首先创建ServiceAccount,用于K8S与Tiller的认证 我们可以简单使用项目k8s文件夹下现有的 helm-rbac.yaml来创建ServiceAccount。直接执行 kubectl apply-f.\helm-rbac.yaml

  2. 创建Tiller helm init--service-account tiller

4.3. 部署 eShopOnContainers 到 AKS

k8s/helm文件夹打开Powershell执行以下脚本即可一键部署:

  1. $ .\deploy-all.ps1 -externalDns aks -aksName eshop -aksRg aks-group -imageTag dev

4.4. 验证部署

执行 kubectlgetingress

  1. $ kubectl get ingress

  2. NAME HOSTS ADDRESS PORTS AGE

  3. eshop-apigwmm eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 45s

  4. eshop-apigwms eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 44s

  5. eshop-apigwwm eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 42s

  6. eshop-apigwws eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 41s

  7. eshop-identity-api eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 38s

  8. eshop-webhooks-api eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 24s

  9. eshop-webhooks-web eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 23s

  10. eshop-webmvc eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 29s

  11. eshop-webspa eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 27s

  12. eshop-webstatus eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 25s

等所有的pod都处于Running状态时,就可以直接通过Hosts:eshop.23a0868cb60a45e18d24.eastasia.aksapp.io来访问应用了。如果测试登录,可能会遭遇 502BadGateway,这是因为Identity Server 发送的请求头数据包超过了AKS中Nginx Ingress Controller的默认设置,可以直接 /k8s/helm目录执行 kubectl apply-f aks-httpaddon-cfg.yaml来解决这个问题。

玩耍了一段时间后,别忘了清理资源,毕竟上云是要RMB的啊。执行 azgroupdelete-n aks-group,删除最开始创建的资源组。

5. 总结

That's all?虽然成功将eShopOnContainers部署到云上,但一点也高兴不起来。从开发到部署再到运维,发现到处都是学不完的技术债。哎,谁让你当初非要当程序员呢?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DI是实现面向切面和面向抽象的前提

DI越来越重要DI就是依赖注入,现在来说,大部分框架都是以DI为基础组件的,每一个框架都有自己的DI组件,像dotnet core,java spring等,也都为自己的框架量身打造了DI工具。面向对象的几个原则依赖倒置原则&…

.net core 并发下的线程安全问题

抱歉,其实内容并不如题!!!背景(写测试demo所出现的异常,供大家学习与拍砖):.net core webapi项目,做了一个授权的filter(真正的生产项目的话,JWT很…

cf1555B. Two Tables

cf1555B. Two Tables 题意: 一个大矩阵空间内放置一个矩阵a,现在要再往这个空间内放一个矩阵b,a移动距离len才能放下b,问len最小是多少 题解: 不难发现左右或上下移动是最佳的,斜着移动是最不好的。此时…

cf1555C Coin Rows

cf1555C Coin Rows 题意: 有一个两行m列的地图,每个格子都有对应的价值,有a,b两个人,都从左上角到右下角,且都只能向右向下走,a先出发,a每到一个格子,就会获得这个地方…

C#并行编程(2):.NET线程池

线程 Thread在总结线程池之前,先来看一下.NET线程。.NET线程与操作系统(Windows)线程有什么区别?.NET利用Windows的线程处理功能。在C#程序编写中,我们首先会新建一个线程对象System.Threading.Thread,并为其指定一个回调方法&…

ASP.NET Core launchsettings.json文件(8)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章:ASP.NET Core 进程外(out-of-process)托管ASP.NET Core launchsettings.json文件在本视频中,我们将讨论在ASP.NET Core项目中launchsettings.json文件的重要性。launchsettings.json文件您将在项目根文件…

[CQOI2017] 老C的方块(网络流染色建图)

problem luogu-P3756 solution 据说要做网络流 24\text{24}24 题中的《方格取数问题》和《骑士共存问题》。 ???那个不是直接最小割吗?哦原来是从黑白染色来理解的。我还是太水了。 这种题之所以能用网络流做,是因…

江湖召集:.NET开发者们看过来,这场长沙的开发者技术大会正是为你精心准备的大餐...

看过去,历史的尘埃与沧海桑田古语有云“近代中国,湖南独撑半边天”,湖南长沙,作为湖南省的省会,自古以来便是各界风云人士兴起之地。随着互联网时代的到来,长沙,这座历史悠久的文化名城&#xf…

C#并行编程(3):并行循环

初识并行循环并行循环主要用来处理数据并行的,如,同时对数组或列表中的多个数据执行相同的操作。在C#编程中,我们使用并行类System.Threading.Tasks.Parallel提供的静态方法Parallel.For和Parallel.ForEach来实现并行循环。从方法名可以看出&…

Acwing 252. 树

Acwing 252. 树 题意: 给定一个有 N 个点(编号 0,1,…,N−1)的树,每条边都有一个权值(不超过 1000)。 树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和。 求长度不超过 K 的路径有多少条…

.net 4.5部署到docker容器

.NET FX 应用程序也是可以容器化的,容器化的选项有两个:部署到windows容器部署到linux容器部署到windows容器由于.net本身就是运行在windows平台的,所以它与windows容器也是更加适合,你可以以iis镜像为基础,去编写你的…

将传统 WPF 程序迁移到 DotNetCore 3.0

介绍由于历史原因,基于 Windows 平台存在着大量的基于 .NetFramework 开发的 WPF 和 WinForm 相关程序,如果将这些程序全部基于 DotNetCore 3.0 重写一遍显然是不现实的,但是 DotNetCore 是未来发展的趋势。所以本文通过以 WPF 为例&#xff…

.NET Core 时代已经到了,你准备好了吗

今天很多人都收到了阿里云函数计算支持.NET Core的短信了。通过访问 https://help.aliyun.com/document_detail/112379.html 你可以看到最新的说明。现在和过去的两年不同,因为最恶劣的时期已经过去,经历过了最黑暗的时刻,我们正在走向光明的…

ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章:ASP.NET Core launchsettings.json文件ASP.NET Core appsettings.json文件在本视频中,我们将讨论ASP.NET Core 项目中appsettings.json文件的重要性。在以前的ASP.NET版本中,我们将应用程序配…

在Windows上使用Docker运行.NetCore

今天我们来说下如何在windows下使用docker运行.net core,既然是docker,那么我们首先得在windows上安装docker。在Windows安装 docker 有两种选择 :1、docker for windows2、docker toolbox 区别:docker for windows-64位Windows 1…

浅谈C#在网络波动时防重复提交

前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。由于网络波动而重复提交的例子也比较多:网络上,防重复提交的方法也很多&#xff0…

C#并行编程(4):基于任务的并行

C#中的任务Task在C#编程中,实现并行可以直接使用线程,但使用起来很繁琐;也可以使用线程池,线程池很大程度上简化了线程的使用,但是也有着一些局限,比如我们不知道作业什么时候完成,也取不到作业…

.net core 注入中的三种模式:Singleton、Scoped 和 Transient

从上篇内容不如题的文章《.net core 并发下的线程安全问题》扩展认识.net core注入中的三种模式:Singleton、Scoped 和 Transient我们都知道在 Startup 的 ConfigureServices 可以注入我们想要的服务,那么在注入的时候有三种模式可以选择,那么…

【西安活动】 | 4月20日「拥抱开源,又见.NET:云时代 • 新契机」

云计算日渐兴起,成为提升企业效率和生产力的最终解决方案,而云时代也为软件开发模式带来了翻天覆地的变化。可以说 .NET Core就是这个时代催生的产物。自2016年 .NET Core 1.0 发布以来,其强大的生命力让越来越多技术爱好者对她的未来满怀憧憬…

C#并行编程(5):需要知道的异步

异步与并行的联系大家知道“并行”是利用CPU的多个核心或者多个CPU同时执行不同的任务,我们不关心这些任务之间的依赖关系。但是在我们实际的业务中,很多任务之间是相互影响的,比如统计车间全年产量的运算要依赖于各月产量的统计结果。假如你…