本文永久链接: https://www.xtplayer.cn/calico/readiness-probe-failed-calico-node-is-not-ready-bird-is-not-ready/

问题现象

在通过 rancher ui 或者 rke 安装 k8s 集群时,如果使用的是 calico 网络驱动,可能会出现 calico-node pod 一直无法正常 running。通过执行 kubectl -n kube-system describe calico-node-xxx 命令查看 calico-node pod 事件,可以看到类似如下的报错。

Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused
或者
calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/bird/bird.ctl: connect: no such file or directory

或者

以上两种报错是比较常见也是比较通用的问题报错,它可能由多种原因导致。

问题场景一:calico 识别的主机接口不匹配

通过关键字 calico/node is not ready: BIRD is not ready 百度或谷歌查询,可以看到大多数解决方案都是说接口不匹配导致。比如以下 calico 官方 issue

https://github.com/projectcalico/calico/issues/2834

https://github.com/projectcalico/calico/issues/2042#issuecomment-408488357

解决方法是编辑 calico-node ds,在 calico-node 容器层级的 env 下添加如下配置。

- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*"

问题场景二:clusterrole 权限问题导致

执行 kubectl -n kube-system edit ds calico-node , 在 calico-node 容器层级的 env 下添加

- name: FELIX_LOGSEVERITYSCREEN
value: Debug

如果是 rancher 部署的 calico 驱动,默认已经有 FELIX_LOGSEVERITYSCREEN,只需要把 value 改为 Debug 即可。

再执行 kubectl -n kube-system logs calico-node-xxxx 查看 calico-node pod 日志,可以看到提示 calico-node clusterrole 缺少某些权限。根据提示缺少的权限,执行 kubectl edit clusterrole calico-node 将缺少的权限添加即可。