我們經常會遇到搭建多節點叢集得需求, 例如摩根推出的基于以太坊的區塊鍊 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 叢集
- 首先執行初始化腳本
, 生成節點需要的資料及對應的./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=
- 緊接着就可以調用
來啟動叢集;docker-compose up -d
- 叢集啟動後會建立 5 個 Quorum 的 container, 我們可以進入任一個 container 執行建立 smart contract 的操作:
- 這裡建立的 smart contract 隻是一個簡單的整數存取, 我們在 js 檔案裡建立了一個
的 contract 對象, 可以通過它來調用 smart contract 的操作:storage
- 我們可以進入别的節點, 加載我們之前建立的 smart contract :
- 然後讀取 smart contract 儲存的整數值:
由此可見整個叢集是正常工作的.
去除資料共享的本機多節點搭建
由于 Kubernetes 上不同 POD 之間共享資料相對會比較麻煩, 而上一個實作方法需要各個節點能夠 共享提前生成好的資料. 經過分析我們可以發現不同節點需要共享的資料主要包括以下這些:
- 每個節點的
需要填寫上其它節點的 IP ;static-nodes.json
-
檔案中需要包括别得節點在 Quorum 系統中的 ID ;tm.conf
這裡我們可以通過 http server 的方式來實作不同節點間的資料共享:
- 我們可以在節點内部擷取 IP 及 ID 等資訊, 将它們儲存在檔案
中;env.sh
- 然後通過
啟動一個 http server ;python -m SimpleHTTPServer 80 &
- 别的節點就可以通過通路
來擷取必要得其它節點的資訊;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