基于 Quorum 集群搭建讲解如何从 docker-compose 迁移到 Kubernetes

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 我们经常会遇到搭建多节点集群得需求, 例如摩根推出的基于以太坊的区块链 Quorum. 对于这种搭建多借点得需求, 我一般都是先通过 docker-compose 在本地实现多节点, 然后再基于 docker-compose 迁移到 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 的操作: 1
  4. 这里创建的 smart contract 只是一个简单的整数存取, 我们在 js 文件里创建了一个 storage的 contract 对象, 可以通过它来调用 smart contract 的操作:
    1
  5. 我们可以进入别的节点, 加载我们之前创建的 smart contract :
    1
  6. 然后读取 smart contract 保存的整数值:
    1

由此可见整个集群是正常工作的.

去除数据共享的本机多节点搭建

由于 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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
18天前
|
Kubernetes Java Docker
利用(K8S)配合Docker部署jar包
通过Docker打包并部署到Kubernetes(K8S)集群的过程。首先,通过SpringBoot生成jar包,接着在K8S环境中创建并编辑Dockerfile文件。随后构建Docker镜像,并将其推送到镜像仓库。最后,通过一系列kubectl命令(如get pods、get svc、logs等),展示了如何在K8S中管理应用,包括查看Pod状态、服务信息、Pod日志以及重启Pod等操作。
76 2
|
17天前
|
Ubuntu Linux pouch
Docker容器管理工具
文章介绍了Docker容器管理工具,以及早期使用的LXC容器管理工具,包括它们的安装、使用和相关技术特点。
45 10
Docker容器管理工具
|
16天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
103 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
3天前
|
Kubernetes Cloud Native 开发者
云原生入门:从Docker到Kubernetes的旅程
【9月更文挑战第16天】 本文将带你进入云原生的世界,从理解Docker容器的基础开始,逐步深入到Kubernetes集群管理。我们将通过简单的代码示例和实际操作,探索这两个关键技术如何协同工作,以实现更高效、灵活的应用程序部署和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供清晰的指导和实用的知识。
27 11
|
16天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
33 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
7天前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
14天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
16天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
34 7
|
16天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
25 5
|
16天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
36 2