如何实现K8S托管Fabric chaincode

chaincode创建流程:

image

如图所示, 原生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,完全感知不到.如下图所示:

image

目前业界已经有人实现了这种方案: 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: #邮箱
              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
    
  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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容