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进程正常;环境增加监控,确保正常。