bird v0.3.3
问题现象
针对calico bgp peer+ipip模式,单个节点重启,等待4分钟以上,pod跨节点流量才通。
问题分析
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。
nest/proto.c
proto_notify_state函数
bgp状态变化时,回调proto_notify_state,更新状态并输出日志,例如bgp_conn_enter_established_state函数。
异常情况下,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进程正常;环境增加监控,确保正常。
标签:proto,重启,calico,bgp,bird,graceful,节点,restart From: https://www.cnblogs.com/WJQ2017/p/18448726