部署fabric于k8s之上
hyperledger fabric 2.2 kubernetes
一、本地开发环境依赖
1 | Minikube 安装 v1.20.0 |
- 安装 kubectl 工具
- 安装 git
- 安装 docker
- 安装 hyperledger 相关命令列工具
1 | 执行以下指令下载 Hyperledger 命令列工具 |
以上脚本会在本地下载k8s部署需要的容器和可执行文件,云上的话需要准备的镜像如下:
1 | centos:latest |
用于测试的chaincode镜像,marbles是hyperledger官方给的一个sample,但是源码没有打镜像,这里其他人打的一个镜像,我们只是用来测试部署是否成功,之后会用我们开发的存证chaincode镜像替换
1 | paragones/chaincode-marbles:1.0 |
1 | 创建一个名为 hyperledger 的 namespace |
二、系统架构规划
2.1 节点规划
下图为本范例的部署架构,所有hyperledger 所需节点皆部署于 k8s 中的 hyperledger namespace 当中。架构中包含的节点如下
- orderer0 : 排序节点0,用于排序区块
- orderer1 : 排序节点1,用于排序区块
- orderer2 : 排序节点2,用于排序区块
- peer0-org1 : 组织1的Peer节点,用于区块的实际运算、背书以及记帐。
- cli-org1-peer : 用于操纵组织1的Peer节点
- peer0-org2 : 组织2的Peer节点,用于区块的实际运算、背书以及记帐。
- cli-org2-peer : 用于操纵组织2的Peer节点
2.2 存储存放规划
节点 | 挂载路径 | 路径说明 | PVC | PV hostPath |
---|---|---|---|---|
orderer0 | /var/hyperledger/orderer/ | 存放凭证 | orderer0-pvc | ./fabric/orderer0 |
orderer0 | /var/hyperledger/production | 持久化资料 | orderer0-persist-pvc | ./fabric/orderer0persist |
orderer1 | /var/hyperledger/orderer/ | 存放凭证 | orderer1-pvc | ./fabric/orderer1 |
orderer1 | /var/hyperledger/production | 持久化资料 | orderer1-persist-pvc | ./fabric/orderer1persist |
orderer2 | /var/hyperledger/orderer/ | 存放凭证 | orderer2-pvc | ./fabric/orderer2 |
orderer2 | /var/hyperledger/production | 持久化资料 | orderer2-persist-pvc | ./fabric/orderer2persist |
Org1-Peer | /etc/hyperledger/fabric/ | 存放凭证 | peer0-org1-pvc | ./fabric/peer0org1 |
Org1-Peer | /var/hyperledger/production | 持久化资料 | peer0-org1-persist-pvc | ./fabric/peer0org1persist |
Org1-Peer-CLI | /opt/gopath/src/github.com/ hyperledger/fabric/peer/crypto/ | 存放凭证 | peer0-org1-pvc | ./fabric/peer0org1 |
Org2-Peer | /etc/hyperledger/fabric/ | 存放凭证 | peer0-org2-pvc | ./fabric/peer0org2 |
Org2-Peer | /var/hyperledger/production | 持久化资料 | peer0-org2-persist-pvc | ./fabric/peer0org2persist |
Org2-Peer-CLI | /opt/gopath/src/github.com/ hyperledger/fabric/peer/crypto/ | 存放凭证 | peer0-org1-pvc | ./fabric/peer0org2 |
三、准备凭证
Hyperledger Fabric 于节点沟通时必须依赖凭证进行沟通,因此必须先签发凭证。在凭证的签发过程中可以使用两种方式签发凭证
- cryptogen 命令
cryptogen 为 Hyperledger Fabric 生成凭证的命令列工具,于 crypto-config.yaml 定义 Orderer 以及各组织的Peer的数量。 - fabric-ca 服务
Fabric CA 是一个为 Hyperledger Fabric 签发凭证的工具,通常每个组织会有自己的 Fabric CA,通過fabric-ca client 获得凭证后,就可以用这些凭证访问Peer。
在此范例中将以 cryptogen 命令列生成各节点所需凭证,以下为签发凭证的指令。可以查看 git repo 中的 crypto-config.yaml 为签发凭证设定文件,crypto-config则为签发结果。
1 | cryptogen generate --config=crypto-config.yaml --output ./crypto-config |
(notice:练习中,需要再次生成新的凭证设定文件时,需要将./crypto-config文件夹删除后,再行运行上述命令。否则凭证设定文件不会被更新覆盖!)
四、准备创世区块
1 | configtxgen -profile TwoOrgsOrdererGenesis -channelID devchan -outputBlock ./channel-artifacts/genesis.block |
五、产生Channel 所需档案
1 | 产生Channel 所需档案 |
六、同步档案至PV中
在前述三、四、五章节中我们已经准备了以下内容
- 各节点所需凭证
- 创世区块
- Channel 设定档
由于 Hyperledger 之 container 必须先将以上档案放置至正确位置后 container 才能正常启动。但本次安装不使用NFS 预先将档案填入,而是先启临时的 container 同步档案。
在本步骤我们将启动两个用于填充档案的 container
container 名称 | 说明 |
---|---|
orderer-bastion | 填充 orderer0-pvc,orderer1-pvc,orderer2-pvc 所需要的文档 |
peer-bastion | 填充 peer0-org1-pvc,peer0-org2-pvc 所需要的文档 |
以下为同步文档的步骤
6.1 启动临时 container
1 | kubectl create -f /deploy-hyperledger-fabric-on-k8s/file-populate-bastion/ |
这个指令将会产生 pv/pvc/orderer-bastion/peer-bastion 这些资源
6.2 同步 Orderer 所需文档
1 | 登录进入 orderer-bastion |
6.3 同步 Peer 所需要的文档
1 | 登录进入 peer-bastion |
七、启动 Orderer
1 | 启动 orderer cluster |
內含 orderer0,orderer1,orderer2 所需的 deployment 与 service 资源
八、启动 Peer
1 | 启动 org1 peer0 |
九、创建channel
9.1 将 org1 peer0 加入 channel
1 | 登录进入 cli pod |
1 | 产生 channel 区块 |
运行成功后,log信息如下:
1 | /opt/gopath/src/github.com/hyperledger/fabric/peer # peer channel create -o orderer0:7050 -c mychannel -f ./scripts/channel-artifacts/channel.tx - |
1 | 加入 channel |
运行成功后,log信息如下:
1 | /opt/gopath/src/github.com/hyperledger/fabric/peer # peer channel join -b mychannel.block |
1 | 查看是否在 channel 当中 |
9.2 將 org2 peer0 加入 channel
1 | # 登录进入 cli pod |
运行成功后,log信息如下:
1 | /opt/gopath/src/github.com/hyperledger/fabric/peer # peer channel fetch 0 mychannel.block -c mychannel -o orderer0:7050 --tls --cafile $ORDERER_CA |
十、Fabric节点上安装外的Chaincode
10.1 安装chaincode
‘marbles’ 链码作为范例
打包org1
1 | 进入github的chaincode/packaging |
将org1 tar文档安装到peer cli pod中
1 | # 将marbles-org1.tgz放入peer pod |
打包org2,如打包or1一样的步骤,请修改connection.json中的address
1 | "address": "chaincode-marbles-org2.hyperledger:7052" |
依照下列打包步骤
1 | $ rm -f code.tar.gz |
至此,已完成外部链码设置。
10.2 部署”智能合约”
制作golang的alpine镜像文件
1 | $ docker build -t chaincode/marbles:1.0 . |
进入github中 chaincode\k8s ,找到org1-chaincode-deployment.yaml和org2-chaincode-deployment.yaml中的CHAINCODE_CCID
将yaml文件中的CHAINCODE_CCID更换成为对应的 chaincode 识别码
1 | # 部署 chaincode 到aks上 |
完成部署。
10.3审核链码的安装
请在peer-cli-org1/peer-cli-org2 这2个pod中允许链码的安装,记得修改CHAINCODE_CCID
※peer-cli-org1 及 peer-cli-org2的CHAINCODE_CCID 需要对应到各自的chaincode识别码
1 | $ peer lifecycle chaincode approveformyorg --channelID mychannel --name marbles --version 1.0 --init-required --package-id marbles:e001937433673b11673d660d142c722fc372905db87f88d2448eee42c9c63064 --sequence 1 -o orderer0:7050 --tls --cafile $ORDERER_CA --signature-policy "AND ('org1MSP.peer','org2MSP.peer') |
检查所有org允许状态
1 | $peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name marbles --version 1.0 --init-require |
至此,2个peer-cli都审核完毕。
之后提交到channel 中
1 | peer lifecycle chaincode commit -o orderer0:7050 --channelID mychannel --name marbles --version 1.0 --sequence 1 --init-required --tls true --cafile $ORDERER_CA --peerAddresses peer0-org1:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1/peers/peer0-org1/tls/ca.crt --peerAddresses peer0-org2:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2/peers/peer0-org2/tls/ca.crt --signature-policy "AND ('org1MSP.peer','org2MSP.peer')" |
10.4测试
1 | # 查询安装的链码 |
开发Client Application
目前hyperledger不对外,请使用kubectl port-forward的方式连进去。
指令:
1 | kubectl port-forward ${pord-id} 7050:7050 |
参考 fabric-samples 中typescript所撰写的范例 ※另有java, go 语言的范例!!
以下为typerscript 范例:
1 |
|
上述为app.ts,此app.ts会读取connection.json档,此档用于定义peer url以及peer的tls凭证路径。
1 | { |
- application连到peer的时候必须要有tls 凭证去验证peer service是否安全及正确。
- 当交易的时候需要提供该使用者(user or admin)的交易凭证(x509 cert +private key)
路径对应如下:
tls CA Cert: crypto-config\peerOrganizations\org1\tlsca\tlsca.org1-cert.pem
X509 certificate: crypto-config\peerOrganizations\org1\users\Admin@org1\msp\signcerts\Admin@org1-cert.pem
X509 privateKey: crypto-config\peerOrganizations\org1\users\Admin@org1\msp\keystore\priv_sk
[color=#d85887]
成功收到资料如图
附录、参考连结
- Hyperledger 参考链接
- Hyperledger 官方文件
- Hyperledger Git Repository
- Hyperledger 中文文档
- Hyperledger 手动部署全纪录
- 部署Hyperledger2.2 于 Kubenetes
- 部署Hyperledger2.2 于 Kubenetes 代码
- 凭证说明
- Kubenetes 参考链接
- NFS 架构参考链接
部署 fabric 和 CA 与 Kubenetes 之上