calico节点重启4分钟后跨节点流量才通

bird v0.3.3

问题现象

针对calico bgp peer+ipip模式,单个节点重启,等待4分钟以上,pod跨节点流量才通。

问题分析

calico必须指定bgp模式,通过bird来获取pod ip所在主机ip,bgp建连后在节点上增加目的ip是pod小子网、下一跳是pod所在节点ip、网口是tunl0的路由,bgp要求3层可达。

k8s节点重启 -> bird进程加载bird配置文件,进入graceful restart流程和wait状态

每次尝试建立bgp peer连接时,graceful_restart_locks++。
nest/proto.c
proto_graceful_restart_lock函数

proto/bgp/bgp.c
bgp_start函数

成功建立连接时,graceful_restart_locks--。
发现变成0后,停止timer,触发graceful_restart_done。
nest/proto.c
proto_graceful_restart_unlock函数

proto/bgp/bgp.c
bgp_conn_enter_established_state函数

正常情况下,bird状态变更是,initializing -> starting -> start -> wait -> feed -> up,之后,增加其他节点子网路由到本机节点上,指向tunl0;异常情况下,bird无法与其他节点bird建立bgp连接,等待240s超时时间后增加路由。

nest/protocol.h
默认graceful_restart超时时间是240s,没有参数化配置。

conf/conf.c
config_alloc函数
初始化配置

nest/proto.c
graceful_restart_init函数
hook点是graceful_restart_done,超时时间是240s。

nest/proto.c
graceful_restart_done函数
输出graceful restart done日志,遍历所有bgp连接,输出状态变成up日志,graceful_restart_locks设成0。

解决问题

人为重启节点前,确保其他节点bird进程正常;环境增加监控,确保正常。

posted on 2024-10-05 23:30  王景迁  阅读(22)  评论(0编辑  收藏  举报

导航