斷斷續續,感受這個系列又要半途而廢了。趁着假期,趕忙再更一篇,介紹下如何將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部署到雲上,但一點也高興不起來。從開發到部署再到運維,發現處處都是學不完的技術債。哎,誰讓你當初非要當程序員呢?