K8s 新增节点后 Calico 完整执行流程
核心概念 Calico 以 DaemonSet 部署,新节点加入后自动调度 calico-node Pod,分 4 大阶段完成网络初始化与集群同步。
Calico以DaemonSet部署,新节点加入集群、kubelet就绪后,会自动调度calico-node Pod到该节点,全程分4大阶段完成网络初始化与集群同步。
1. 前置触发条件
- 新节点执行
kubeadm join加入K8s集群,节点状态先为NotReady(无网络插件); - kubelet上报节点资源,apiserver匹配
calico-nodeDaemonSet节点选择器,调度Pod至新节点; - 拉取calico-node镜像,依次执行3个Init初始化容器,全部成功后启动主calico-node容器。
2. 阶段1:3个Init初始化容器(按顺序串行执行,失败则Pod重启)
2.1. init容器1:install-cni(安装CNI二进制与配置)
- 将
calico、calico-ipam二进制拷贝到宿主机/opt/cni/bin; - 生成
/etc/cni/net.d/10-calico.conflist标准CNI配置文件; - kubelet创建Pod时会调用该CNI插件,负责Pod网卡、IP分配、veth设备创建;
- 若无此步骤,新节点Pod创建会报网络插件缺失,一直
ContainerCreating。
2.2. init容器2:upgrade-ipam(IP地址管理兼容与节点CIDR分配)
- 执行
calico-ipam -upgrade,兼容旧host-local IPAM存量IP; - 连接Calico存储(etcd/K8s CRD),从全局
IPPool中切分一段独立Pod CIDR网段分配给当前新节点(如10.244.5.0/24); - 将节点CIDR、宿主机物理IP、隧道IP(IPIP/VXLAN模式)写入Calico节点资源对象,存入集群存储;
- 标记该网段归属当前节点,后续本节点所有Pod从该CIDR分配IP,不会与其他节点冲突。
2.3. init容器3:flexvol-driver(可选,存储网络策略挂载驱动)
部署FlexVolume驱动,用于Calico网络策略日志、流量统计持久化,云环境常用。
3. 阶段2:主容器calico-node启动,内部三大常驻进程分工
Init容器全部退出后,启动主容器,内置Felix、BIRD、confd三个核心进程,完成节点网络底座搭建:
3.1. Felix(节点本地网络管控核心)
- 监听K8s apiserver:同步Node、Pod、NetworkPolicy、EndpointSlice资源;
- 宿主机内核操作:
- 创建
cali-*veth虚拟网卡,每个Pod对应一对veth; - 维护主机内核静态路由、iptables/eBPF规则;
- 下发NetworkPolicy访问控制规则(Pod入/出站黑白名单);
- IPAM管控:Pod创建/销毁时动态分配、回收Pod IP;
- 上报本节点
Pod CIDR、宿主机IP、隧道地址到集群存储。
3.2. BIRD(BGP路由分发进程,Overlay/BGP模式共用)
- BGP Mesh自动建邻:扫描集群所有节点Calico信息,与其余所有节点BIRD建立BGP对等体连接;
- 对外广播路由:把当前节点分配的Pod CIDR网段发布给集群全部节点;
- 接收全网路由:接收其他节点广播的Pod网段,写入本机内核路由表;
- IPIP/VXLAN模式:自动管理
tunl0隧道网卡,封装跨节点Pod流量。
3.3. confd(配置同步工具)
持续监听集群etcd/Calico CRD的网络配置变更,动态生成BIRD配置文件,实时刷新BGP路由规则,无需重启进程。
4. 阶段3:跨集群全网同步(新节点接入集群网络体系)
4.1. 集群存储数据同步(控制面,无业务流量)
Felix持续Watch集群存储(etcd或K8s CRD),拉取全量集群信息:
- 所有节点的Pod网段、宿主机IP;
- 全部NetworkPolicy、全局网络策略、IPPool配置;
- 所有Pod Endpoint、Service后端信息;
同步完成后,本节点拥有完整集群网络拓扑视图。
4.2. 路由全网同步(三层互通核心)
- 新节点BIRD向集群所有旧节点发送BGP路由:告知“我持有XX/24 Pod网段”;
- 所有旧节点BIRD接收路由,在本机内核新增路由条目:去往新节点Pod网段,下一跳为新节点宿主机IP;
- 新节点BIRD接收所有旧节点的BGP路由,本机内核生成所有远端Pod网段路由;
- 完成后:新节点Pod ↔ 所有旧节点Pod三层互通。
4.3. NetworkPolicy全量同步
Felix拉取集群所有NetworkPolicy,转换为内核iptables/eBPF规则,限制Pod之间、Pod与外部的访问权限,策略全网统一生效。
4.4. 集群状态上报,节点变为Ready
- Felix更新Node资源的
NetworkUnavailable状态为False; - kubelet检测网络就绪,节点状态从
NotReady变为Ready; - 调度器可正常往该节点调度业务Pod。
5. 阶段4:集群其他节点同步更新(配套联动动作)
新节点Calico上线后,原有集群节点自动触发变更:
- 所有旧节点BIRD与新节点建立BGP邻居,同步新节点Pod网段路由;
- 所有节点内核路由表自动新增指向新节点Pod CIDR的路由;
- calico-kube-controllers(集群控制器)同步更新Calico Node CRD,维护集群节点清单;
- 若使用Typha组件,所有节点同步更新Typha连接列表,分摊apiserver watch压力。
6. 两种Calico模式差异化行为(BGP裸三层 / IPIP/VXLAN Overlay)
- BGP直连模式(物理网络三层可达)
无隧道网卡tunl0,纯物理路由转发,BIRD直接通过宿主机物理网卡广播Pod网段,无数据包封装损耗。 - IPIP/VXLAN Overlay模式(云厂商二层隔离环境)
Felix自动创建tunl0隧道网卡,跨节点Pod流量封装在宿主机IP包内传输;BGP依旧广播网段,路由下一跳为对端宿主机IP,流量走隧道解封装。
7. eBPF模式额外新增动作(Calico eBPF)
若集群开启Calico eBPF替代kube-proxy,新增节点calico-node还会:
- 加载eBPF字节码到内核tc/cgroup钩子;
- 在内核维护Service ClusterIP、NodePort四层负载均衡转发规则;
- 完全接管原kube-proxy的Service代理能力,无需部署kube-proxy;
- eBPF Map同步集群Endpoint后端列表,毫秒级更新转发规则。
8. 新增Calico完整行为总结(面试精简版)
- DaemonSet自动调度calico-node Pod至新节点;
- 3个Init容器安装CNI插件、分配独立Pod CIDR网段;
- 主容器Felix管理本地网卡、IP分配、网络策略;BIRD建立全网BGP邻居,广播/同步Pod网段路由;
- 拉取全集群网络配置,本机生成完整跨节点路由;
- 同步完成后节点状态变为Ready,新老节点Pod三层互通;
- 集群其余节点自动新增新节点Pod网段路由,全网网络拓扑同步更新;
- eBPF环境额外在内核下发Service负载均衡eBPF程序,替代kube-proxy。