本文仅用作学习和测试环境使用,具体生产环境需用户自行开发和配置
使用 k8s来部署长安链,可以获得企业级应用所需的自动化运维、高可用性、弹性伸缩和一致性管理能力,从而让业务链能够稳定、可靠、高效地运行。
本文介绍通过k8s容器部署长安链,使每个节点运行在独立的容器。该方式利用k8s service的网络功能实现节点间通信,使用k8s pod定义和启动多个节点,快速搭建多节点区块链网络,确保环境隔离与部署一致性。
部署环境
(1)Ubuntu 20.04
(2)k8s 1.23.0
(4)Go 1.23.9
(5)chainmaker-go 2.3.7
(6)chainmaker-cyptogen 2.3.5
其中长安链的基本环境配置请参考技术文档《通过命令行体验链》。
k8s的下载配置参考官方文档:https://kubernetes.io/zh-cn/docs/setup/
操作步骤
一、 使用 chainmaker-go自带证书启动 k8s 链
注:此为自行编译docker 镜像示例,若想使用最新官网镜像,请修改镜像名称。
若docker-hun无法下载,可参考技术文档通过chainmaker自建的镜像仓库下载。
1. 进入 本项目中对应的目录
cd chainmaker-go/scripts/docker/2.3.7,编写长安链节点pod、service所需的yaml文件,以节点1为例:
apiVersion: v1kind: Podmetadata: name: chainmaker-node1 labels: app: chainmaker-node1spec: containers: - name: chainmaker image: chainmakerofficial/chainmaker:v2.3.7 workingDir: "/chainmaker-go/bin" command: - "/bin/sh" - "-c" - "./chainmaker start -c /chainmaker-go/config/wx-org1.chainmaker.org/chainmaker.yml >> panic.log" ports: - containerPort: 11301 name: p2p-org1 - containerPort: 12301 name: rpc-org1 volumeMounts: # 每个节点挂载特定的配置目录 - name: config-org1 mountPath: /chainmaker-go/config/wx-org1.chainmaker.org # 每个节点有自己的数据和日志目录 - name: data-org1 mountPath: /chainmaker-go/data1 - name: log-org1 mountPath: /chainmaker-go/log1 readinessProbe: tcpSocket: port: 12301 initialDelaySeconds: 15 periodSeconds: 5 volumes: # 组织1的配置 - name: config-org1 hostPath: path: /chainmaker-go/scripts/docker/config/four-nodes/wx-org1.chainmaker.org type: Directory # 组织1的数据目录 - name: data-org1 hostPath: path: /chainmaker-go/scripts/docker/2.3.7/tmp/data1 type: DirectoryOrCreate # 组织1的日志目录 - name: log-org1 hostPath: path: /chainmaker-go/scripts/docker/2.3.7/tmp/log1 type: DirectoryOrCreate---apiVersion: v1kind: Servicemetadata: name: chainmaker-node1spec: selector: app: chainmaker-node1 ports: - name: rpc port: 12301 targetPort: 12301 nodePort: 31231 - name: p2p port: 11301 targetPort: 11301 nodePort: 31131 type: NodePort
4个节点的yaml文件已给出,注意将volumes中的hostpath修改为宿主机对应文件的地址。
2.切换 项目对应的目录
chainmaker-go/scripts/docker/config/four-nodes/wx-org1.chainmaker.org,通过vim命令修改chainmaker.yml的seeds dns为节点service名字。节点service名字如图所示,通过节点yaml文件获得。

示例截屏如图所示:

同时要注意,使chainmaker.yml中data文件夹与挂载的文件夹保持一致,修改为 ../data4/(原本内容)...。
示例截屏如图所示:

另外3个节点同理,将seeds dns为节点service名字,并将chainmaker.yml中storage部分的store_path均修改为../data2/(原本内容)... - ../data4/(原本内容)...
3.启动容器
通过 kubectl create -f filename 启动节点容器, 容器正常启动
filename分别为上面创建的chainmaker-1.yaml - chainmaker-4.yaml
示例结果如图所示:

4.修改映射端口
进入项目对应的目录 chainmaker-go/tools/cmc/testdata,修改sdk_config.yml 的node_addr为localhost:node1映射后端口。
如图所示:


5.测试合约功能
进入项目对应目录 chainmaker-go/scripts/docker,运行sendTx.sh,测试 合约功能正常 。
如图所示:


6. 停止并删除数据,关闭 k8s 容器
运行kubectl delete pod --all
kubectl delete service --all
停止并删除数据,docker容器移除。
二、 使用新生成的证书启动 k8s 链
1. 配置 证书生成节点个数
进入chainmaker-go/tools/chainmaker-cryptogen/config目录,修改crypto_config_template.yml文件中count,其为需要生成的节点个数。
如图所示。

2. 证书生成
进入chainmaker-go/scripts目录,执行prepare.sh脚本生成单链4节点集群配置,存于路径chainmaker-go/build中。
查看脚本帮助:
./prepare.sh -h
运行结果如图所示。

生成单链4节点集群的证书和配置:
./prepare.sh 4 1
本实验仅为演示,相关配置全部选择默认项,实际使用中请根据自己的需求进行配置调整。如图所示:

查看生成好的节点证书和配置:
tree -L 3 ../build/
如图所示:


3. pod 配置
与任务一相同,创建各节点所需的yaml文件,注意将volumes中的hostpath修改为新生成的config。
进入chainmaker-go/build/config,修改4个node文件夹中的chainmaker.yaml,修改内容与任务一相同
4. 启动节点
进入步骤3中创建的各节点yaml文件所在文件夹,通过kubectl create -f filename启动节点容器,容器正常启动,如图所示。filename为新创建的chainmaker-1.yaml - chainmaker-4.yaml 。

5. 停止节点 ,关闭 k8s容器
运行kubectl delete pod --all
kubectl delete service --all
6. 查看节点 是否 存在
查看进程:
ps -ef|grep chainmaker | grep -v grep
如图所示。

查看日志:
cat ../build/release/*/bin/panic.log
#修改为 pod 挂载的地址
cat ../build/release/*/log/system.log
cat ../build/release/*/log/system.log |grep "ERROR\|put block\|all necessary"
如图所示:

若看到all necessary peers connected则表示节点已经准备就绪。
7. 部署 /调用合约验证链是否正常 。
启动成功后,可进行部署/调用示例合约,以检查链功能是否正常。具体流程详见之前的"部署示例合约"实验。