在完成环境准备工作之后,我们接下来可以开始区块链网络的配置和部署。区块链网络是基于 Hyperledger Fabric,由以下几种标准类型节点所组成的一套区块链运行环境。

  • Orderer:用于将区块链的交易组合成一个个区块。从可扩展性角度考虑,区块链解决方案采用 Kafka 类型的 Orderer 服务。
  • Kafka 和 ZooKeeper: 以集群形式为 Orderer 提供底层服务。
  • Peer:用于保存和维护账本、创建运行 chaincode 容器、为交易进行背书等等。从高可用性角度考虑,区块链解决方案为每一个组织(organization)创建 2 个 Peer 节点。
  • CouchDB:用于保存 Peer 的状态数据库(State Database)。区块链解决方案为每一个 Peer 创建一个 CouchDB。
  • CA:用于为应用提供 PKI 证书服务。区块链解决方案为每一个组织(organization)创建一个 CA 节点。

更多详细介绍可参考Hyperledger Fabric官方文档

为满足企业级应用的需求,区块链解决方案为主要节点提供了数据持久化存储,使用的是在环境准备环节中所创建的共享文件系统。

区块链网络部署运行于阿里云容器服务 Kubernetes 集群之上。用户可选择在同一个 Kubernetes 集群里部署多套区块链网络(用 namespace 隔离),也可以在每一个 Kubernetes 集群里部署一套区块链网络。

区块链网络的配置部署支持两种方式:图形化界面和 Helm 命令行。下面将对这两种方式进行介绍。
说明 目前暂不支持在已有区块链网络上动态增加新的 organization 或 peer。因此若您想变更区块链网络的配置,需要删除原有区块链网络重新创建。

配置参数说明

区块链解决方案为大部分字段均提供了默认值,以降低用户配置的复杂度。如需对区块链进行定制,可参考以下字段说明进行参数设置。

参数项 说明
sharedStorage NAS文件系统的挂载地址。创建区块链网络必须提供的参数,否则将导致创建失败
storageCapacity Kubernetes中对NAS的Persistent Volume Claim(PVC)的初始大小,NAS支持动态扩容。默认值:1Gi
dockerImageRegistry Docker 镜像仓库 URL:区块链解决方案的镜像仓库。请根据 Kubernetes 集群所在区域选择对应的镜像仓库。
  • 国内区域: registry.cn-hangzhou.aliyuncs.com/blockchain-solution
  • 海外区域: registry.ap-southeast-1.aliyuncs.com/blockchain-solution
fabricNetwork 区块链网络名称(必填项):区块链网络会作为容器服务的一个应用部署,此区块链网络名称即为应用名称。请避免使用与已部署应用相同的名称。此外区块链网络名称也会在共享文件系统中作为保存配置和数据的根目录名称。
fabricChannel 区块链网络通道名称:即 Hyperledger Fabric 的 channel 名称,区块链解决方案将在部署时自动创建指定名称的通道。
externalAddress 外部访问地址(必填项):如用户希望利用部署于容器集群之外的应用程序或管理监控工具访问区块链网络,则需要提供所在 Kubernetes 集群的一个节点的公网地址或者 Kubernetes 集群的负载均衡的公网地址作为外部访问地址。相关配置方法可参考为 worker 节点绑定弹性公网 IP
ordererDomain Orderer 域:即 Hyperledger Fabric 中 orderer 的 domain,可根据实际需要指定。
ordererNum Orderer 数量:使用 Kafka 类型(非 Solo 类型)的 orderer 服务。指定希望部署的 orderer 节点数量。如需更改ordererNum,请确保同时修改ordererExternalPortList,以保证节点数量和外部端口数量一致,否则将导致区块链部署失败。
peerDomain Peer域:即 Hyperledger Fabric 中 peer 的 domain,可根据实际需要指定。
orgNum 组织数量:即 Hyperledger Fabric 中 organization 的数量,区块链解决方案为每一个组织创建两个 peer,以保证高可用性以及业务扩展的需求。可根据实际需要指定组织的数量,实际部署的 peer 节点数量=组织数量 x 2。如需更改orgNum组织数量,请确保同时修改peerExternalGrpcPortList、caExternalPortList,以保证节点数量和外部端口数量一致,否则将导致区块链部署失败。
ordererExternalPortList Orderer 外部端口列表:如希望使用集群外部的应用访问 orderer 服务,可指定 orderer 节点所使用的外部端口或者使用默认端口。请注意避免不同区块链网络之间占用相同端口可能导致的区块链部署失败。同时请保证列表中端口的数量要与 ordererNum 数量保持一致,否则也将导致区块链部署失败。
caExternalPortList CA 外部端口列表:如希望使用集群外部的应用访问CA服务,可指定 CA 节点所使用的外部端口或者使用默认端口。请注意避免不同区块链网络之间占用相同端口可能导致的区块链部署失败。同时请保证列表中端口的数量要与 orgNum 数量保持一致,否则也将导致区块链部署失败。
peerExternalGrpcPortList Peer gRPC 外部端口列表:如希望使用集群外部的应用访问 peer 服务(默认基于 gRPC 协议),可指定 peer 节点所使用的外部端口或者使用默认端口。请注意避免不同区块链网络之间占用相同端口可能导致的区块链部署失败。同时请保证列表中端口的数量要与(orgNum x 2)数量保持一致,否则也将导致区块链部署失败。
imagePullPolicy 镜像拉取策略: 此为 Kubernetes 参数,一般用于开发测试目的。
hyperledgerFabricVersion Hyperledger Fabric 版本号: 目前支持 1.4.0,无需设置。
thirdPartyImageVersion Hyperledger Fabric 包含的第三方软件(如CouchDB、Kafka、ZooKeeper等)镜像的版本号: 目前支持 0.4.14(与Hyperledger Fabric 1.4.0 对应),无需设置。
explorer.enabled 是否自动部署Hyperledger Explorer。在部署过程中同时会创建负载均衡实例,并通过80端口提供基于Web UI的区块链浏览器功能。默认为true。
logService.enabled 是否开启对阿里云日志服务的支持。默认为false。关于阿里云日志服务的详情可参考使用日志服务进行Kubernetes日志采集
logService.region 如开启对阿里云日志服务的支持,则指定日志服务项目所在的地域。请根据实际地域指定。关于阿里云日志服务的详情可参考使用日志服务进行Kubernetes日志采集
logService.userID 如开启对阿里云日志服务的支持,则指定阿里云主账号的用户ID。关于阿里云日志服务的详情可参考使用日志服务进行Kubernetes日志采集
logService.machineGroup 如开启对阿里云日志服务的支持,则指定日志服务项目的机器组。关于阿里云日志服务的详情可参考 使用日志服务进行Kubernetes日志采集
logLevel Hyperledger Fabric不同类型节点(Peer, Orderer, CouchDB)的日志级别。可选值为:CRITICAL | ERROR | WARNING | NOTICE | INFO | DEBUG;默认值:INFO

使用控制台界面部署区块链

  1. 在 Kubernetes 菜单下,单击左侧导航中的 应用目录,在右侧列表区域找到并单击 ack-hyperledger-fabric


  2. 在 ack-hyperledger-fabric 应用界面右侧区域,选择部署 集群,并填写 发布名称


  3. 单击 参数 标签,可以查看或者修改相关部署参数。
    • sharedStorage:输入环境准备环境记录的NAS文件系统挂载地址(必填,否则将部署失败)。
    • dockerImageRegistry:根据部署所在区域(中国或海外),从注释中的可选项中选择对应的容器镜像仓库地址填入。
    • externalAddress: 输入上文 Worker 节点绑定的弹性公网 IP,用于生成connection profile。


  4. 单击 创建
    说明 如参数中的 sharedStorage未作配置,部署过程将会报 spec.nfs.server: Required value的错误。出现此错误后,需要先删除对应的发布,然后填写 sharedStorage参数值,并重新部署。
  5. 进入部署集群的控制台界面,查看区块链网络相关 pods 的状态,直到全部变为 Running。


使用 Helm 命令行部署区块链

如需了解容器服务 Kubernetes 集群的 Helm 部署应用的更多功能,请参考利用 Helm 简化应用部署

  1. 用 SSH 工具登录 Kubernetes 集群的 master 节点,使用 root 账户和在创建 Kubernetes 集群时设置的密码进行登录。
  2. 运行 Helm 命令部署区块链网络。
    • 如需使用默认配置参数部署区块链网络,可执行如下命令:
      helm install --name blockchain-network01 --set "sharedStorage=987a6543bc-abc12.cn-hangzhou.nas.aliyuncs.com" incubator/ack-hyperledger-fabric

      其中 --name 为区块链网络对应的 Helm release 名称,用户可自行设置。

    • 如需将区块链网络部署于指定的 namespace(例如 network01 ),可执行如下命令:
      helm install --namespace network01  --name blockchain-network01 --set "sharedStorage=987a6543bc-abc12.cn-hangzhou.nas.aliyuncs.com" incubator/ack-hyperledger-fabric

      其中 --namespace 为区块链网络部署的目标 namespace 名称,用户可自行选定。

    • 如需设置简单或数量较少的配置参数部署区块链网络,可用 set 参数将配置参数传入,例如:
      helm install --name blockchain-network01 --set "fabricChannel=mychannel,sharedStorage=987a6543bc-abc12.cn-hangzhou.nas.aliyuncs.com" incubator/ack-hyperledger-fabric
    • 如需设置复杂的或数量较多的配置参数部署区块链网络,可用 yaml 文件将参数值传入,例如:
      helm install --values network01.yaml --name blockchain-network01 incubator/ack-hyperledger-fabric

      其中 --values 指定的是自定义配置参数的 yaml 文件,示例如下,用户可自行定义。

      # sample values yaml
      sharedStorage: 987a6543bc-abc12.cn-hangzhou.nas.aliyuncs.com
      fabricNetwork: network01
      fabricChannel: tradechannel
      orgNum: 3
      ordererNum: 4
      ordererDomain: shop
      peerDomain: shop
      externalAddress: 11.22.33.44
      caExternalPortList: ["31054", "31064", "31074"]
      ordererExternalPortList: ["31050", "31060", "31070", "31080"]
      peerExternalGrpcPortList: ["31051", "31061", "31071", "31081", "31091", "31101"]

      检查区块链网络的 Helm release 部署成功。执行如下命令,确保区块链网络对应的 release 状态为 DEPLOYED。

  3. 执行如下命令,检查区块链网络的所有节点的 pod 是否均成功运行,确保区块链网络对应的 pod 状态均为 running。
    kubectl get pod
    • 如指定了namespace,如network01
      kubectl get pod -n network01
    • 如需要以watcher模式监听pod状态变化
      kubectl get pod -w
  4. 执行如下命令,查看区块链网络部署的创建状态。如果显示状态为 DEPLOYED,说明部署成功。
    helm list

至此我们便完成了一套区块链网络的配置和部署。

区块链网络各节点服务的命名规则

对于 Hyperledger Fabric 的标准节点类型,相应的服务命名规则如下:

<区块链网络名称>-<节点类型><序号>

例如:

network01-peer1
network01-peer2
network01-orderer1
network01-ca1

需要说明的是,尽管在 Kubernetes 集群内可用 namespace 来区分不同的区块链网络,但上述服务命令规则中仍使用了区块链网络名称作为前缀,主要原因是为了保持与 swarm 集群的区块链解决方案一致。

此服务名称与区块链证书、密钥中的节点名称保持一致。对于部署于同一 Kubernetes 集群内的区块链应用程序或 CLI,均可使用此类服务名称(加上服务端口)直接访问,无需使用外部访问地址。

问题诊断

针对区块链的配置、部署、访问等过程中可能发生的各类问题或错误,我们在这里将介绍一些常用的问题诊断思路、方法和工具。

首先,建议检查环境准备 文档中所要求的各项准备工作是否均已正确完成。

其次,善用 Kubernetes 相关命令进行部署事件和输出日志等信息的查看,例如:kubectl describe podkubectl logskubectl get pod -o yaml 等。

此外,为辅助故障诊断和问题排查,区块链解决方案在区块链网络中一同部署了自定义的 fabric-utils 容器,里面集成了常用的基础工具,如 telnet、ping、nslookup、curl 等。用户可在 master 节点上,通过以下 kubectl 命令进入fabric-utils 容器中使用适合的工具进行诊断分析。例如:

kubectl exec -it fabric-utils-pod bash

最后,针对 Hyperledger Fabric 相关的问题或错误,可尝试通过搜索 Hyperledger Fabric 官方文档、StackOverFlow、Google/Bing/Baidu 等查找相关线索或解决方案。