technology

K8s 新增节点后 Calico 完整执行流程

·9 分钟阅读·3214 字
📋 目录

K8s 新增节点后 Calico 完整执行流程

核心概念 Calico 以 DaemonSet 部署,新节点加入后自动调度 calico-node Pod,分 4 大阶段完成网络初始化与集群同步。

Calico以DaemonSet部署,新节点加入集群、kubelet就绪后,会自动调度calico-node Pod到该节点,全程分4大阶段完成网络初始化与集群同步。

1. 前置触发条件

  1. 新节点执行kubeadm join加入K8s集群,节点状态先为NotReady(无网络插件);
  2. kubelet上报节点资源,apiserver匹配calico-node DaemonSet节点选择器,调度Pod至新节点;
  3. 拉取calico-node镜像,依次执行3个Init初始化容器,全部成功后启动主calico-node容器。

2. 阶段1:3个Init初始化容器(按顺序串行执行,失败则Pod重启)

2.1. init容器1:install-cni(安装CNI二进制与配置)

  1. calicocalico-ipam二进制拷贝到宿主机/opt/cni/bin
  2. 生成/etc/cni/net.d/10-calico.conflist标准CNI配置文件;
  3. kubelet创建Pod时会调用该CNI插件,负责Pod网卡、IP分配、veth设备创建;
  4. 若无此步骤,新节点Pod创建会报网络插件缺失,一直ContainerCreating

2.2. init容器2:upgrade-ipam(IP地址管理兼容与节点CIDR分配)

  1. 执行calico-ipam -upgrade,兼容旧host-local IPAM存量IP;
  2. 连接Calico存储(etcd/K8s CRD),从全局IPPool切分一段独立Pod CIDR网段分配给当前新节点(如10.244.5.0/24);
  3. 将节点CIDR、宿主机物理IP、隧道IP(IPIP/VXLAN模式)写入Calico节点资源对象,存入集群存储;
  4. 标记该网段归属当前节点,后续本节点所有Pod从该CIDR分配IP,不会与其他节点冲突。

2.3. init容器3:flexvol-driver(可选,存储网络策略挂载驱动)

部署FlexVolume驱动,用于Calico网络策略日志、流量统计持久化,云环境常用。

3. 阶段2:主容器calico-node启动,内部三大常驻进程分工

Init容器全部退出后,启动主容器,内置Felix、BIRD、confd三个核心进程,完成节点网络底座搭建:

3.1. Felix(节点本地网络管控核心)

  1. 监听K8s apiserver:同步Node、Pod、NetworkPolicy、EndpointSlice资源;
  2. 宿主机内核操作:
  • 创建cali-* veth虚拟网卡,每个Pod对应一对veth;
  • 维护主机内核静态路由、iptables/eBPF规则;
  • 下发NetworkPolicy访问控制规则(Pod入/出站黑白名单);
  1. IPAM管控:Pod创建/销毁时动态分配、回收Pod IP;
  2. 上报本节点Pod CIDR、宿主机IP、隧道地址到集群存储。

3.2. BIRD(BGP路由分发进程,Overlay/BGP模式共用)

  1. BGP Mesh自动建邻:扫描集群所有节点Calico信息,与其余所有节点BIRD建立BGP对等体连接;
  2. 对外广播路由:把当前节点分配的Pod CIDR网段发布给集群全部节点;
  3. 接收全网路由:接收其他节点广播的Pod网段,写入本机内核路由表;
  4. 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. 路由全网同步(三层互通核心)

  1. 新节点BIRD向集群所有旧节点发送BGP路由:告知“我持有XX/24 Pod网段”;
  2. 所有旧节点BIRD接收路由,在本机内核新增路由条目:去往新节点Pod网段,下一跳为新节点宿主机IP;
  3. 新节点BIRD接收所有旧节点的BGP路由,本机内核生成所有远端Pod网段路由;
  4. 完成后:新节点Pod ↔ 所有旧节点Pod三层互通

4.3. NetworkPolicy全量同步

Felix拉取集群所有NetworkPolicy,转换为内核iptables/eBPF规则,限制Pod之间、Pod与外部的访问权限,策略全网统一生效。

4.4. 集群状态上报,节点变为Ready

  1. Felix更新Node资源的NetworkUnavailable状态为False;
  2. kubelet检测网络就绪,节点状态从NotReady变为Ready
  3. 调度器可正常往该节点调度业务Pod。

5. 阶段4:集群其他节点同步更新(配套联动动作)

新节点Calico上线后,原有集群节点自动触发变更

  1. 所有旧节点BIRD与新节点建立BGP邻居,同步新节点Pod网段路由;
  2. 所有节点内核路由表自动新增指向新节点Pod CIDR的路由;
  3. calico-kube-controllers(集群控制器)同步更新Calico Node CRD,维护集群节点清单;
  4. 若使用Typha组件,所有节点同步更新Typha连接列表,分摊apiserver watch压力。

6. 两种Calico模式差异化行为(BGP裸三层 / IPIP/VXLAN Overlay)

  1. BGP直连模式(物理网络三层可达)
    无隧道网卡tunl0,纯物理路由转发,BIRD直接通过宿主机物理网卡广播Pod网段,无数据包封装损耗。
  2. IPIP/VXLAN Overlay模式(云厂商二层隔离环境)
    Felix自动创建tunl0隧道网卡,跨节点Pod流量封装在宿主机IP包内传输;BGP依旧广播网段,路由下一跳为对端宿主机IP,流量走隧道解封装。

7. eBPF模式额外新增动作(Calico eBPF)

若集群开启Calico eBPF替代kube-proxy,新增节点calico-node还会:

  1. 加载eBPF字节码到内核tc/cgroup钩子;
  2. 在内核维护Service ClusterIP、NodePort四层负载均衡转发规则;
  3. 完全接管原kube-proxy的Service代理能力,无需部署kube-proxy;
  4. eBPF Map同步集群Endpoint后端列表,毫秒级更新转发规则。

8. 新增Calico完整行为总结(面试精简版)

  1. DaemonSet自动调度calico-node Pod至新节点;
  2. 3个Init容器安装CNI插件、分配独立Pod CIDR网段;
  3. 主容器Felix管理本地网卡、IP分配、网络策略;BIRD建立全网BGP邻居,广播/同步Pod网段路由;
  4. 拉取全集群网络配置,本机生成完整跨节点路由;
  5. 同步完成后节点状态变为Ready,新老节点Pod三层互通;
  6. 集群其余节点自动新增新节点Pod网段路由,全网网络拓扑同步更新;
  7. eBPF环境额外在内核下发Service负载均衡eBPF程序,替代kube-proxy。