chaincode创建流程:
如图所示, 原生fabric创建chaincode, 是由peer发起的操作,也就是在进行合约初始化(或者chaincode挂的情况下调用合约),peer会去请求宿主机上的docker创建chaincode,chaincode启动后通过grpc连接peer(peer开启了7052端口).
那要实现k8s托管chaincode的生命周期, 必然要把chaincode创建的过程交给k8s, 那么就会涉及到调用k8sapi了, 在peer源码中调用k8sapi 就会涉及到对peer的源码改造, 这显然有点难, 那有没有其他方式呢? 好在peer调用docker的地址是可以配置的, 通过CORE_VM_ENDPOINT 环境变量可以配置docker的访问地址, 因此可以实现一个代理docker,代理docker去调用k8s, 代理docker的接口保持和docker一致, 然后将CORE_VM_ENDPOINT配置成代理docker的地址,就可以实现把chaincode的生命周期交给k8s管理了,对peer来说,它还是在访问docker,完全感知不到.如下图所示:
目前业界已经有人实现了这种方案: peitho K8S中链码容器管理方案
使用Peitho实现k8s管理chaincode
前提是你的fabric联盟链已经部署在k8s集群中了, 并且fabic-ccenv和fabric-baseos这两个镜像可以拉取
部署peitho
-
确保你的k8s集群你能拉取如下两个镜像
docker pull tianrandailoving/puller-amd64:v-7-gca7ab85 docker pull tianrandailoving/peitho-amd64:v-7-gca7ab85
-
配置peitho-configmap.yaml
apiVersion: v1 data: kubeconfig: |- #填入你获取的k8s 访问凭证 peitho.yml: |- peitho: imageMode: delivery #选择一种模式:registry or delivery,如果选择了registry,那么请配置好docker.registry, delivery模式是自分发镜像模式, 无需依赖镜像中心 pullerAccessAddress: http://peitho:8080/tar #pitho 的tar包下载地址,也就是peitho的访问地址 pullerImage: x.x.x.x:8099/platform/puller-amd64:v-7-gca7ab85 #puller的镜像地址,initcontainer会使用到 k8s: namespace: fabric #命名空间 kubeconfig: /root/kube/kubeconfig #k8s访问配置文件 dns: #如果chaincode 和 peer不在同一个环境的情况下,需要配置peer地址的解析 - 127.0.0.1:peer0.org1.example.com - 127.0.0.1:peer1.org1.example.com - 127.0.0.1:peer0.org2.example.com - 127.0.0.1:peer1.org2.example.com docker: endpoint: unix:///host/var/run/docker.sock # docker的端点,peitho会调用docker来构建chaincode镜像 registry: #镜像仓库相关 server-address: #仓库地址 xxx.xxx.xxx.xxx:xxxx project: #项目名 chaincode email: #邮箱 litesky@foxmail.com username: #用户名 admin password: #密码 harbor log: name: peitho # Logger的名字 development: true # 是否是开发模式。如果是开发模式,会对DPanicLevel进行堆栈跟踪。 level: debug # 日志级别,优先级从低到高依次为:debug, info, warn, error, dpanic, panic, fatal。 format: console # 支持的日志输出格式,目前支持console和json两种。console其实就是text格式。 enable-color: true # 是否开启颜色输出,true:是,false:否 disable-caller: true # 是否开启 caller,如果开启会在日志中显示调用日志所在的文件、函数和行号 disable-stacktrace: false # 是否再panic及以上级别禁止打印堆栈信息 kind: ConfigMap metadata: name: peitho-configmap namespace: fabric
-
配置peitho-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: peitho spec: replicas: 1 selector: matchLabels: app: peitho strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate template: metadata: labels: app: peitho spec: containers: - image: tianrandailoving/peitho:v-7-gca7ab85 imagePullPolicy: Always name: peitho ports: - containerPort: 8080 name: peitho protocol: TCP resources: {} securityContext: allowPrivilegeEscalation: false privileged: false readOnlyRootFilesystem: false runAsNonRoot: false stdin: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File tty: true volumeMounts: - mountPath: /host/var/run/ name: vol2 - mountPath: /root/peitho.yml name: vol1 subPath: peitho.yml - mountPath: /root/kube/kubeconfig name: vol1 subPath: kubeconfig dnsConfig: {} dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - hostPath: path: /var/run/ type: "" name: vol2 - configMap: defaultMode: 256 items: - key: peitho.yml path: peitho.yml - key: kubeconfig path: kubeconfig name: peitho-configmap optional: false name: vol1
-
创建peitho-service.yaml
apiVersion: v1 kind: Service metadata: name: peitho spec: selector: app: peitho type: ClusterIP ports: - name: tcp8080 protocol: TCP port: 8080 targetPort: 8080
更新peer
-
修改peer中的环境变量
CORE_VM_ENDPOINT=tcp://peitho:8080
部署&初始化合约
确保以下两个镜像在你的k8s集群中可以拉取下来, peitho会根据peer中的这个两个环境所配置的镜像去构建chaincode镜像
CORE_CHAINCODE_BUILDER=x.x.x.x:8099/platform/fabric-ccenv:1.4.4
- CORE_CHAINCODE_GOLANG_RUNTIME=x.x.x.x:8099/platform/fabric-baseos:amd64-0.4.18
部署和初始化,这里就不叙述了, 当合约成功初始化之后, 可以在k8s中看到peer的deployment