vlambda博客
学习文章列表

区块链与容器技术的相遇


区块链和容器技术的初遇


区块链技术被视为一项颠覆性的软件技术,正酝酿着新一轮的技术和产业变革, 作为信息技术的新基建,我们希望能够快速地把它搬到任何需要它的地方,那如何做到呢?我们知道搭建一个软件应用系统核心需要解决问题就是部署,自然而然,我们很容易联想起容器技术,作为软件部署的一套通用解决方案,容器技术应用在区块链领域中也是顺理成章的。


我们以联盟链区块链引擎Hyperledger Fabric为例,在Fabric官方文档的示例中,可以无处不在的看到以docker容器为沙箱搭建的区块链网络示例,区块链与容器技术的相遇显得是那么的自然。在公有链中因为网络节点是分布在互联网上的分散的主机上,节点部署由其归属者管控,并无统一部署需求,而在联盟链场景,通常我们采用BaaS平台管理区块链网络的生命周期和处理统一的部署需求,容器技术在联盟链上的应用显得尤为突出。BaaS平台和区块链网络可以基于容器技术来快速构建和部署,其关系如下图所示:

区块链与容器技术的相遇



区块链和容器技术只是萍水相逢吗?

区块链与容器技术的相遇

容器领域目前主流技术是docker和kubernetes(k8s),据社区统计,其市场占用率保守估计早已达70%以上。docker负责把主机上的应用放到容器化的沙箱运行,k8s负责统一管理集群中多个主机上的容器化应用。目前云原生技术在社区非常活跃,其有三大特征:容器化封装、自动化管理、面向微服务,如果你是一位云原生社区的一员,你会注意到容器技术已然成为了云原生时代的基础设施。k8s在作为一个完备的分布式系统支撑平台,具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时,k8s提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节, 不仅减轻了以往运维压力并为DevOps思想提供了强力的支撑。


区块链技术与容器技术的相遇实际上也是与云原生技术的结合过程,容器技术可以在应用部署、资源调度、日志监控、微服务化、自动化运维、容灾可用性和服务治理等方面为区块链网络提供可靠的底层技术支撑,区块链与容器技术并非萍水相逢,其结合意义值得我们深入探索。下文我们以Fabric区块链引擎作为联盟链,k8s作为容器集群,看看Fabrick8s如何在技术细节上做深度的合作。



区块链网络的自动化部署

区块链与容器技术的相遇

和大多数其他应用一样,利用容器的封装技术,我们可以把区块链的应用程序打包成镜像,不需要担心主机环境的软件依赖,无论何时何地,只需把镜像容器拉起即可以把区块链网络节点的运行起来。作为管理区块链网络生命周期的BaaS平台,通常会把区块链网络容器的编排和部署的任务交于自动化部署服务组件处理。在一个k8s集群中,你只需把主机加入到k8s节点中,通过BaaS平台向自动部署服务组件发送部署指令即可一键完成区块链网络节点在主机上的部署,快速运行起一个区块链网络。下图展示了BaaS平台,自动部署组件以及区块链网络之间的关系:

区块链与容器技术的相遇



Fabric网络与k8s资源对象

区块链与容器技术的相遇

我们知道k8s在容器编排上抽象出了不同的资源对象概念比如namespace, deployment, pod, service。在一个k8s容器集群下,我们可以使用这些资源对象快速搭建和可靠的运行起来Fabric区块链网络,通常我们可以会做如下的资源映射:

  • 一个Fabric网络对应一个namespace

  • 一个peer节点对应一个deployment

  • 一个deployment包含一个pod,一个pod运行一个peer节点容器

  • 一个节点服务对应一个service


应用这些k8s的资源对象特性,可以轻松实现:

  • 一个k8s集群下运行N个区块链网络,namespace对区块链网络间起到资源隔离的作用

  • 一个Fabric节点容器任何时间异常退出,deployment会重新拉起恢复,节点具备了高可用性

  • Fabric网络内的节点不需要存在真实域名,k8s提供了集群内DNS服务,通过service即实现了节点间的互相访问,让区块链网络组网更快捷和灵活, k8s资源对象和Fabric网络节点的逻辑关系如下图所示:

区块链与容器技术的相遇



智能合约容器

区块链与容器技术的相遇

智能合约是区块链技术作为去中心化应用的重要体现,它允许我们在不需要第三方的情况下,执行可追溯,不可逆转和安全的交易。智能合约本质上就是一段可执行的代码或者说是一个应用程序。结合容器技术,我们很容易会把这段可执行的代码或应用程序放到容器沙箱里运行,一方面容器镜像打包非常契合智能合约的开发,编译和部署过程,容器本身在沙箱里独立运行,又便于满足对智能合约的安全性控制和审计要求,智能合约和容器是一对非常好的搭档。如果你的区块链网络是由BaaS管理,只需把合约代码上传到BaaS平台中,合约代码即可自动完成编译和镜像打包并安装到区块链节点中,一切只等智能合约运行。在k8s集群中,我们可以把一个智能合约容器绑定到k8s的pod资源上,用k8s把智能合约容器管控起来。peer节点在接收到合约调用请求后,通过调用k8s的调度接口能够轻松把合约容器在区块链网络中拉起并运转起来。



优雅的sidecar模式

区块链与容器技术的相遇

边车模式(sidecar)是微服务架构中有个一个经典的分解模式,本质就是把主程序和辅助程序分离,让应用程序更彻底的解耦,主程序和辅助程序可以独立更新。主程序和辅助程序虽然分离了,但它们并不能孤立地运行的, 需要相互通信搭配地工作。k8s的pod资源正是sidecar模式的绝佳应用,一个pod资源作为一个调度单元可以包含多个容器,我们把其中一个容器作为主程序的容器,其他任意数量的容器作为辅助程序,一个pod内的容器通过k8s内置的pause容器可以实现以下的资源共享:


PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;

网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;

IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;

UTS命名空间:Pod中的多个容器共享一个主机名;

共享存储卷:  Pod中的各个容器可以访问在Pod级别定义的Volumes;

利用该机制,辅助程序和主程序之间可以几乎无性能损耗的通信,辅助程序可以为主程序提供旁路的服务初始化、资源准备、数据存储等服务。


在Fabric区块链网络中,我们知道peer节点支持level dB和couchDB存储,其中couchdb是一个独立的有状态存储服务。为了应用解耦以便于运维和升级, peer和coughdb不适合作为单一程序或容器运行,我们希望它们作为两个独立的容器镜像但又能协同的运行,但两个镜像势必就需要运行两个容器,因此我们需要解决两个问题:

  • 两个容器不能割裂的运行,需要作为一个整体单元调度并运行,有共同的容器生命周期;

  • 个容器协同运行必然需要相互通信,但通信不能带来额外的性能损耗,应当做到如同在一个容器中运行。


我们利用k8s的pod资源,把couchdb和peer容器放到在同一个pod中,作为一个完整的调度单元统一分配到主机上运行,确保有着共同的生命周期,其中couchdb作为辅助容器为peer容器提供存储服务。由于pod内容器共享网络,两个容器有相同的容器ip,peer可以无损地调用couchdb的api接口存储数据, sidecar模式优雅的解决了以上peer的couchdb存储场景的问题。

区块链与容器技术的相遇



联盟链跨域互联场景

区块链与容器技术的相遇

k8s集群为了便于构建更易于弹性扩展的应用程序,提供了丰富的应用基础设施如跨节点容器通信、 DNS服务、服务发现、负载均衡,服务网格等云原生技术。利用这些基础设施,我们可以针对应用场景制定良好的技术实施方案,区块链跨域互联便是其中应用场景之一。跨域互联场景在联盟链更为突出,在Fabric区块链网络中,peer节点归属于某个组织,而多个组织构成了一个联盟,节点和联盟的治理需要通过BaaS平台完成,在实际场景中,联盟成员和节点往往分散在各政务单位或企业单位的跨域网络环境下,如何把BaaS平台互联起来呢?


k8s的service资源为我们提供了便捷的解决方案。services本质上在k8s集群内通过域名解析会定位到k8s集群内的pod的ip,请求方通过自解释的service服务名调用到了相应pod的服务。在一个Fabric网络中,oderder和peer通过msp的数字证书保证其唯一的节点身份,而数据证书需要上链并绑定到节点域名,顺理成章地,可以节点域名对应到k8s服务名称,节点之间通过服务名互相访问。我们设定一个BaaS平台就是一个k8s集群,在一个k8s集群内,我们把远端的所有网络节点和服务视为本地k8s集群内的service资源,比如远端的orderer和peer映射为本地一个orderer和peer的service,这里不需要担心service名称冲突,因为节点的唯一性也保证了节点服务名称的唯一性。我们把这些service指向一组代理容器的pod。采用nginx作为代理是一个很好的选择,因为Fabric采用grpc协议通信,nginx原生的支持。


在本地端,所有区块链节点和组件通过本地的service访问远程的节点和服务就像访问本地的服务一样完全无感知,而实质上区块链网络流量悄悄的通过nginx转发到了远端的区块链节点中。在远端网络中,采用同样的方法,用nginx作为代理接收区块链网络流量并转发到其本地的相应组件内,同时通过其本地的service映射对端的服务,把网络节点流量导向到本地的nginx中,并转发到对端的nginx代理中,nginx代理最终把流量转发至区块链网络节点中。我们通过k8s的service后端的代理转发服务可以无缝的把分散在跨域网络环境下的Fabric网络以低成本的方式连接了起来,下图展示了区块链网络互联技术原理。

区块链与容器技术的相遇



区块链可信计算

区块链与容器技术的相遇

我们知道可信计算解决方案需要底层硬件设备的支持如英特尔的sgx方案,而sgx实质上与cpu和内存同样属于硬件资源,通过k8s的调度插件我们可以实现集群内多台主机的sgx硬件资源的初始化和统一调度能力,并把enclave应用以容器化的形式在集群内调度和运行起来。搭配区块链技术,可信计算输出的数据可以通过区块链网络行云流水般地安全地流动起来,基于sgx的avalon可信计算任务框架正是结合区域块网络通过链下的可信计算和链上的数据流转来完成可信计算任务。事实上,avalon在官方的部署方案里推荐使用k8s部署,从中给我们展示了区块链,可信计算,容器技术三种技术结合的典型例子。



总结与思考

区块链与容器技术的相遇

上文我们通过Fabric和k8s介绍了区块链与容器技术在实际应用场景下的典型技术结合点,实际上在区块链领域中,容器技术带给我们的可能并不仅限于此,容器技术虽然解决的是软件领域的通用性问题如应用编排、部署、运维等,但值得我们思考和探索区块链与容器技术能否擦出别样的火花?


在云计算领域,在k8s之上建立起来的容器云平台更是拥有了多容器集群的管控能力,强大的集群管理和调度能力以及k8s联邦机制是否与区块链技术有更深度的结合契机值得我们不断探讨和实践,区块链与容器技术不仅仅是一次简单的相遇,更像是一个循序渐近的恋爱过程。





扫码获取小程序,随时了解腾讯云区块链产品信息