如何實現K8S託管Fabric chaincode

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

  1. 確保你的k8s集羣你能拉取如下兩個鏡像

    docker pull tianrandailoving/puller-amd64:v-7-gca7ab85
    docker pull tianrandailoving/peitho-amd64:v-7-gca7ab85
    
  2. 配置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
    
  3. 配置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
    
  4. 創建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

  1. 修改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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章