“三点钟区块链”无疑成为了大家春节期间焦虑的根源,而“区块链”注定是2018年被持续讨论、关注的行业性热点话题。今天主要来谈一谈如何使用Helm在Kubernetes上部署区块链。
背景
https://v.qq.com/x/page/k0600vmf6k9.html随着Webjet继续增加其区块链部署,他们开始碰到其基础架构即服务(IaaS)体系结构的一些缺陷。为此,我们最近与Webjet合作将其部署迁移到Kubernetes。在本文中,我们将分享从IaaS迁移到Kubernetes的经验教训,解释我们如何使用Helm将私有Ethereum[2]网络部署到Kubernetes,并展示如何使用Helm部署自己的私有以太网网络。
通往Kubernetes的道路
难以扩展
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原生支持滚动升级的特点来升级服务。
构建
上图显示了映射到Kubernetes构建的私有以太坊网络的体系结构。蓝色代表Kubernetes Services,红色代表Kubernetes Deployments,而绿色和黄色分别代表Kubernetes Secrets和ConfigMaps。
每当Webjet需要部署新的以太坊网络时,都需要对YAML定义进行一系列配置更新。这些更改包括以太坊成因文件,应用程序密码和Geth私钥。Webjet最初使用shell脚本完成此任务,该脚本将搜索并替换配置值,然后使用kubectl create执行部署 。在使用Webjet进行hackfest期间,我们使用Helm来管理而不是YAML定义的模板化。
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之前,我已经做了图表存档:
请注意,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]来托管你的私人图表。
最后
相关链接:
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