测试将fabric运行在k8s网络上的时候遇到一个flannel的网络问题:运行在k8s-node2上的pod连接不上运行在k8s-node1上的pod,报错如下:
Error: error getting endorser client for channel: endorser client failed to connect to peer0-org1:7051: failed to create new connection: context deadline exceeded
首先想到的可能是我的配置文件出现了问题,比如域名配置错误或者pod压根没运行起来,于是再三确认配置文件跟pod的运行状态,确定不是这个问题,就想着可能是k8s的网络问题,于是在cli-org1里使用telnet命令来测试能否连接peer0-org1,发现返回的结果一直停留在Trying 10.99.60.74...
,说明这两个容器彼此之间网络是不通畅的,于是我顺便telnet一下peer0-org2,发现两者是可以连接上的,于是查看一下peer0-org1与peer0-org2的网络地址:
cli-org1的网络地址如下:
顺着这条思路,说明10.244.2.0网段与10.244.1.0网段是连接不上,到cli-org1所在的k8s-node2服务器上使用ip r s命令查看路由表配置:
发现10.244.1.0并不在k8s-nodes上的flannel网络上,意味着cli-org1根本就不知道去哪里找到peer0-org1,问题到这里就很清晰了,因为flannel插件是使用deamonset的方式部署,所以我们只需要删除掉现有运行在k8s-node2节点上的flannel,系统会自动重启一个新的flannel pod,并且从configMap中获取最新的配置。
- 1.获取运行在k8s-node2上的flannel
kubectl get pods -n kube-system -o wide
- 2.删除flannel
kubectl delete pod kube-flannel-ds-amd64-nfllk -n kube-system
- 3.查看flannel的网络配置
ip r s
10.244.1.0这个网段已经更新到k8s-node2的路由表上了,重新telnet发现网络通了,