本节参考官方文档,介绍了如何使用K8S的方式部署Fabric测试网络。
一、说明
fabric-samples/test-network-k8s/将Fabric测试网络重建为云原生(cloud native)的应用程序。目标如下:
- 提供简单的一键式操作来运行Fabric测试网络。
- 提供在Kubernetes上部署生产型网络的参考指南。
- 为开发链码、网关和区块链应用程序提供云就绪(cloud ready)平台。
- 为Fabric CA操作和部署指南提供Kube补充。
- 支持向Chaincode as a Service的过渡。
- 支持从内部、Docker守护进程到外部链码构建器的转换。
- 在任何Kube上运行。
注:本章节必须使用代理,详见《笔记三》3.7节。
二、准备
2.1. kubectl
kubectl是Kubernetes的命令行工具,通过它可以对Kubernetes集群运行命令,例如部署应用程序、检查和管理集群资源以及查看日志等。
使用snap包管理器安装kubectl:
snap install kubectl --classic
kubectl version
注:这里提示
The connection to the server localhost:8080 was refused - did you specify the right host or port?
是正常的,因为我们仅仅安装了命令行工具(客户端),还没有安装Kubernetes集群(服务端)。
2.2. kind
kind是一个在本机上运行Kubernetes的工具。
使用二进制文件的形式安装kind:
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
注:最新版本可查看https://github.com/kubernetes-sigs/kind/releases。
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
kind version
2.3. minicube(供参考)
minicube跟kind类似,同样是一个在本机上运行Kubernetes的工具,因为测试网络提供的脚本只支持使用kind,所以仅供参考。
使用二进制文件的形式安装minicube:
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
minikube start
minikube stup
三、使用
kind在创建集群的时候会直接使用当前的环境变量中有关代理的参数(http_proxy、https_proxy等)。特别要注意的是,环境变量中的这些参数不能使用127.0.0.1的IP,这是因为KIND 节点是Docker容器,而容器内的127.0.0.1指向容器本身,而非宿主机。
因此,首先将网络代理中的IP修改为宿主机的IP:
打开一个新的终端,使用env命令确认环境变量已正确设置。
进入k8s测试网络的目录:
cd hyfa/fabric-samples/test-network-k8s/
为了复用已准备好的镜像文件和二进制文件,做如下准备:
docker tag hyperledger/fabric-peer:2.5.12 hyperledger/fabric-peer:2.5
docker tag hyperledger/fabric-ca:1.5.15 hyperledger/fabric-ca:1.5
cp -r ../bin ./
创建一个KIND的集群:
./network kind
KIND集群初始化:
./network cluster init
启动测试网络,创建通道并部署basic链码:
./network up
./network channel create
./network chaincode deploy asset-transfer-basic ../asset-transfer-basic/chaincode-java
停止KIND集群:
./network unkind
四、报错
错误1
KIND集群初始化时提示如下错误:
Waiting for deployment "cert-manager" rollout to finisd
查看"cert-manager"下的Pods:
kubectl get pods -n cert-manager
进一步打开"cert-manager"下Pods的详细信息:
kubectl describe pod -n cert-manager
找到"Events":
手动获取缺失的镜像并加载:
docker pull quay.io/jetstack/cert-manager-controller:v1.6.1
docker pull quay.io/jetstack/cert-manager-webhook:v1.6.1
docker pull quay.io/jetstack/cert-manager-cainjector:v1.6.1
kind load docker-image quay.io/jetstack/cert-manager-controller:v1.6.1 --name kind
kind load docker-image quay.io/jetstack/cert-manager-webhook:v1.6.1 --name kind
kind load docker-image quay.io/jetstack/cert-manager-cainjector:v1.6.1 --name kind
再一次查看"cert-manager"下的Pods:
kubectl get pods -n cert-manager
错误2
KIND集群初始化时提示如下错误:
timed out waiting for the conditon on pod/ingress-nginx-controller
查看"ingress-nginx"下的Pods:
kubectl get pods -n ingress-nginx
进一步打开"cert-manager"下Pods的详细信息:
kubectl describe pod -n ingress-nginx
找到"Events",手动获取缺失的镜像并加载:
kubectl describe pod -n ingress-nginx
docker pull k8s.gcr.io/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f78405c
docker pull k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
kind load docker-image k8s.gcr.io/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f78405c --name kind
kind load docker-image k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660 --name kind