在完成環境準備工作之後,我們接下來可以開始區塊鏈網路的配置和部署。區塊鏈網路是基於 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官方文檔

為滿足企業級應用的需求,區塊鏈解決方案為主要節點提供了資料持久化儲存,使用的是在環境準備環節中所建立的共用檔案系統。

區塊鏈網路部署運行於阿里雲Container Service 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/cos-solution
  • 海外地區: registry.ap-southeast-1.aliyuncs.com/cos-solution
fabricNetwork 區塊鏈網路名稱(必填項):區塊鏈網路會作為Container Service的一個應用部署,此區塊鏈網路名稱即為應用程式名稱。請避免使用與已部署應用相同的名稱。此外區塊鏈網路名稱也會在共用檔案系統中作為儲存配置和資料的根目錄名稱。
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、peerExternalEventPortList 、caExternalPortList,以保證節點數量和外部連接埠數量一致,否則將導致區塊鏈部署失敗。
ordererExternalPortList Orderer 外部連接埠列表:如希望使用叢集外部的應用訪問 orderer 服務,可指定 orderer 節點所使用的外部連接埠或者使用預設連接埠。請注意避免不同區塊鏈網路之間佔用相同連接埠可能導致的區塊鏈部署失敗。同時請保證列表中連接埠的數量要與 ordererNum 數量保持一致,否則也將導致區塊鏈部署失敗。
caExternalPortList CA 外部連接埠列表:如希望使用叢集外部的應用訪問CA服務,可指定 CA 節點所使用的外部連接埠或者使用預設連接埠。請注意避免不同區塊鏈網路之間佔用相同連接埠可能導致的區塊鏈部署失敗。同時請保證列表中連接埠的數量要與 orgNum 數量保持一致,否則也將導致區塊鏈部署失敗。
peerExternalGrpcPortList Peer gRPC 外部連接埠列表:如希望使用叢集外部的應用訪問 peer 服務(預設基於 gRPC 協議),可指定 peer 節點所使用的外部連接埠或者使用預設連接埠。請注意避免不同區塊鏈網路之間佔用相同連接埠可能導致的區塊鏈部署失敗。同時請保證列表中連接埠的數量要與(orgNum x 2)數量保持一致,否則也將導致區塊鏈部署失敗。
peerExternalEventPortList Peer 事件外部連接埠列表:如希望使用叢集外部的應用訪問 peer 的事件(event)服務,可指定 peer 節點所使用的外部連接埠或者使用預設連接埠。請注意避免不同區塊鏈網路之間佔用相同連接埠可能導致的區塊鏈部署失敗。同時請保證列表中連接埠的數量要與(orgNum x 2)數量保持一致,否則也將導致區塊鏈部署失敗。
imagePullPolicy 鏡像拉取策略: 此為 Kubernetes 參數,一般用於開發測試目的。
hyperledgerFabricVersion Hyperledger Fabric 版本號碼: 目前支援 1.1.0,無需設定。
thirdPartyImageVersion Hyperledger Fabric 包含的第三方軟體(如CouchDB、Kafka、ZooKeeper等)鏡像的版本號碼: 目前支援 0.4.6(與Hyperledger Fabric 1.1.0 對應),無需設定。
explorer.enabled 是否自動部署Hyperledger Explorer。在部署過程中同時會建立Server Load Balancer執行個體,並通過80連接埠提供基於Web UI的區塊鏈瀏覽器功能。預設為true。
logService.enabled 是否開啟對阿里雲Log Service的支援。預設為false。關於阿里雲Log Service的詳情可參考
logService.region 如開啟對阿里雲Log Service的支援,則指定Log Service項目所在的地區。請根據實際地區指定。關於阿里雲Log Service的詳情可參考采集Kubernetes日志
logService.userID 如開啟對阿里雲Log Service的支援,則指定阿里雲主帳號的使用者ID。關於阿里雲Log Service的詳情可參考采集Kubernetes日志
logService.machineGroup 如開啟對阿里雲Log Service的支援,則指定Log Service項目的機器組。關於阿里雲Log Service的詳情可參考 采集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 命令列部署區塊鏈

如需瞭解Container Service 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"]
      peerExternalEventPortList: ["31053", "31063", "31073", "31083", "31093", "31103"]

      檢查區塊鏈網路的 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 等尋找相關線索或解決方案。