区块链100篇之将fabric部署在k8s上

2023-11-09

有了上一篇的基础,这一篇就尝试将fabric部署在k8s上,以下的操作的前提条件是自己已经对docker-compose部署fabric比较熟悉了,可以先搞清楚fabricase目录下的fabric_raft项目。

1.修改DNS

在真正开始部署之前,需要先解决一个问题,就是下面会使用到将unix:///var/run/docker.sock挂载进peer容器中,因为在1.4.X版本peer 容器需要调用 Docker 引擎的接口来构建和创建 chaincode 容器,但通过 docker.sock 创建的容器脱离在 k8s的体系之外,这会导致chaincode容器通过宿主机的DNS无法找到运行在k8s体系上的peer节点容器,所以这里需要先解决DNS的问题,解决方式参考网上的教程,在每个worker节点上的/etc/default/docker文件中添加DOCKER_OPTS参数,具体操作如下:

  • 1.获取宿主机DNS
cat /etc/resolv.conf  # 我这里是127.0.0.53
  • 2.获取kube-dns的ip
 kubectl get svc -n kube-system
  • 3.添加DOCKER_OPTS参数
vim /etc/default/docker
DOCKER_OPTS="--dns=10.96.0.10 --dns=127.0.0.53 --dns-search default.svc.cluster.local --dns-search svc.cluster.local --dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2"

systemctl daemon-reload
systemctl restart docker
2.生成证书与启动fabric网络所需的配置文件
git clone https://github.com/Jalins/fabricase.git
cd fabricase/fabric-on-k8s
bash fabricOps.sh start

注意:因为网络的问题,自己去GitHub上将fabric的cryptogen、configtxgen二进制文件下载下来放在/usr/local/bin目录下。

3.部署orderer节点

文件在orderer-service目录下,总共有六个文件,只需要搞清楚orderer0-deployment.yaml与orderer0-svc.yaml这两个文件即可,其他的四个文件都以此类推,这里就不细讲k8s的yaml文件格式,有兴趣自己上网搜一下其他教程,简单看一下orderer0-deployment.yaml文件,大部分的声明跟写docker-compose的yaml文件差不多,挂载卷不再是通过":"来指定,而是通过声明的方式来指定,如:
在这里插入图片描述
稍微不同,但还是好理解,这里稍微要注意的就是因为pod是运行在worker节点上且不确定是运行在哪个worker节点的,所以每个worker节点上一定要存在该路径,不然启动的时候会报找不到文件的错误,建议可以使用nfs来统一管理目录文件。
文件中还有另外一处是关于节点的亲和性。
在这里插入图片描述
这里的意思是根据节点上的标签来约束 pod 可以调度到哪些节点,意思就是希望orderer0、orderer1和orderer2都调度到同一个worker节点上,但因为这里声明了preferredDuringSchedulingIgnoredDuringExecution,意思是调度器将尝试执行但不能保证的最终所指定的节点会调度到同一个节点上,如果要硬性规定的话可以使用requiredDuringSchedulingIgnoredDuringExecution字段来声明。
关于orderer0-svc.yaml文件看一下大概就明白是怎么回事了,这个文件的作用就只是发现后端的pod服务,并提供负载均衡的能力,不懂可以看一下这篇 浅谈 kubernetes service 那些事
大概明白这些文件的含义之后,在master节点上可以一次性执行下面的命令:

kubectl apply -f orderer-service/

这个命令会将所有的orderer节点跟相对应的service服务都启动起来,也可以一个文件一个文件执行。

kubectl apply -f orderer-service/orderer0-deployment.yaml
...
4.部署peer节点

peer的yaml文件有几点注意的,首先是couchdb跟peer是运行在同一个pod中,这样做的好处是peer容器可以直接使用localhost访问到couchdb的容器。
在这里插入图片描述
再者就是链码的监听地址要为0.0.0.0:7052,不然在实例化链码的时候会出现链码容器连接不上peer的错误。
在这里插入图片描述
还有就是service的yaml文件中需要使用到NodePort,主要是为了后续让SDK访问到peer容器,可以与k8s上的fabric网络进行交互。
在这里插入图片描述
这样sdk可以使用grpcs://worker节点的ip:30001访问到该节点。
部署:

kubectl apply -f org1/org1-peer0-deployment.yaml
kubectl apply -f org1/org1-peer0-svc.yaml

kubectl apply -f org2/org2-peer0-deployment.yaml
kubectl apply -f org2/org2-peer0-svc.yaml
5.部署CA

将CA服务器的根证书与私钥指定为组织的根证书与私钥,这样由CA服务器签发出来的证书才能通过fabric网络的认证,只需在yaml文件中修改替换成相对应的即可。
在这里插入图片描述
挂载路径要指定正确,还有就是service的也要使用NodePort,这样sdk才能连接到。

部署:

kubectl apply -f org1/org1-ca-deployment.yaml
kubectl apply -f org1/org1-ca-svc.yaml

kubectl apply -f org2/org2-ca-deployment.yaml
kubectl apply -f org2/org2-ca-svc.yaml
6.部署cli

因为是部署在同一个k8s体系下的namespace,可以直接通过域名的方式访问到pod。
在这里插入图片描述
上面通过NodePort是为了让k8s系统外的服务能连接进来,但在k8s内部就简单多了,可以直接通过域名访问,这是因为k8s有自己的一套域名解析。

kubectl apply -f org1/org1-cli-deployment.yaml

因为是演示,这里就只部署一个cli,下面就使用这个cli来创建通道与安装实例化链码。

7.通道与链码操作
  • 7.1进入cli:
kubectl exec -it cli-org1-xxx bash -n hyperledger
  • 7.2 创建通道
CHANNEL_NAME=mychannel
CHAINCODE_NAME=mycc
peer channel create -o orderer0:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
  • 7.3 加入通道
peer channel join -b channel.block
  • 7.4 更新锚节点
peer channel update -o orderer0:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1Anchors.tx --tls --cafile $ORDERER_CA
  • 7.5 安装链码
peer chaincode install -n $CHAINCODE_NAME -v 1.0 -p github.com/hyperledger/fabric/peer/chaincodes/ccexample
  • 7.6 切换到Org2MSP
CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2/peers/peer0-org2/tls/server.crt
CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2/peers/peer0-org2/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2/peers/peer0-org2/tls/ca.crt
CORE_PEER_ADDRESS=peer0-org2:7051
CORE_PEER_LOCALMSPID=Org2MSP
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2/users/Admin@org2/msp

操作跟上面一样的,就直接一笔带过了。

peer channel join -b mychannel.block

peer channel update -o orderer0:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2Anchors.tx --tls --cafile $ORDERER_CA

peer chaincode install -n $CHAINCODE_NAME -v 1.0 -p github.com/hyperledger/fabric/peer/chaincodes/ccexample
  • 7.7 实例化链码
CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1/peers/peer0-org1/tls/server.crt
CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1/peers/peer0-org1/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1/peers/peer0-org1/tls/ca.crt
CORE_PEER_ADDRESS=peer0-org1:7051
CORE_PEER_LOCALMSPID=Org1MSP
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1/users/Admin@org1/msp

peer chaincode instantiate -o orderer0:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n $CHAINCODE_NAME -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
  • 7.8 调用链码
peer chaincode invoke -o orderer0:7050  --tls --cafile $ORDERER_CA -n $CHAINCODE_NAME -c '{["invoke","a","b","10"]}' -C $CHANNEL_NAME
  • 7.9 查询链码
peer chaincode query -C $CHANNEL_NAME -n $CHAINCODE_NAME -c '{"Args":["query","a"]}'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链100篇之将fabric部署在k8s上 的相关文章

  • kubernetes POD IP什么时候会改变?

    我正在尝试将一个整体应用程序移植到 k8s pod 理论上 Pod 被认为是短暂的 建议使用服务概念来提供静态 IP 但到目前为止 在我的测试中 我还没有看到 POD IP 被更改 那么现在的问题是 k8s 什么时候会为我的 POD 分配一
  • Docker nuget连接超时

    尝试利用官方jetbrains teamcity agentKubernetes 上的图像 我已经设法在 Docker 中运行 Docker 但尝试使用以下命令构建 ASP NET Core 映像docker build命令失败于dotne
  • 如何重用现有的持久卷声明

    我已经删除了我的 Elasticsearch 集群 但现在在部署新集群后 我需要访问存储在 3 个持久卷 PV 上的旧数据 如下所述 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS
  • 从头开始使用映像部署无法启动

    我正在使用以下内容构建图像Dockerfile FROM golang 1 19 2 bullseye as builder COPY src src WORKDIR src RUN CGO ENABLED 1 go build race
  • 如何使用 hostPath 将单个文件映射到 kubernetes pod 中?

    我有一个自己的 nginx 配置 home ubuntu workspace web conf由脚本生成 我更喜欢把它放在下面 etc nginx conf d除了default conf 下面是nginx yaml apiVersion
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • prometheus 节点实例列表

    是否可以使用 prometheus 获取节点实例列表 我有一个节点导出器 但我没有看到这样的指标 我们应该添加一个新的运算符吗 您可以使用kube 状态指标 https github com kubernetes kube state me
  • 运行 istio-proxy 后启动容器/pod

    我正在尝试使用 Istio 和 Envoy 通过 Kubernetes 实现服务网格 我能够设置服务和 istio proxy 但无法控制容器和 istio proxy 的启动顺序 我的容器是第一个启动的 并尝试通过 TCP 访问外部资源
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • 如何发现 Python Fabric 中的当前角色

    这是一个非常Fabric http docs fabfile org具体问题 但更有经验的 python 黑客可能能够回答这个问题 即使他们不了解 Fabric 我试图根据命令运行的角色来指定不同的行为 即 def restart if S
  • Kubernetes - 服务之间的通信

    我目前正在开发 kubernetes 集群 集群工作正常 我需要在不使用代理的情况下建立服务之间的通信 例如我有以下服务 worker app1 app2 app3 Worker 需要直接通过 SSH 登录应用程序容器并执行一些命令 在 d
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Spring OAuth2 Keycloak Kubernetes 内部/外部访问

    我在 Kubernetes 集群内配置了 Keycloak 10 0 3 服务器 keycloak 服务器必须处理外部用户的身份验证 使用外部 url 并处理用于 Spring 微服务通信的 oauth2 令牌 然后Web应用程序Sprin
  • 如何根据 Kubernetes / Docker 事件发送警报?

    是否可以根据 Kubernetes 集群内发生的事件以某种方式发送警报 到电子邮件 slack 特别是 如果 Pod 意外重新启动或 Pod 无法启动 那么获取警报将非常有用 同样 了解 Pod 的 CPU 使用率是否超过特定阈值并获取警报
  • 如何将新的 Kubernetes Minion 添加到当前集群

    我有一个运行在 3 台服务器上的 Kubernetes 集群 一台主服务器和 2 台服务器 我想添加另一个小黄人 是否可以添加 Minion 而无需再次进行完整安装 到目前为止 在寻找执行此操作的指南时 我只能找到有关建立整个集群的优秀指南
  • 允许 Kubernetes 用户列表/获取命名空间

    我有以下用户清单 我希望允许 myapp user 获取集群内所有命名空间的列表 根据我的查找 我应该创建一个 ClusterRole 但我无法真正找到足够的详细信息 是否有所有 apiGroup 以及相应资源和动词的列表 apiVersi
  • Google Kubernetes Engine 中的存储 ReadWriteMany

    有没有一种方法能够提供 ReadWriteMany 存储而无需实现存储集群 我能够使用 gcsfuse 提供存储 但速度非常慢 我需要接近 GlusterFS 速度的东西 我目前正在使用 GlusterFS 另一种选择 Google Clo
  • 通过 kubernetes 标签或注释对 prometheus 目标进行分组?

    我有两个关于普罗米修斯的问题 我使用这个舵图 https artifacthub io packages helm prometheus community prometheus modal values https artifacthub
  • 如何允许 Kubernetes 作业访问主机上的文件

    我已经彻底阅读了 Kubernetes 文档 但在与主机文件系统上的文件与 K8 作业启动的 pod 内运行的应用程序进行交互时仍然遇到问题 即使是最简单的实用程序也会发生这种情况 因此我提供了 yaml 配置的精简示例 此处引用的本地文件
  • 如何从清单文件(通常是清单文件与 kubectl 运行)使用 kubectl port-forward

    我正在尝试在本地使用 Kubernetes 运行我的第一个应用程序 或者我应该说 minikube 我有一个非常基本的 Web 服务器 一个本地 docker 镜像 和官方 mongodb 我想从 dockerhub 中提取 镜像 我并不是

随机推荐

  • 谭铁牛院士:向生物学习 开启模式识别新突破

    人们在观察事物或现象的时候 常常要把各个相似的但又不完全相同的事物或现象组成一类 例如一个数字有不同的写法 对一个人来说 某一种写法虽然没有见过 但大脑却能自动将这个字识别出来 这种模式识别行为虽然人们早已司空见惯 在中国科学院院士谭铁牛看
  • 前端学习历程

    前言 还记得刚接触前端应该是两年前了吧 我就顺着回忆 慢慢写下我对前端的学习路程以及一些资源 初入坑 html css基础 这个是学习前端最基础的部分了 一开始看的是W3cschool 先看其中的html和css基础部分 一些常用标签 以及
  • Python常用的第三方库汇总【推荐】

    Python常用的第三方库汇总 pymysql 操作MySQL数据库 Flask 一个 Python 后端开发的微型框架 numpy 进行科学计算所需的基础包 pillow 非常好用的图像处理库 opencv python 图像处理库 Ma
  • google扫码库barcode-scanning的使用

    一 加入barcode scanning库 捆绑模式扫码 implementation com google mlkit barcode scanning 17 1 0 二 编写扫码分析类 用于分析扫码数据并回调方法返回结果 package
  • DuiLib使用教程之二---测试工程

    DuiLib测试工程 以下内容为原创 欢迎转载 转载请注明 来自试着不呼吸的博客 http blog csdn net haiqiang softwo article details 21485283 通过上节 http blog csdn
  • 短视频APP是如何开启你的美好生活的?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯视频云终端团队发表于云 社区专栏 常青 2008 年毕业加入腾讯 一直从事客户端研发相关工作 先后参与过 PC QQ 手机QQ QQ物联 等产品项目 目前在腾讯视频云团队负
  • 多态和虚函数的基本概念和用法

    C 多态 多态按字面的意思就是多种形态 当类之间存在层次结构 并且类之间是通过继承关联时 就会用到多态 C 多态意味着调用成员函数时 会根据调用函数的对象的类型来执行不同的函数 多态的优点 代码组织结构清晰 可读性强 利于前期和后期的扩展以
  • steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

    前言 时不可以苟遇 道不可以虚行 今天的的前言诗句特地百度搜索了一下 诗句大概的意思是 时机是不可能随便就能遇到的 道路也要一步一步踏实地行走 象征着好运的诗句 之所以特地去找这样意思的诗句 主要的原因是 今天就是四六级考试 想给自己带来一
  • 利用Python(netCDF4库)读取.nc文件(NetCDF气象数据文件)的基本操作

    NetCDF network Common Data Form 网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准 目前 NetCDF广泛应用于大气科学 水文 海洋学 环境模拟 地球物理等诸多领域 用户可以借助多种方式方便
  • LeetCode--初级算法--字符串类算法

    反转字符串 题目 编写一个函数 其作用是将输入的字符串反转过来 示例 1 输入 hello 输出 olleh 示例 2 输入 A man a plan a canal Panama 输出 amanaP lanac a nalp a nam
  • flask配置https协议

    感谢https blog csdn net qq 33934427 article details 127456673 文中多有参考再实践 一 要用https协议需要有ca证书 在windows10先下载windows版本openssl 地
  • uni-app (路由)

    介绍 uni app页面路由为框架统一管理 开发者需要在pages json里配置每个路由页面的路径和页面样式 类似的小程序在app json中配置页面路由相同 所以uni app的路由用法与Vue Router不同 如仍希望采用Vue R
  • Android12及所有版本解决没有system读写权限(只需要magisk面具)

    通过magisk挂载文件的方式来修改system 不用解锁system或挂载读写 前提条件 你要确保你已经正确刷入了Magisk 刷面具保姆级别教程 举一反三 多种手机通用 这个方法实际上就相当于刷模块来达到修改的目的 本文只是给小白普及一
  • 时间同步服务chrony的简单配置

    一 chrony服务器的简介 chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件 它能让计算机保持系统时钟与时钟服务器 NTP 同步 因此让你的计算机保持精确的时间 Chrony也可以作为服务端软件为其他计算机提供时间
  • vue-router安装失败

    当安装vue router遇到以下问题 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resol
  • 食品PC端的轮播图的文字和图片怎么修改

  • C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式 1 更改Form designer cs文件 将控件的设为Public 供子窗体访问 在designer cs文件的最后 找到你的控件声明 private System Windows Forms T
  • Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法 使用官方提供的windeployqt工具 Qt 官方开发环境使用的动态链接库方式 在发布生成的exe程序时 需要复制一大堆 dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此 Qt
  • 深入浅出理解视频编码H264结构(内涵福利)

    转自 https www jianshu com p 9522c4a7818d 在国内直播 欣欣向荣 ps 其实大多都亏钱 为的就是炒概念 的年代 相信很多小伙伴也投入了技术的浩瀚大洋当中 ps 其实就是搬砖 日复一日 音 视频的神秘面纱开
  • 区块链100篇之将fabric部署在k8s上

    有了上一篇的基础 这一篇就尝试将fabric部署在k8s上 以下的操作的前提条件是自己已经对docker compose部署fabric比较熟悉了 可以先搞清楚fabricase目录下的fabric raft项目 1 修改DNS 在真正开始