同事反应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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐