一、问题描述
经过重启系统后,calico-node无法正常启动,如下图所示:
二、问题排查
1)首先查看一下这个Pod的日志
kubectl logs calico-node-sgqqr -n kube-system
2)再describe打印一下calico-node的信息
kubectl describe po calico-node-sgqqr -n kube-system
Envents如下:
通过describe中的线索,发现问题指向一个名为install-cni的容器,并且在node2节点上,因此我们登录到node2节点上看看这个install-cni容器的状态与日志。
install-cni容器是一个初始化容器,在每个节点上创建cni的配置文件。
在每个Node上安装CNI二进制文件到cni-bin-dir目录下,并安装相应的网络配置文件到cni-conf-dir目录下。
3)通过ssh登录node2,并通过docker查看该容器日志:
通过docker日志输出发现install-cni的container报错:
[ERROR][1]cni-installer/<nil><nil>:Unable to create token for CNI kubeconfig error=Post "https://172.17.0.1:443/api/v1/namespaces/kube-system/serviceaccounts/calico-node/token": dial tcp 172.17.0.1:443: connect: network is unreachable.
该容器报错,说明是由于install-cni容器无法连接到172.17.0.1:443端口造成的,因此在node2上使用curl来测试一下端口的连通性。
4)测试网络联通
首先用curl 来测试一下node节点与master的连通性(192.168.10.9是master的IP)
curl -k https://192.168.10.9:6443
结果如下
返回结果403,说明节点访问正常。
再试一下从node2节点访问aipserver的SVC
curl -k https://172.17.0.1:443
结果如下
显示网络不可达,说明SVC访问出了问题。
三、问题分析
根据以上情况判断,node间是网络联通的,但容器不通。请求是通过kube-porxy进行传递的,kube-proxy会在iptables中添加规则。无法通过SVC找到POD,那说明可能是iptables或者路由出了问题,iptables和kube-porxy有关系,所以主要排查方向放在kube-proxy上和route上。
四、问题解决
1)在node2节点上重启kube-proxy,并在mastar节点上删除原有pod,
docker restart kube-proxy
发现问题并没有得到解决,于是查看路由表。
2)查看Node2上的路由表,并与node1上的路由表做一个比对
route -n
缺少默认路由,于是手动添加默认路由:
route add default gw 192.168.10.150
删除有问题的calico-node,问题解决,恢复正常。GOOOOOOOOOOOOOOOOD!!!!