EvenChan's Ops.

K8S calico组件故障排查

字数统计: 643阅读时长: 2 min
2021/01/28

记录k8s集群calico组件故障解决过程,pod报错信息: Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 172.18.0.1


问题

k8s集群重启后,发现在worker节点上的calico组件运行状态如下(图是问题解决后,翻之前的输出截的,没有加-o wide选项):

enter description here


解决

在一开始,我曾尝试着将名为calico-node-fg6bn的pod删除后,让其自行重启,进行解决问题,但是发现这样不行。

然后开始通过kubectl logs -f pod calico-node-fg6bnkubectl describe pod calico-node-fg6bn进行查看日志输出,发现信息如下:

1
Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 172.18.0.1

接着复制上述信息去搜索,在github上看到了以下信息:

enter description here

连懵带猜,估计是calico绑定网卡时,没有绑定到主机上用于群集通信的网卡(ens33),而是绑定到了lo、virbr*等这样的网卡上。

解决办法的话,就是调整calicao 网络插件的网卡发现机制,修改 IP_AUTODETECTION_METHOD 对应的value值。官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这可能会导致一个网络异常的ip作为nodeIP被注册,从而影响 node-to-node mesh 。我们可以修改成 can-reach 或者 interface 的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

那就开始修改calico的配置文件咯!


修改calico配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ kubectl get daemonset -n kube-system     # 获取daemonset资源对象名称
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 3 3 3 3 3 kubernetes.io/os=linux 7d8h
kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 7d8h

$ kubectl edit daemonset calico-node -n kube-system # 编辑calico资源对象

# 进入后在末行模式下搜索:`name: CLUSTER_TYPE`,定位到name: CLUSTER_TYPE位置后,添加以下两行配置:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33" # 指定用于k8s集群中节点之间通信的网卡名称,我这里是ens33
# 上面的value值,支持通配符,可以写成ens*,但不建议这么写,尤其是多网卡主机,最好只写用于群集通信的就行。


# 修改后的部分配置如下:
............... # 省略部分内容
- name: CLUSTER_TYPE
value: k8s,bgp
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
- name: IP
value: autodetect
- name: CALICO_IPV4POOL_IPIP
value: Always
- name: FELIX_IPINIPMTU
............... # 省略部分内容

修改后保存退出,执行指令watch kubectl get pods -A -o wide即可动态观察calico相关的pod重启过程,直至所有pod全部Running,并且READY列为1/1,如下:

enter description here

enter description here

齐活,故障解除。

CATALOG
  1. 1. 问题
  2. 2. 解决
  3. 3. 修改calico配置文件