使用composer+k8s部署hyperledger fabric 1.1.0
最近在K8s 上升级了 fabric 网络, 然后想结合Hyperledger Composer来部署一些例子。中间遇到了一些问题,走了一些弯路,在这里记录下来。其实问题答案很简单,一些没注意的地方。
首先说一下背景,在这篇部署 Fabric 多组织的教程中,最重要的是其中的连接描述文件,这个文件中描述了整个 Fabric 网络的结构,如有几个组织?每个组织下有几个 Peer?有多少个 Orderer?有哪些通道?又有哪些 Peer 加入了通道?连接时是否使用 TLS?等等。在依照教程走完后,又尝试在原先的 K8s 环境中也进行一次部署,这里就产生问题了。
- 在 k8s 中无法正常导入 network card - 教程中使用 TLS 连接各 Peer 节点 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- "peer1.org1.example.com": { 
 "url": "grpcs://localhost:8051",
 "eventUrl": "grpcs://localhost:8053",
 "grpcOptions": {
 "ssl-target-name-override": "peer1.org1.example.com"
 },
 "tlsCACerts": {
 "pem": "-----BEGIN CERTIFICATE-----\nMIICSTCCAe+gAwIBAgIQUF0P/..."
 }
 },
- K8S 中没有使用 TLS 方式(错误) - 1 
 2
 3
 4- "peer1.org1.example.com": { 
 "url": "grpcs://localhost:8051",
 "eventUrl": "grpcs://localhost:8053"
 }
- 正确的方式(注意区分 grpcs 和 grpc) - 1 
 2
 3
 4- "peer1.org1.example.com": { 
 "url": "grpc://localhost:8051",
 "eventUrl": "grpc://localhost:8053"
 }
- 怎么发现的 - 在这个项目中,运行脚本时有条命令执行失败 - composer card import -f PeerAdmin@byfn-network-org1.card ... PEM encoded certificate is required.- 这里使用了 Nodejs 的 Inspect 功能 - 1 - node --inspect-brk ~/.nvm/versions/node/v8.11.1/bin/composer card import -f PeerAdmin@byfn-network-org1.card - 在 Google 浏览器打开 chrome://inspect  - 打开右上角的 pause on caught exception 开关  - 在跳过前几次异常后,会跳到~/.nvm/versions/node/v8.11.1/lib/node_modules/composer-cli/node_modules/fabric-client/lib/Remote.js 这个文件中这一段代码 - 1 
 2
 3
 4
 5
 6
 7- if (protocol === 'grpc') { 
 this.addr = purl.host;
 this.creds = grpc.credentials.createInsecure();
 } else if (protocol === 'grpcs') {
 if(!(typeof pem === 'string')) {
 throw new Error('PEM encoded certificate is required.');
 }- 当时看到这里时,顿时就是明白了,grpcs 代表 TLS 连接,而 grpc 则代表非加密连接,修改连接配置文件,代码成功执行。 
 
- 在 k8s,无法正常执行 composer network start,也即无法实例化 Chainacode - 这个问题折腾了一个下午,通过查看容器日志,发现在执行Chaincode实例化的化时候,需要生成类似如下镜像文件- 1 
 2
 3
 4
 5
 6
 7
 8
 9- deploy@devops2:~$ docker images |ag dev 
 dev-peer0.org2-trade-network-0.2.4-deploy.0-xxx
 `其中peer0.org2是节点名字,表示组织2上的peer0这个节点,trade-network是composer生成的Business Network名称,0.2.4-deploy.0是Business Network的版本号,这个镜像一开始是没有的,需要根据hyperledger/fabric-ccenv构建出来,在我们的这个K8S环境中,就是这个镜像构建失败,导致Chaincode无法实例化而出现问题。这也是1.1.0这个版本与前几个版本的一个区别,在构建镜像的过程中,需要通过NPM下载一些工具,却发现NPM下载失败。 一开始我还怀疑是不是翻墙的问题,结果发现是Docker容器启动后根本就无法连接网络,这就郁闷了。这里用到了一些测试工具。`
 docker run -it webwurst/curl-utils > ping www.baidu.com > curl -v www.baidu.com
 `问题的根本原因:错误的docker启动项`
 deploy@devops2:~\$ cat /etc/systemd/system/docker.service.d/docker-options.conf
 [Service]
 Environment="DOCKER_OPTS=--insecure-registry=10.233.0.0/18 --graph=/var/lib/docker --log-opt max-size=50m --log-opt max-file=5 --iptables=false"- 在 dockerd 的 man 手册页里面,–iptables 默认为 true,不知道为什么这里设置成了 false,删除掉这个选项后,系统工作正常了。 
