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: #郵箱 [email protected] 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