欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决

程序员文章站 2022-07-14 15:20:23
...

同事反应k8s集群中的服务不太好使,经常无响应。发现calico服务异常
K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决
登陆master1节点 使用calicoclt 查看calico集群节点状态

export ETCD_ENDPOINTS=http://*.*.*.*:2379
calicoctl node status

集群各节点状态都为passive
K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决
更换其他节点检查calico状态,发现master1节点IP地址并非网络流量地址,且状态不正常。
K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决
修改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节点状态,集群节点状态正常,集群恢复。
K8S网络异常 calico/node is not ready: BIRD is not ready: BGP not established异常解决

参考文档
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