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。
從上面這張圖中我們可以看到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)。
# 在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,如下圖所示。
僅需執行 .\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. 驗證部署
使用 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
安裝。下麵直接透過命令演示。
$ 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)以便進行Chart的管理。不過好訊息是AKS上Helm Client預設已經安裝好了,所以只需要安裝Tiller就Ok了。
- 首先建立ServiceAccount,用於K8S與Tiller的認證 我們可以簡單使用專案k8s檔案夾下現有的
helm-rbac.yaml
來建立ServiceAccount。直接執行kubectl apply-f.\helm-rbac.yaml
。 - 建立Tiller
helm init--service-account tiller
4.3. 部署 eShopOnContainers 到 AKS
k8s/helm
檔案夾開啟Powershell執行以下指令碼即可一鍵部署:
$ .\deploy-all.ps1 -externalDns aks -aksName eshop -aksRg aks-group -imageTag dev
4.4. 驗證部署
執行 kubectlgetingress
:
$ 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來訪問應用了。如果測試登入,可能會遭遇 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部署到雲上,但一點也高興不起來。從開發到部署再到運維,發現到處都是學不完的技術債。哎,誰讓你當初非要當程式員呢?
朋友會在“發現-看一看”看到你“在看”的內容