【编者的话】“三点钟区块链”无疑成为了大家春节期间焦虑的根源,而“区块链”注定是2018年被持续讨论、关注的行业性热点话题。今天主要来谈一谈如何使用Helm在Kubernetes部署区块链。
Webjet是一家在线旅行社,负责管理澳大利亚和新西兰每天数以千计的旅行预订。在过去的一年中,微软和Webjet通过利用区块链技术合作,帮助Webjet解决酒店预订处理和管理方面的低效问题。你可以从相关新闻报道来了解更多关于我们合作的相关信息。有关更多技术细节,请猛戳这里Build 2017的演讲。
随着Webjet继续增加其区块链部署,他们开始碰到其基础架构即服务(IaaS)体系结构的一些缺陷。为此,我们最近与Webjet合作将其部署迁移到Kubernetes。在本文中,我们将分享从IaaS迁移到Kubernetes的经验教训,解释我们如何使用Helm将私有Ethereum网络部署到Kubernetes,并展示如何使用Helm部署自己的私有以太网网络。
由于基于各种指标的自动缩放的虚拟机缩放集(VMSS)功能,Webjet选择将他们的私有以太网网络托管在一系列VMSS上,每个VMSS都运行由Docker Compose编排的Docker容器。GitHub上提供了一个通用版本的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利用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,然后运行 helm create 以搭建新图表。要迁移现有的YAML manifests,请将manifests复制到Helm文件夹结构并添加下面列出的以下标签:图表标准标签。 对于部署图表来说虽然这些标签是非必需的,但建议保持一致。下一步是对可以覆盖的配置和设置进行模板化。有关更多详细信息,请参阅图表最佳实践指南。
借助Helm,每个图表都是可单独管理的单位。Webjet将他们的架构分成多个Helm图表,这样他们可以单独升级。例如,我们为以太坊网络(Miners,EthStats,Bootnode)制作了单独的图表,另一个用于Blockchain Watcher,一个用于部署其存储(SQL)等。在多个Helm图表中共享的工件(例如,Secrets,ConfigMaps )被标记为图表中的依赖关系requirement.yaml。
Helm是由两个部分组成:一个客户端CLI(helm)和服务器(tiller)。通过acs-engine或ACS / AKS在Azure上部署Kubernetes集群的一个优点是默认情况下,集群将预先配置Tiller。对于尚未初始化的群集,可以执行如下命令helm init。
要安装图表,你可以运行 helm install,它将从官方Charts版本库中搜索并安装图表。我们与Webjet一起开发的以太坊图表可以在GitHub上找到,并且一旦这个拉取请求 merged,你就可以使用以下方法将私有以太网络安装到你的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 "blob-code-inner annotated">geth.account.privateKey=[PRIVATE_KEY]
--set "blob-code-inner annotated">geth.account."">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存储库来托管你的私人图表。
本文解释了Webjet如何将其部署迁移到Kubernetes,并展示如何使用Helm来简化托管在Kubernetes上的应用程序的部署和管理。在Azure上使用Kubernetes大大简化了Webjet的部署过程。我们使用Helm的解决方案不需要Webjet来管理他们自己的部署脚本,并且可以利用社区提供的许多现有图表。
图表可以提交给图表注册表并与社区共享。文章中显示的以太坊图表是开源的,并且存在一个将其添加到Charts注册表的GITHUB的开放请求。此图部署了简化的以太坊专用网络; 为了以更高可用的方式部署网络,请参考此图表。
原文链接:Using Helm to Deploy Blockchain to Kubernetes 翻译:dssky2008