
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 |
对于Helm,还有两个基本概念:Repository和Release。Repository是Helm Chart的存储仓库,Release是指Chart的部署实例。
另外,Helm包括两个部分:Client(客户端)和Tiller(服务端)。客户端用于管理Chart,服务端用于管理Release。

从上面这张图中我们可以看到Tiller通过API与Kubernetes进行交互,来完成Chart包的部署。
以上就是Helm的简单介绍,若需深入了解,请访问官网Helm。
3. 使用Helm Chart 部署 eShopOnContainers 到 K8S
下面就直接按照装官方文档Deploying-to-Kubernetes-(AKS-and-local)-using-Helm-Charts进行实操。
3.1. 安装Helm
毫无疑问,我们首先得本地安装Helm,建议直接使用Chocolatey安装,命令如下
1 | 在K8S中提供了认证机制,以确保应用程序的安全访问。Tiller要想与K8S建立连接进行交互,就必须提前在K8S中创建一个ServiceAccount并分配给Tiller以完成基于角色的访问控制(RBAC)。 |
在k8s目录下执行以下命令,完成ServiceAccount的创建
$ kubectl apply -f helm-rbac.yaml # 创建名为tiller的ServiceAccount
安装Tiller(Helm服务端),并指定使用上面创建的ServiceAccount
$ helm init –service-account tiller
1 |
|
$ .\deploy-ingress.ps1
$ .\deploy-ingress-dockerlocal.ps1
1 | ## 3.3. 使用 Helm 部署 eShopOnContainers |
$ 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
1 | ## 3.4. 验证部署 |
$ 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集群节点
1 | ## 4.2. AKS 中安装 Helm |
4.3. 部署 eShopOnContainers 到 AKS
k8s/helm文件夹打开Powershell执行以下脚本即可一键部署:
1 | $ .\deploy-all.ps1 -externalDns aks -aksName eshop -aksRg aks-group -imageTag dev |
4.4. 验证部署
执行kubectl get ingress:
1 | $ kubectl get ingress |
等所有的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,删除最开始创建的资源组。
5. 总结
That’s all?
虽然成功将eShopOnContainers部署到云上,但一点也高兴不起来。从开发到部署再到运维,发现到处都是学不完的技术债。哎,谁让你当初非要当程序员呢?