断断续续,感受这个系列又要半途而废了。趁着假期,赶忙再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现你们常说的微服务上云。node
读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同窗,想必对K8S有了个大体了解。K8S引入了Pod、Service、ReplicationSet等概念,来简化容器的编排工做。然而,发布一个应用,依旧很繁琐,好比要定义Pod,要关心如何暴露Service,如何自动伸缩。更不用说一个包括多个模块(Web、DB)的的复杂应用了,想想要维护一堆yaml
文件,就很奔溃。为了解决这一个问题,Helm横空出世。
Helm 简单来讲就像NuGet包管理器,经过NuGet包管理器,咱们能够很容易的管理依赖,借助它能够很方便的查找、安装、卸载、升级、降级须要的包。只不过Helm管理的包,叫作Helm Chart。
Chart 的包定义结构以下:nginx
$ helm create mongodb $ tree mongodb mongodb ├── Chart.yaml #Chart自己的版本和配置信息 ├── charts #依赖的chart ├── templates #配置模板目录 │ ├── NOTES.txt #helm提示信息 │ ├── _helpers.tpl #用于修改kubernetes objcet配置的模板 │ ├── deployment.yaml #kubernetes Deployment object │ └── service.yaml #kubernetes Serivce └── values.yaml #kubernetes object configuration
对于Helm,还有两个基本概念:Repository和Release。Repository是Helm Chart的存储仓库,Release是指Chart的部署实例。git
另外,Helm包括两个部分:Client(客户端)和Tiller(服务端)。客户端用于管理Chart,服务端用于管理Release。程序员
从上面这张图中咱们能够看到Tiller经过API与Kubernetes进行交互,来完成Chart包的部署。github
以上就是Helm的简单介绍,若需深刻了解,请访问官网Helm。web
下面就直接按照装官方文档Deploying-to-Kubernetes-(AKS-and-local)-using-Helm-Charts进行实操。sql
毫无疑问,咱们首先得本地安装Helm,建议直接使用Chocolatey
安装,命令以下
choco install kubernetes-helm
。
在K8S中提供了认证机制,以确保应用程序的安全访问。Tiller要想与K8S创建链接进行交互,就必须提早在K8S中建立一个ServiceAccount并分配给Tiller以完成基于角色的访问控制(RBAC)。mongodb
# 在k8s目录下执行如下命令,完成ServiceAccount的建立 $ kubectl apply -f helm-rbac.yaml # 建立名为tiller的ServiceAccount # 安装Tiller(Helm服务端),并指定使用上面建立的ServiceAccount $ helm init --service-account tiller
Ingress是用来暴露服务的,本质上和Service相似,可是一个Service只能够暴露一个服务,而一个Ingress能够暴露多个服务,Ingress能够根据请求的主机名和路径进行请求转发。但建立Ingress的前提是K8S必须已经有相应的Ingress Controller运行。然而,Dockers-For-Windows中默认并未提供Ingress Controller。咱们能够在/k8s
目录下执行如下脚本,以安装Nginx ingress controller。 ``` $ .\deploy-ingress.ps1 $ .\deploy-ingress-dockerlocal.ps1 ``` ## 3.3. 使用 Helm 部署 eShopOnContainers 在项目
k8s\Helm`文件夹下,已经分别为eShopOnContainers的各个部分定义了相应的Chart,以下图所示。
docker
仅需执行.\deploy-all.ps1 -imageTag dev -useLocalk8s $true
脚本,便可一键部署。等脚本执行完毕,能够执行helm list
来查看全部的release。shell
$ helm list NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE eshop-apigwmm 1 Fri Apr 5 16:55:45 2019 DEPLOYED apigwmm-0.1.0 1.0 default eshop-apigwms 1 Fri Apr 5 16:55:46 2019 DEPLOYED apigwms-0.1.0 1.0 default eshop-apigwwm 1 Fri Apr 5 16:55:47 2019 DEPLOYED apigwwm-0.1.0 1.0 default eshop-apigwws 1 Fri Apr 5 16:55:48 2019 DEPLOYED apigwws-0.1.0 1.0 default eshop-basket-api 1 Fri Apr 5 16:55:49 2019 DEPLOYED basket-api-0.1.0 1.0 default eshop-basket-data 1 Fri Apr 5 16:55:44 2019 DEPLOYED basket-data-0.1.0 1.0 default eshop-catalog-api 1 Fri Apr 5 16:55:50 2019 DEPLOYED catalog-api-0.1.0 1.0 default eshop-identity-api 1 Fri Apr 5 16:55:51 2019 DEPLOYED identity-api-0.1.0 1.0 default eshop-keystore-data 1 Fri Apr 5 16:55:43 2019 DEPLOYED keystore-data-0.1.0 1.0 default eshop-locations-api 1 Fri Apr 5 16:55:52 2019 DEPLOYED locations-api-0.1.0 1.0 default eshop-marketing-api 1 Fri Apr 5 16:55:53 2019 DEPLOYED marketing-api-0.1.0 1.0 default eshop-mobileshoppingagg 1 Fri Apr 5 16:55:54 2019 DEPLOYED mobileshoppingagg-0.1.0 1.0 default eshop-nosql-data 1 Fri Apr 5 16:55:42 2019 DEPLOYED nosql-data-0.1.0 1.0 default eshop-ordering-api 1 Fri Apr 5 16:55:55 2019 DEPLOYED ordering-api-0.1.0 1.0 default eshop-ordering-backgroundtasks 1 Fri Apr 5 16:55:56 2019 DEPLOYED ordering-backgroundtasks-0.1.0 1.0 default eshop-ordering-signalrhub 1 Fri Apr 5 16:55:57 2019 DEPLOYED ordering-signalrhub-0.1.0 1.0 default eshop-payment-api 1 Fri Apr 5 16:55:58 2019 DEPLOYED payment-api-0.1.0 1.0 default eshop-rabbitmq 1 Fri Apr 5 16:55:42 2019 DEPLOYED rabbitmq-0.1.0 1.0 default eshop-sql-data 1 Fri Apr 5 16:55:41 2019 DEPLOYED sql-data-0.1.0 1.0 default eshop-webhooks-api 1 Fri Apr 5 16:56:03 2019 DEPLOYED webhooks-api-0.1.0 1.0 default eshop-webhooks-web 1 Fri Apr 5 16:56:04 2019 DEPLOYED webhooks-web-0.1.0 1.0 default eshop-webmvc 1 Fri Apr 5 16:55:59 2019 DEPLOYED webmvc-0.1.0 1.0 default eshop-webshoppingagg 1 Fri Apr 5 16:56:00 2019 DEPLOYED webshoppingagg-0.1.0 1.0 default eshop-webspa 1 Fri Apr 5 16:56:01 2019 DEPLOYED webspa-0.1.0 1.0 default eshop-webstatus 1 Fri Apr 5 16:56:02 2019 DEPLOYED webstatus-0.1.0 1.0 default
使用kubectl get deployment
能够查看全部的弹性部署,使用kubectl get ingress
能够查看经过ingress暴露的全部服务,使用kubectl get pod
,能够查看全部运行的pod,等全部的pod的STATUS均为Running时,就能够直接经过http://localhost访问应用了,也能够访问http://localhost/webstatus监控应用运行状态。
至此,已成功部署eShopOnContainers到本地K8S集群。
微服务不上云简直就是浪费感情。有了本地部署的经验,那么部署上云也就简单了。除了须要额外建立并配置AKS(Azure Kubernetes Service)外,其余步骤都一模一样。
下面就来梳理下如何部署应用到AKS集群上。
首先你得有Azure帐号,这是第一步,若是没有请自行前往https://azure.microsoft.com/zh-cn/申请免费帐号把玩。
建立AKS有两种方式一种是基于Azure CLI
,一种是直接经过门户网站直接建立。这里使用第一种方式。
首先确保本地安装Azure CLI,可以使用choco install azure-cli
安装。下面直接经过命令演示。
$ az login #登陆Azure,完成客户端认证 $ az group create --name aks-group --location eastasia #在East Asia 建立资源组 $ az aks create ` --resource-group aks-group ` --name eshop ` --node-count 1 ` --enable-addons http_application_routing,monitoring ` # 启用Http Routing(包含Ingress Controller和External-DNS)和监控 --generate-ssh-keys # 建立 ask 集群 $ az aks get-credentials --resource-group aks-group --name eshop # 获取证书以便从本地链接到AKS集群 $ kubectl config current-context # 查看当前上下文是否是eshop $ kubectl get nodes # 获取aks集群节点
AKS上和本机同样须要安装Helm,不过AKS上主要是要用到服务端(Tiller)以便进行Chart的管理。不过好消息是AKS上Helm Client默认已经安装好了,因此只须要安装Tiller就Ok了。
helm-rbac.yaml
来建立ServiceAccount。直接执行kubectl apply -f .\helm-rbac.yaml
。helm init --service-account tiller #指定使用上面建立的ServiceAccount
k8s/helm
文件夹打开Powershell执行如下脚本便可一键部署:
$ .\deploy-all.ps1 -externalDns aks -aksName eshop -aksRg aks-group -imageTag dev
执行kubectl get ingress
:
$ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE eshop-apigwmm eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 45s eshop-apigwms eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 44s eshop-apigwwm eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 42s eshop-apigwws eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 41s eshop-identity-api eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 38s eshop-webhooks-api eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 24s eshop-webhooks-web eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 23s eshop-webmvc eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 29s eshop-webspa eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 27s eshop-webstatus eshop.23a0868cb60a45e18d24.eastasia.aksapp.io 13.70.31.45 80 25s
等全部的pod都处于Running状态时,就能够直接经过Hosts:eshop.23a0868cb60a45e18d24.eastasia.aksapp.io
来访问应用了。
若是测试登陆,可能会遭遇502 Bad Gateway
,这是由于Identity Server 发送的请求头数据包超过了AKS中Nginx Ingress Controller的默认设置,能够直接/k8s/helm
目录执行kubectl apply -f aks-httpaddon-cfg.yaml
来解决这个问题。
玩耍了一段时间后,别忘了清理资源,毕竟上云是要RMB的啊。执行az group delete -n aks-group
,删除最开始建立的资源组。
That's all? 虽然成功将eShopOnContainers部署到云上,但一点也高兴不起来。从开发到部署再到运维,发现处处都是学不完的技术债。哎,谁让你当初非要当程序员呢?