现象:
三节点k8s 集群 :admin, work1,work2
集群版本:1.17
有一个Nodeport类型的service,pod调度在work1, 通过work1:port, work2:port都可以访问到应用,但是admin:port访问不到,虽然admin的对应nodeport端口30865也在listen状态
检查calico-node的Pod状态,发现admin节点的资源虽然running,但是容器not ready, 说明容器中健康检查失败:
查看pod events, 发现有报错信息:
根据行号查看源码 health.go 156行:
可以看到not ready是因为startup的时候,Peer数量大于0(我这里有2个),但是bgp peer 建立数量为0。
那么检查启动日志,发现选择了一个错误的网卡,应该选择192.168.56.3这个网卡,也就是enp0s8, enp0s9只是用来桥接宿主wifi上外网的卡。
具体怎么选择网卡的呢,可以看到如果pod里这个变量为空,那就执行自动检测,取到的第一个IP就会选中,用来建立BGP连接
那么我创建calico的时候,有这个变量吗,可以看到calico-node这个容器中并没有这个变量
尝试添加变量,指定使用enp0s8这个网卡
k edit po calico-node-s9vxf -n kube-system
我发现不能直接修改pod,还是修改了calico.yaml 然后重新apply
$kubectl apply -f calico-v3.10.3.yaml -n kube-system
系统判断calico-node这个DS需要更新,就在3个节点重新生成了一个Pod,admin节点的也启动成功了,检查启动日志,可以看到BGP IP 更新记录
测试admin节点访问服务,成功