使用Helm在Kubernetes上部署区块链

 王杰 译 分布式实验室 

使用Helm在Kubernetes上部署区块链


“三点钟区块链”无疑成为了大家春节期间焦虑的根源,而“区块链”注定是2018年被持续讨论、关注的行业性热点话题。今天主要来谈一谈如何使用Helm在Kubernetes上部署区块链。

背景

使用Helm在Kubernetes上部署区块链


Webjet[1]是一家在线旅行社,负责管理澳大利亚和新西兰每天数以千计的旅行预订。在过去的一年中,微软和Webjet通过利用区块链技术合作,帮助Webjet解决酒店预订处理和管理方面的低效问题。你可以从相关新闻报道来了解更多关于我们合作的相关信息。有关更多技术细节,请看下面视频。
使用Helm在Kubernetes上部署区块链
https://v.qq.com/x/page/k0600vmf6k9.html随着Webjet继续增加其区块链部署,他们开始碰到其基础架构即服务(IaaS)体系结构的一些缺陷。为此,我们最近与Webjet合作将其部署迁移到Kubernetes。在本文中,我们将分享从IaaS迁移到Kubernetes的经验教训,解释我们如何使用Helm将私有Ethereum[2]网络部署到Kubernetes,并展示如何使用Helm部署自己的私有以太网网络。

通往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原生支持滚动升级的特点来升级服务。

构建

使用Helm在Kubernetes上部署区块链


在将现有的Docker Compose manifest迁移到Kubernetes之后,我们落地了以下架构:

使用Helm在Kubernetes上部署区块链


上图显示了映射到Kubernetes构建的私有以太坊网络的体系结构。蓝色代表Kubernetes Services,红色代表Kubernetes Deployments,而绿色和黄色分别代表Kubernetes Secrets和ConfigMaps。
每当Webjet需要部署新的以太坊网络时,都需要对YAML定义进行一系列配置更新。这些更改包括以太坊成因文件,应用程序密码和Geth私钥。Webjet最初使用shell脚本完成此任务,该脚本将搜索并替换配置值,然后使用kubectl create执行部署 。在使用Webjet进行hackfest期间,我们使用Helm来管理而不是YAML定义的模板化。

Helm是什么

使用Helm在Kubernetes上部署区块链


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在Kubernetes上部署区块链

请注意,geth.account.publicKey,geth.account.privateKey和geth.account.secret是必需的配置。要创建新的Geth帐户,请参阅https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts。

使用Helm在Kubernetes上部署区块链


你现在在Kubernetes群集中运行了一个私有以太坊网络。
值得一提的是,该图表部署了一个未连接到MainNet的私有以太坊网络。
使用Webjet,他们的图表被委托给一个Git仓库,所有的部署都是通过向Chart提供一个本地文件路径来使用Helm来启动的。但是,也可以轻松配置专用Helm Charts存储库[12]来托管你的私人图表。

最后

使用Helm在Kubernetes上部署区块链


本文解释了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


原文链接:https://www.microsoft.com/developerblog/2018/02/09/using-helm-deploy-blockchain-kubernetes/


上一篇:换马甲:十分钟 Helm 变 Operator


下一篇:Centos7.7下KubeSphere最小化安装