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

简介: 我们经常会遇到搭建多节点集群得需求, 例如摩根推出的基于以太坊的区块链 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 的操作:
  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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
12天前
|
存储 缓存 Docker
docker: No space left on device处理与迁移目录
通过以上方法,可以有效地管理 Docker 的磁盘使用情况,并确保 Docker 运行环境的稳定性和效率。
79 34
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
209 11
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
232 19
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
87 2
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
178 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。