天天看點

基于 Quorum 叢集搭建講解如何從 docker-compose 遷移到 Kubernetes基于本機 Volume Map 資料共享的多借點搭建去除資料共享的本機多節點搭建實作在 Kubernetes 上搭建多機叢集總結

我們經常會遇到搭建多節點叢集得需求, 例如摩根推出的基于以太坊的區塊鍊 Quorum

. 對于這種搭建多借點得需求, 我一般都是先通過 docker-compose 在本地實作多節點, 然後再基于 docker-compose 遷移到 Kubernetes .

這樣做是因為基于 docker-compose 來實作要簡單很多:

  • 調試很友善;
  • 多節點間通過 Volume Map 可以很容易 地實作資料共享;

同時, 我們在實作 docker-compose 多節點階段的很多工作, 如建立 Docker Image 及編寫

entrypoint.sh

等, 都可以在往 Kubernetes 上遷移時被複用到. 基于 docker-compose 的多節點環境也能作為開發環境使用.

基于本機 Volume Map 資料共享的多借點搭建

在網上搜尋 Quorum 的叢集搭建時搜尋到了

這個

實作方法. 它主要是通過 Shell 腳本提前生成好每個節點所需要得資料, 然後再分别 map 到對應的節點中.

原方案因為 geth 的更新, 在建立 contract 的時候會報錯, 我對這個問題做了修複, 把修複好之後的 代碼存放在

Github

上.

運作 Quorum 叢集

  1. 首先執行初始化腳本

    ./setup.sh

    , 生成節點需要的資料及對應的

    docker-compose.yml

    檔案; 其中

    setup.sh

    可以接收一個指定節點數量得參數;
    docker-deploy git:(master) ./setup.sh 5
    [1] Configuring for 5 nodes.
    [2] Creating Enodes and static-nodes.json.
    [3] Creating Ether accounts and genesis.json.
    WARN [05-22|04:52:46] No etherbase set and no accounts found as default
    WARN [05-22|04:52:49] No etherbase set and no accounts found as default
    WARN [05-22|04:52:52] No etherbase set and no accounts found as default
    WARN [05-22|04:52:55] No etherbase set and no accounts found as default
    WARN [05-22|04:52:58] No etherbase set and no accounts found as default
    [4] Creating Quorum keys and finishing configuration.
    Node 1 public key: lxXXlk1QBVoR9Y7C6/Ok13oXmqK8Vf0H1YREln9z8Gg=
    Node 2 public key: wLBfII80GiQK+1SSRU/7feuY9uHgtDY6gbNUGHJUGUA=
    Node 3 public key: KL6AOgHe/odYTGUw8uXAUuBHN2XTzv7qboylTL8FFjM=
    Node 4 public key: TgHZCt5cCnYq5k2PvUUYoYZLGGAmitFtvc1WSUgDeGQ=
    Node 5 public key: JkFVrzMKOocv0LLMdd7kIXLAMXgpvp49QNQLjKC61WI=
               
  2. 緊接着就可以調用

    docker-compose up -d

    來啟動叢集;
  3. 叢集啟動後會建立 5 個 Quorum 的 container, 我們可以進入任一個 container 執行建立 smart contract 的操作:
  4. 這裡建立的 smart contract 隻是一個簡單的整數存取, 我們在 js 檔案裡建立了一個

    storage

    的 contract 對象, 可以通過它來調用 smart contract 的操作:
  5. 我們可以進入别的節點, 加載我們之前建立的 smart contract :
  6. 然後讀取 smart contract 儲存的整數值:

由此可見整個叢集是正常工作的.

去除資料共享的本機多節點搭建

由于 Kubernetes 上不同 POD 之間共享資料相對會比較麻煩, 而上一個實作方法需要各個節點能夠 共享提前生成好的資料. 經過分析我們可以發現不同節點需要共享的資料主要包括以下這些:

  • 每個節點的

    static-nodes.json

    需要填寫上其它節點的 IP ;
  • tm.conf

    檔案中需要包括别得節點在 Quorum 系統中的 ID ;

這裡我們可以通過 http server 的方式來實作不同節點間的資料共享:

  • 我們可以在節點内部擷取 IP 及 ID 等資訊, 将它們儲存在檔案

    env.sh

    中;
  • 然後通過

    python -m SimpleHTTPServer 80 &

    啟動一個 http server ;
  • 别的節點就可以通過通路

    nodename/env.sh

    來擷取必要得其它節點的資訊;

基于上面的思路, 我實作了不需要通過 Volume Map 共享資料的本機多節點叢集得搭建. 具體得代碼放在了

noscript-docker

, 其中主要得邏輯處理都在檔案

entrypoint.sh

中.

實作在 Kubernetes 上搭建多機叢集

其實上一步已經完成了大部分的工作, 接下來我們隻需要建立對應的

statefulset

檔案即可. 這裡我們基于 helm 來實作對應得腳本檔案. 對應的

templates/statefulset.yaml

檔案 内容如下所示:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
 name: quorum
spec:
 serviceName: quorum
 replicas: {{ .Values.replicaCount }}
 podManagementPolicy: Parallel
 updateStrategy:
 type: OnDelete
 template:
 metadata:
 labels:
 app: quorum
 spec:
 containers:
 - name: quorum
 imagePullPolicy: Always
 image: hbliu/quorum-k8s:latest
 env:
 - name: NODE_NUMBER
 value: "{{ .Values.replicaCount }}"
 - name: NODE_PREFIX
 value: "quorum-"
           

其中的配置資訊都存放在了

values.yaml

檔案中:

replicaCount: 10

image:
 repository: hbliu/quorum-k8s
           
這裡

存放了 完整的 helm 包内容.

總結

本文首先介紹了如何基于 Volume 映射實作多機節點間的資料共享來搭建多機節點; 接着通過 http server 的方式去除不同節點間的資料共享依賴, 最後再基于它來實作 Kubernetes 的部署腳本.

本文轉自掘金-

基于 Quorum 叢集搭建講解如何從 docker-compose 遷移到 Kubernetes