“三點鐘區塊鏈”無疑成為了大家春節期間焦慮的根源,而“區塊鏈”註定是2018年被持續討論、關註的行業性熱點話題。今天主要來談一談如何使用Helm在Kubernetes上部署區塊鏈。
Webjet[1]是一家線上旅行社,負責管理澳大利亞和紐西蘭每天數以千計的旅行預訂。在過去的一年中,微軟和Webjet透過利用區塊鏈技術合作,幫助Webjet解決酒店預訂處理和管理方面的低效問題。你可以從相關新聞報道來瞭解更多關於我們合作的相關資訊。有關更多技術細節,請看下麵影片。
隨著Webjet繼續增加其區塊鏈部署,他們開始碰到其基礎架構即服務(IaaS)體系結構的一些缺陷。為此,我們最近與Webjet合作將其部署遷移到Kubernetes。在本文中,我們將分享從IaaS遷移到Kubernetes的經驗教訓,解釋我們如何使用Helm將私有Ethereum[2]網路部署到Kubernetes,並展示如何使用Helm部署自己的私有乙太網網路。
由於基於各種指標的自動縮放的虛擬機器縮放集(VMSS)功能[3],Webjet選擇將他們的私有乙太網網路託管在一系列VMSS上,每個VMSS都執行由Docker Compose編排的Docker容器。GitHub[4]上提供了一個通用版本的Webjet Azure ARM部署。然而,在Webjet將其轉化為生產的過程中,基於IaaS架構的一些缺陷(如下兩個)變得更加明顯。
Docker Compose支援為容器執行多個副本 ;但是,為了在副本之間實現負載平衡,需要管理容器主機埠對映。
在節點級別,由於VMSS的自動縮放功能可擴充套件整個節點,因此VMSS可以針對同類工作負載進行最佳工作。在機器上執行幾種不同的服務時,擴充套件/縮小VMSS會影響該機器上的所有正在執行的服務。另外,架構可以分成幾個Docker Compose檔案,並由此分成幾個VMSS,但這需要大量的預先計劃來確保硬體需求和成本的適當平衡。
升級服務意味著SSH-ing進入虛擬機器,先執行docker – compose stop,再下載新的Docker Compose manifest,隨後執行docker – compose up即可。像SaltStack這樣的配置管理工具可以用來實現這個過程的自動化,但是這個過程本身是靈活可自定義的,並且很可能出現錯誤。
由於上述原因,Webjet團隊決定透過AKS[5]利用Kubernetes來幫助自動化應用程式的部署、擴充套件和編排。藉助Kubernetes,Webjet可以擴充套件/縮小某些應用程式,並利用Kubernetes原生支援滾動升級的特點來升級服務。
在將現有的Docker Compose manifest遷移到Kubernetes之後,我們落地了以下架構:
上圖顯示了對映到Kubernetes構建的私有以太坊網路的體系結構。藍色代表Kubernetes Services,紅色代表Kubernetes Deployments,而綠色和黃色分別代表Kubernetes Secrets和ConfigMaps。
每當Webjet需要部署新的以太坊網路時,都需要對YAML定義進行一系列配置更新。這些更改包括以太坊成因檔案,應用程式密碼和Geth私鑰。Webjet最初使用shell指令碼完成此任務,該指令碼將搜尋並替換配置值,然後使用kubectl create執行部署 。在使用Webjet進行hackfest期間,我們使用Helm來管理而不是YAML定義的模板化。
Helm是Kubernetes的包管理員。該專案最初由Deis建立,並已被捐贈給雲原生計算基金會(CNCF)。話說,有趣的Deis現在已成為微軟的一員。通常情況下,應用程式由服務、部署、秘鑰等組合而成。與單獨管理這些Kubernetes資源不同,Helm提供更高階別的架構(稱為圖表)來管理整個應用程式。藉助Helm,你可以建立、升級和回滾整個應用程式,並輕鬆與同行和更大的社群共享應用程式/圖表。
使用Webjet,我們建立了Helm圖表來部署一個私有乙太網網路。要建立Helm圖表,請安裝Helm CLI[6],然後執行helm create以搭建新圖表。要遷移現有的YAML manifests,請將manifests複製到Helm檔案夾結構並新增下麵列出的以下標簽:圖表標準標簽[7]。 對於部署圖表來說雖然這些標簽是非必需的,但建議保持一致。下一步是對可以改寫的配置和設定進行模板化。有關更多詳細資訊,請參閱圖表最佳實踐指南[8]。
藉助Helm,每個圖表都是可單獨管理的單位。Webjet將他們的架構分成多個Helm圖表,這樣他們可以單獨升級。例如,我們為以太坊網路(Miners、EthStats、Bootnode)製作了單獨的圖表,另一個用於Blockchain Watcher,一個用於部署其儲存(SQL)等。在多個Helm圖表中共享的工件(例如,Secrets、ConfigMaps )被標記為圖表中的依賴關係requirement.yaml[9]。
Helm是由兩個部分組成:一個客戶端CLI(helm)和伺服器(tiller)。透過acs-engine或ACS / AKS在Azure上部署Kubernetes叢集的一個優點是預設情況下,叢集將預先配置Tiller。對於尚未初始化的群集,可以執行如下命令helm init。
要安裝圖表,你可以執行helm install,它將從官方Charts版本庫中搜索並安裝圖表[10]。我們與Webjet一起開發的以太坊圖表可以在GitHub上找到,並且一旦這個拉取請求merged[11],你就可以使用以下方法將私有乙太網絡安裝到你的Kubernetes叢集上:
helm install incubator/ethereum
helm install https:
--set geth.account.publicKey=[PUBLIC_KEY]
--set class="blob-code-inner annotated">geth.account.privateKey
=[PRIVATE_KEY]
—set class=“blob-code-inner annotated”>geth.account.class=“”>secret=[SECRET]
請註意,geth.account.publicKey,geth.account.privateKey和geth.account.secret是必需的配置。要建立新的Geth帳戶,請參閱https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts。
你現在在Kubernetes群集中運行了一個私有以太坊網路。
值得一提的是,該圖表部署了一個未連線到MainNet的私有以太坊網路。
使用Webjet,他們的圖表被委託給一個Git倉庫,所有的部署都是透過向Chart提供一個本地檔案路徑來使用Helm來啟動的。但是,也可以輕鬆配置專用Helm Charts儲存庫[12]來託管你的私人圖表。
本文解釋了Webjet如何將其部署遷移到Kubernetes,並展示如何使用Helm來簡化託管在Kubernetes上的應用程式的部署和管理。在Azure上使用Kubernetes大大簡化了Webjet的部署過程。我們使用Helm的解決方案不需要Webjet來管理他們自己的部署指令碼,並且可以利用社群提供的許多現有圖表。
圖表可以提交給圖表登錄檔並與社群共享。文章中顯示的以太坊圖表是開源的,並且存在一個將其新增到Charts登錄檔的GitHub的開放請求[11]。此圖部署了簡化的以太坊專用網路;為了以更高可用的方式部署網路,請參考此圖表[13]。
-
https://www.webjet.com.au/
-
https://www.ethereum.org/
-
https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-overview
-
https://github.com/EthereumEx/ethereum-arm-templates/tree/master/ethereum-consortium
-
https://azure.microsoft.com/en-us/services/container-service/
-
https://docs.helm.sh/using_helm/#install-helm
-
https://docs.helm.sh/chart_best_practices/#standard-labels
-
https://docs.helm.sh/chart_best_practices/
-
https://docs.helm.sh/developing_charts/#chart-dependencies
-
https://github.com/kubernetes/charts/
-
https://github.com/kubernetes/charts/pull/3220
-
https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md
-
https://github.com/jpoon/kubernetes-ethereum-chart/tree/bootnode-registrar
原文連結:https://www.microsoft.com/developerblog/2018/02/09/using-helm-deploy-blockchain-kubernetes/
本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容。
3月23日開始上課,最後8個名額,點選閱讀原文連結即可報名。
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。