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

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 的包定义结构如下:

$ 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的部署实例。

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

Helm Architecture

从上面这张图中我们可以看到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安装,命令如下
choco install kubernetes-helm
在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

3.2. 安装 Nginx ingress controller

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,如下图所示。

Chart List

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

$ 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

3.4. 验证部署

使用kubectl get deployment可以查看所有的弹性部署,使用kubectl get ingress可以查看通过ingress暴露的所有服务,使用kubectl get pod,可以查看所有运行的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有两种方式一种是基于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集群节点

4.2. AKS 中安装 Helm

AKS上和本机一样需要安装Helm,不过AKS上主要是要用到服务端(Tiller)以便进行Release的管理。不过好消息是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 #指定使用上面创建的ServiceAccount

4.3. 部署 eShopOnContainers 到 AKS

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

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

4.4. 验证部署

执行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,删除最开始创建的资源组。

5. 总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容