用Kubernetes部署超级账本Fabric的区块链即服务(1)
2017年08月13日 00:00:00

阅读数:937

题图摄于旧金山市区:云海中的 Twin Peaks

不久前,我们发表了如何部署多节点 Fabric 1.0集群(可点击)的方法,主要是描述手动部署的步骤。在本次连载中,我们将探讨如何把 Fabric v1.0自动化部署在现今最流行的 Kubernetes 容器平台上,从而实现对分布式区块链平台的管理和监控等功能。

关注本公众号的读者可能发现,笔者主要研究区块链和云原生应用两个方面。看似不太相关的两领域,在本文中得到完美结合,印证了笔者经常分享的一句话:做技术总有会师的时候!

本文编写过程中,我们团队的工程师贾燚星对 Kubernetes 部分给出了建议和纠正,在此表示感谢。

【注:下载本文PDF版本以及本文源代码,可关注本公众号:亨利笔记,后台发送消息“区块链即服务” 或 “baas”即可。】

概述

盼望着,盼望着,超级账本 Fabric 1.0 正式来了,社区用户为之欢呼雀跃:终于等到一个企业级区块链应用平台了。然而在激动过后,回归平静之时,人们却往往发现,搭建Fabric平台是个相当披荆斩棘的历程。不仅要具备密码学、分布式计算、共识算法等区块链理论基础,而且要熟悉容器、Golang / Node.js 这些企业用户不常用的工程技术,这常常是很多人把区块链放弃在起跑线的原因。降低使用门槛,提高易用性,将是今后一段时间内推广企业区块链应用的重要工作。

之前我们的文章描述过安装部署多节点 Fabric 集群的步骤,旨在说明Fabric基本的运作原理,因此部署过程是手  (cao)  动  (gen)  的安装方式。在实际的开发测试中,需要自动化部署来提高效率,本文介绍如何利用容器平台Kubernetes(K8s)来自动部署 Fabric 1.0,实现区块链即服务 (Blockchain as a Service, BaaS) 的基础。

需要指出的是,BaaS目前多用于开发测试,即在同一个BaaS平台,部署多个区块链节点,每个节点代表不同组织机构。这样显然是中心化的部署方式,只能用于开发测试用途。真实环境的部署需要分布在网络中多个BaaS协同工作才能完成,这是另外一个尚待完善的工作。

我们选择把 Fabric 部署在 K8s 上有几个原因。首先 Fabric 的组件都经过容器封装好的,很方便部署在 K8s 这类容器平台上,并借助平台实现高可用、监控管理、自动化运维等目的。

其次,Fabric 是分布式系统,根据应用的具体需求,集群的各个组件数会有不同,需要灵活地配置和调整。而 K8s 是面向微服务架构的容器平台,扩展方便,能够很好地满足 Fabric 这方面的要求。

还有就是 K8s 具备了多租户的能力,可在同一个平台中运行多个互相隔离的 Fabric 实例,方便开发测试,比如一个实例作为开发用,另一个实例作为测试用。

在超级账本中有个子项目叫 Cello ,其目的是提供 Hyperledger 的 BaaS 。据了解,目前已经支持把 Fabric 部署在 Docker 和 Swarm 上,有关 K8s 的支持还在开发中。由于 Fabric 的设计中没有考虑到 K8s 等平台的特点,因此把 Fabric 部署在 K8s 上还需要一些变通的处理方法,后文相关部分会提到。

整体架构

2.1 基础设施

1)   网络部分

Kubernetes 集群由多个节点组成,为使得集群上的容器正常通信,需要创建一个 overlay 网络,并把集群上的容器都连接到这个网络上。

图 2- 1

如图2-1所示,宿主机网络由蓝色线标记,节点有 cmd 客户机, Kubernetes 的 master 和 worker ,还有 NFS 服务器。其中,cmd 客户机作为操作 K8S和 Fabric 集群的命令行客户机。NFS服务器在各个节点间用于共享 Fabric 和 K8s 的各种配置文件,也可以用其他 K8s 支持的共享存储代替。

通过 Kubernetes 的 cluster add-ons 可以很方便地创建 overlay 网络,如 Flannel 。如图 2-1的红色线所示(为说明Flannel作用省去部分细节),Kubernetes 把所有pod加入到 Flannel 网络中,因此 pod 中的容器可以相互通信。

Flannel网络的地址段可以在 add-on 的配置文件中指定,同时 kube_dns 的 IP 地址也可以通过配置修改,但该IP地址必须处于指定地址段中。如图2-1中 Flannel 的网络为10.0.0.1/16,kube_dns 的 IP 地址为10.0.0.10。

在 Fabric 设计中, chaincode 目前是以 Docker 容器的方式运行在 peer 容器所在的宿主机上,peer 容器需要调用 Docker 引擎的接口来构建和创建chaincode 容器,调用接口是通过这个连接:

unix:///var/run/docker.sock

这种方式其实是有安全隐患的,这里不作过多讨论。正确的姿势应该是调用chaincode 专用的运行环境,如新起一个 Docker Host ,用 TCP 接口远程调用。

通过docker.sock 创建的容器脱离在 Kubernetes 的体系之外,虽然它仍在 Flannel 的网络上,但却无法获得 peer 节点的 IP 地址。这是因为创建该容器的 Docker 引擎使用宿主机默认的 DNS 解析来 peer 的域名,所以无法找到。

为了解决解析域名的问题,需要在每个 worker 的 DOCKER_OPTS 中加入相关参数,以图 2-1为例,kube_dns 的 IP 为10.0.0.10,宿主机网络 DNS 的 IP 地址假设为192.168.0.1,为使得 chaincode 的容器可以解析到 peer 节点,修改步骤如下:

1. 编辑 /etc/default/docker,在 DOCKER_OPTS 中添加以下参数,设置 Kubernetes 使用的 DNS (很重要!):

"--dns=10.0.0.10 --dns=192.168.0.1  --dns-search \

default.svc.cluster.local--dns-search svc.cluster.local \
--dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2"

2. 运行以下命令重启Docker (注: 不同的Linux环境中命令可能会有不同):

systemctl daemon-reload

systemctl restart docker

systemctl restart docker.service

【注:下载本文PDF版本以及本文源代码,可关注本公众号:亨利笔记,后台发送消息“区块链即服务” 或 “baas”即可。】

2)  共享存储

K8s 和 Fabric 集群需要较多的配置文件,为方便管理,可通过 NFS 服务器来统一储存这些文件,如图 2-1所示。

cmd客户机可通过 cryptogen 工具生成 crypto-config 目录,该用于储存 Fabric 集群中节点的配置文件,如 peer0.org1 所用到的 msp 存放在以下目录:

crypto-config/PeerOrganization/org1/peers/peer0/msp

cmd客户机只需要把 NFS 的共享目录挂载到本地 /opt/share/ ,再把 crypto-config 写到该目录,即可让各个节点访问到配置文件。

在 Kubernetes 中,通过 PV 和 PVC 来把 NFS 上的文件挂载到容器中,除了创建相应的 PV 和 PVC 外,还需在节点的配置文件中把正确的路径挂载进去。若NFS 服务器的共享目录为 /opt/share ,创建 PV 时可指定 peer.org1 的挂载点为:

/opt/share/crypto-config/PeerOrganization/org1/

然后创建与该 PV 相对应的 PVC ,这样在节点的配置文件中就可以使用 PVC 来挂载这个目录。节点需要根据自己的 ID 在挂载点后面加上相应的路径来保证挂载的配置文件无误,如 peer0.org1 应在路径后加上 peers/peer0/msp ,则其挂载目录的完整路径如下:

/opt/share/crypto-config/PeerOrganization/org1/peers/peer0/msp

2.2  组件划分

在 Kubernetes 中,Namespace 是一个很重要的概念,它用于划分不同的虚拟集群,而 Fabric 中 organization 基于证书签发机构划分,把 K8S 的 namespace 与 Fabric 的 organization 对应,既使得 organization 之间相互独立,又充分利用了 K8S 的 DNS 服务,各个 organization 可以通过域名区分。采用 namespace 分隔各个组织的组件,还可实现网络策略 (network policy) 来隔离不同组织,实现多租户的能力 (本文未涉及)。

图 2- 2

如图 2-2所示,假设 Fabric 网络中有多个 peer organization 和 orderer organization ,下面阐述如何在 Kubernetes 进行划分和对应:

a.   若第N个 Fabric 的 peer organization 的域名为 orgN,则其在 Kubernetes 上对应的 namespace 设置为 orgN ,在该 namespace 下有多个 pod,pod 的类型如下:

1)   Peer Pod:包括 Fabric peer,couchDB (可选),代表每个组织的 peer节点。

2)   CA Server Pod: Fabric CA Server。

3)   CLI Pod:(可选)提供命令行工具的环境,用于操作本组织的节点、channel 或 chaincode。

b.   若第N个 Fabric 的 orderer organization 的域名为 orgordererN ,则其在Kubernetes 上对应的 namespace 为 orgordererN ,该 namespace 下只有一种  Pod ,它用于运行 orderer 节点。

c.   Kafka namespace 与 Fabric 的 organization 并无关系,它只用来运行和管理Zookeeper和Kafka容器,实现共识算法。

2.3  Pod之间的通信

Kubernetes 中的每个 Pod 都有独立的 IP 地址,然而在各个 Pod 之间直接通过 IP:port 的方式来通信会带来很多麻烦,因此有必要给每一个 Pod 绑定一个的 service ,以便用 service 名称来访问。

service 的命名方式应当遵循以下原则,彰显与其绑定的 Pod 信息:

1)   service 与 pod 的 namespace 应当一致。

2)   service 的 name 应与 Pod 中容器的 id 一致。

例如,Fabric 中属于 org1 的 peer0 节点,在 K8S 中用 namespace 为 org1、名字为 peer0 的 Pod 来运行,与该 Pod 绑定的 service 全称应为 peer0.org1 。其中 peer0 为 service 的名称,org1 为 service 的 namespace 。这样的映射关系已经和主机域名很接近了。

用Kubernetes部署超级账本Fabric的区块链即服务(1)相关推荐

  1. 用Kubernetes部署超级账本Fabric的区块链即服务

    关注微信公众号 区块链大本营,学习更多区块链技术及应用知识. 区块链行业投稿,请邮件联系 jiawd@csdn.net 本文将探讨如何把 Fabric v1.0自动化部署在现今最流行的 Kuberne ...

  2. hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  3. 部署超级账本fabric区块可视化浏览器

    文件存放路径 在根目录中构建这样的目录结构 hyperledger-explorer/ ├── config.json ├── connection-profile │ └── org1ProdNet ...

  4. 超级账本Fabric 1.0多节点集群的部署(2)

    上期文章阐述了超级账本 Fabric 1.0多节点部署的方法概述,得到广大读者的关注,笔者们连夜赶工,今天发布连载之二,介绍具体搭建 Fabric 1.0 集群的步骤. 注:部署过程中大量使用了doc ...

  5. 基于超级账本Fabric的供应链跟踪解决方案【开源】

    2019独角兽企业重金招聘Python工程师标准>>> 本项目为基于Hyperledger Fabric区块链的供应链资产跟踪解决方案,项目主要包括链码和Web应用两部分.Fabri ...

  6. 超级账本Fabric中的权限管理和策略

    权限管理是区块链网络十分重要的功能,负责控制某个身份在某个场景下是否允许采取某个操作(如读写某个资源). 超级账本 Fabric 项目通过策略(Policy)来灵活指定各场景下的操作权限. 策略应用场 ...

  7. 超级账本Fabric的架构与设计

    超级账本Fabric项目自诞生之日起就吸引了全球众多企业的密切关注,已经先后发布了两个大的版本,0.6实验版本(2016年9月)和1.0正式版本(2017年7月). 目前,超级账本Fabric架构上核 ...

  8. 【链块技术51期】超级账本Fabric教程(一):超级账本入门

    原文链接:超级账本Fabric教程(一):超级账本入门 本节分享有关拆超级账本的概念以及体验部署过程. 一.简介 是一个带有可插入各种功能模块架构的区块链实施方案,目标是打造成一个由全社会共同维护的开 ...

  9. 超级账本Fabric 2.x 详细安装步骤及可能问题解决方式

    超级账本Fabric 2.x 详细安装步骤及可能问题解决方式 使用系统版本:Ubuntu 18.04 提示1:任何命令错误都可以试试加sudo提升权限!!! 提示2:如果Ubuntu系统没有换源可以参 ...

最新文章

  1. TortoiseGit安装过程
  2. 【机器视觉】 assign_at算子
  3. 进击的UI------------------UISegmentedControlUISlide
  4. ecshop 源码文件结构说明
  5. web压力测试工具(小而精)
  6. 转 【Android 应用开发】GitHub 优秀的 Android 开源项目
  7. jrtplib使用笔记
  8. 设计模式总览及工厂模式详解
  9. python图片表格转excel表格_利用Python+Opencv+pytesser把图像识别为Excel表格
  10. redis层级结构存储键值对
  11. yuv 420 8 bit 转 10bit
  12. 个人博客系统项目-已开源
  13. 移动安全工具-jadx
  14. 分享75个JS特效倒计时,总有一款适合您
  15. ../和./和/的区别
  16. 快递查询单号查询追踪,一键查询全部物流
  17. 判断链表是否有环及环入口点的求法
  18. 【机器学习】最大均值差异MMD详解
  19. 基于JSP动漫论坛的设计与实现(含源文件)
  20. RadRails插件在 MyEclipse的安装(转http://wayfarer.blog.51cto.com/1300239/329290)

热门文章

  1. 动画延迟效果css,每个子元素都有延迟的CSS动画
  2. ajax在Xss中的利用,XSS高级利用
  3. 虚拟主机跟php,php虚拟主机和服务器(云服务器跟虚拟主机)
  4. c++ vector iterator
  5. Ubuntu16.04 安装chromedriver
  6. nltk 文本预处理
  7. python word2vector (三)
  8. subplot 真正含义
  9. 不用额外变量交换两个整数的值
  10. Python应用实战案例-Python协程管理精讲万字长文(建议收藏)