Kubernetes 集群中某个节点出现 Error querying BIRD: unable to connect to BIRDv4 socket

文章描述了一个Kubernetes集群中calico-nodePod由于无法连接到BIRDv4socket导致的问题。问题分析涉及BGP未建立、配置检查和bird进程状态。解决方案是杀死故障节点上的bird进程,让calico-node重启新进程。执行此操作后,calico-node恢复到正常运行状态,新bird进程也被成功创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题描述

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

Readiness probe failed: 2023-05-04 22:13:23.706 [INFO][224] confd/health.go 180: Number of node(s) with BGP peering established = 0
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.0.145,192.168.0.233,172.26.32.235

2. 环境信息

组件版本
Kubernetesv1.24.2
Containerd1.6.18
Linux Kernel5.4

3. 问题分析

3.1 定位原因

发现 Kubernetes 容器集群中有一个节点出现 calico-node异常的情况,查看该 Pod 的描述信息:

kubectl describe pod calico-node-hd7wm -n kube-system

提示 calico/node 连接 BIRDv4 socket 被拒绝。有网友反映是 calico 配置参数 IP_AUTODETECTION_METHOD 的值需要设置为实际网卡的网卡名称,于是检查配置:

            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eth0"

发现 calico 的配置已经是实际的网卡名称,网卡信息如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.200  netmask 255.255.255.0  broadcast 192.168.0.255
        ether fa:16:3e:e9:41:0a  txqueuelen 1000  (Ethernet)
        RX packets 951363626  bytes 577280343840 (537.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 967287474  bytes 178201446365 (165.9 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看 calico-node 在节点上的 bird 进程,发现 calico-node 在节点上的进程已经启动,于是猜测可能是这个进程已经假死。关于 bird 进程的更多信息请参考:基于 BGP 实现 Calico 的 IPIP 网络

[root@k8s-master1 cni]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:179             0.0.0.0:*               LISTEN      2246613/bird        
......

3.2 解决办法

  • 干掉出问题的节点上 bird 进程,让 calico-node 自动重启一个新的 bird 进程。bird 进程号如上所示是:2246613
kill -9 2246613
  • 删除问题节点上的 calico-node Pod
kubectl delete  pod calico-node-hd7wm  -n kube-system

4. 结论

查看 calico-node 运行状态

kubectl get pods -A

calico-node 运行信息如下:

NAMESPACE              NAME                                        READY   STATUS    RESTARTS        AGE
kube-system            calico-node-9zhv2                           1/1     Running   5 (53d ago)     76d
kube-system            calico-node-dnvlc                           1/1     Running   0               4m1s
kube-system            calico-node-pt9qp                           1/1     Running   0               56d
kube-system            calico-node-wzq2p                           1/1     Running   0               56d
......

在这里插入图片描述

此时 calico-node 已经全部正常,刚才出问题的节点已经处于 Running 状态。查看之前出问题的节点上的 bird 进程状态

netstat -ltnp | grep bird

bird 进行信息如下:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:179             0.0.0.0:*               LISTEN      2253102/bird        
......

bird 进程已经重新创建,新的进程号是 2253102。通过 kill bird 假死进程,重新生成新的 bird 进程解决了上述问题。

这个错误信息表明在查询数据库时出现了问题。具体来说,错误是由于无法获取数据库连接导致的。以下是一些可能的原因和解决方法: 1. **数据库连接配置错误**: - 检查你的数据库连接配置是否正确,包括URL、用户名和密码。 - 确认数据库服务器是否正在运行,并且能够接受连接。 2. **数据库驱动问题**: - 确认你已经正确添加了数据库驱动到你的项目中。 - 确认驱动版本与数据库版本兼容。 3. **数据库连接池配置问题**: - 如果你使用的是连接池(如HikariCP、Druid等),检查连接池的配置,确保有足够的连接可用。 - 检查连接池的最大连接数和最小连接数设置是否合理。 4. **网络问题**: - 确认你的应用程序能够通过网络访问数据库服务器。 - 检查防火墙设置,确保没有阻止数据库连接的端口。 5. **数据库用户权限**: - 确认数据库用户有足够的权限进行查询操作。 以下是一个简单的示例,检查数据库连接配置: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnectionTest { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/your_database"; String user = "your_username"; String password = "your_password"; try { Connection connection = DriverManager.getConnection(url, user, password); System.out.println("Connection successful!"); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 如果这个测试程序能够成功连接数据库,那么问题可能出在应用程序的其他部分。如果不能成功连接,请根据错误信息进一步排查问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzwy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值