使用Helm在Kubernetes上部署区块链

技术文章 来源:Docker 发布:2018-03-09 浏览:374

摘要:在本文中,我们将分享从IaaS迁移到Kubernetes的经验教训,解释我们如何使用Helm将私有Ethereum[2]网络部署到Kubernetes,并展示如何使用Helm部署自己的私有以太网网络。

背景

Webjet[1]是一家在线旅行社,负责管理澳大利亚和新西兰每天数以千计的旅行预订。在过去的一年中,微软和Webjet通过利用区块链技术合作,帮助Webjet解决酒店预订处理和管理方面的低效问题。你可以从相关新闻报道来了解更多关于我们合作的相关信息。有关更多技术细节,请看下面视频。

随着Webjet继续增加其区块链部署,他们开始碰到其基础架构即服务(IaaS)体系结构的一些缺陷。为此,我们最近与Webjet合作将其部署迁移到Kubernetes。在本文中,我们将分享从IaaS迁移到Kubernetes的经验教训,解释我们如何使用Helm将私有Ethereum[2]网络部署到Kubernetes,并展示如何使用Helm部署自己的私有以太网网络。

通往Kubernetes的道路

由于基于各种指标的自动缩放的虚拟机缩放集(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是什么

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

在拉取请求merged之前,我已经做了图表存档:

helm install https://japoonhelmstrg.blob.core.windows.net/public/ethereum-0.1.0.tgz 
  --set geth.account.publicKey=[PUBLIC_KEY]
  --set <span class="blob-code-inner annotated">geth.account.privateKey</span>=[PRIVATE_KEY]
  --set <span class="blob-code-inner annotated">geth.account.<span class="">secret</span></span>=[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]。

相关链接:

  1. https://www.webjet.com.au/

  2. https://www.ethereum.org/

  3. https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-overview

  4. https://github.com/EthereumEx/ethereum-arm-templates/tree/master/ethereum-consortium

  5. https://azure.microsoft.com/en-us/services/container-service/

  6. https://docs.helm.sh/using_helm/#install-helm

  7. https://docs.helm.sh/chart_best_practices/#standard-labels

  8. https://docs.helm.sh/chart_best_practices/

  9. https://docs.helm.sh/developing_charts/#chart-dependencies

  10. https://github.com/kubernetes/charts/

  11. https://github.com/kubernetes/charts/pull/3220

  12. https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md

  13. https://github.com/jpoon/kubernetes-ethereum-chart/tree/bootnode-registrar


原    文:Using Helm to Deploy Blockchain to Kubernetes
译    文:Docker
作    者:王杰 译

免责声明:

  1. SDK.cn遵循行业规范,所有转载文章均征得作者同意授权并明确标注来源和链接。
  2. 我们十分尊重原创作者的付出,本站禁止二次转载如需转载请与原作者取得联系。
  3. 转载SDK.cn的原创文章需注明文章作者、链接和"来源:SDK.cn"并保留文章及标题完整性未经作者同意不得擅自修改。
  4. 作者投稿可能会经SDK.cn适当编辑修改或补充。
推荐工具 意见反馈