如何实现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

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