K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决
同事反应k8s集群中的服务不太好使,经常无响应。发现calico服务异常
登陆master1节点 使用calicoclt 查看calico集群节点状态
export ETCD_ENDPOINTS=http://*.*.*.*:2379
calicoctl node status
集群各节点状态都为passive
更换其他节点检查calico状态,发现master1节点IP地址并非网络流量地址,且状态不正常。
修改calico的yaml文件,添加配置项
# Specify interface
- name: IP_AUTODETECTION_METHOD
value: ""
IP_AUTODETECTION_METHOD 配置项默认为first-found,这种模式中calico会使用第一获取到的有效网卡,虽然会排除docker网络,localhost啥的,但是在复杂网络环境下还是有出错的可能。在这次异常中master1上的calico选择了一个bridge网卡。
为了解决这种情况,IP_AUTODETECTION_METHOD还提供了两种配置can-reach=DESTINATION,interface=INTERFACE-REGEX。
can-reach=DESTINATION配置可以理解为calico会从部署节点路由中获取到达目的ip或者域名的源ip地址。例如
# Using IP addresses
IP_AUTODETECTION_METHOD=can-reach=8.8.8.8
IP6_AUTODETECTION_METHOD=can-reach=2001:4860:4860::8888
# Using domain names
IP_AUTODETECTION_METHOD=can-reach=www.google.com
IP6_AUTODETECTION_METHOD=can-reach=www.google.com
interface=INTERFACE-REGEX配置可以指定calico使用匹配的网卡上的第一个IP地址。列出网卡和IP地址的顺序取决于系统。匹配支持goalong的正则语法。例如:
# Valid IP address on interface eth0, eth1, eth2 etc.
IP_AUTODETECTION_METHOD=interface=eth.*
IP6_AUTODETECTION_METHOD=interface=eth.*
环境中节点网卡名称并没有统一,我正则写的很烂。而集群网络环境还算简单只是跨了两个网段,使用can-reach,目的地址为DNS服务器地址,可以统一各节点的ip选择。
配置完成后kubectl apply -f calico.yaml 更新配置。再次查看calico节点状态,集群节点状态正常,集群恢复。
参考文档
https://docs.projectcalico.org/maintenance/troubleshooting#error-caliconode-is-not-ready-bird-is-not-ready-bgp-not-established-with-10001
https://github.com/projectcalico/calico/issues/2561
https://docs.projectcalico.org/v2.6/reference/node/configuration#ip-autodetection-methods