从安装到排错:一次搞懂Calico网络插件在K8s节点上的完整工作流程

张开发
2026/4/19 14:43:23 15 分钟阅读

分享文章

从安装到排错:一次搞懂Calico网络插件在K8s节点上的完整工作流程
从安装到排错一次搞懂Calico网络插件在K8s节点上的完整工作流程当你第一次在Kubernetes集群中部署Calico网络插件时可能会被它的复杂性吓到。为什么一个网络插件需要这么多组件calico-node这个DaemonSet Pod里到底发生了什么为什么有时候Pod网络突然就不通了这篇文章将带你深入Calico的内部工作机制从安装到运行时排错彻底掌握这个云原生网络方案的核心原理。1. Calico的核心架构与部署准备Calico的设计哲学是将网络功能拆解为多个独立的组件每个组件专注于单一职责。这种模块化设计带来了极高的灵活性但也增加了理解成本。我们先来看看Calico的核心组件构成数据平面负责实际的数据包转发包括calico-node中的Felix和BIRD组件控制平面calico-kube-controllers负责监控Kubernetes API并配置网络策略CNI插件calico和calico-ipam二进制文件被kubelet调用来配置Pod网络部署前需要确认的基础环境# 检查内核模块是否加载 lsmod | grep -E ip_tables|ip6_tables|nf_conntrack # 确认节点间网络互通 ping 其他节点IP # 验证kube-proxy模式 kubectl get configmap -n kube-system kube-proxy -o yaml | grep mode提示如果使用IPIP模式需要确保节点间允许IP协议号4的通信如果使用VXLAN则需要允许UDP 4789端口。2. Calico-node的启动生命周期详解calico-node作为DaemonSet在每个节点运行它的启动过程分为多个阶段每个initContainer都有特定使命2.1 初始化容器的工作流程upgrade-ipam负责从旧的host-local IPAM迁移到calico-ipamkubectl logs calico-node-pod -c upgrade-ipam典型日志输出No old IPAM data to migrate, skipping upgradeinstall-cni安装CNI插件和配置文件将calico和calico-ipam二进制文件复制到/opt/cni/bin生成CNI配置文件到/etc/cni/net.d/10-calico.conflistflexvol-driver为网络策略安装FlexVolume驱动2.2 主容器calico-node的启动过程主容器启动时会依次执行以下操作连接Kubernetes API或etcd取决于DATASTORE_TYPE配置配置本地网络接口和路由规则启动Felix进程负责ACL、路由等启动BIRD进程负责BGP路由分发检查组件状态# 查看Felix日志 kubectl logs calico-node-pod -c calico-node | grep Felix # 检查BIRD状态 kubectl exec calico-node-pod -c calico-node -- birdcl show protocols3. Calico的运行时网络处理流程当一个新的Pod被创建时Calico的工作流程如下3.1 Pod网络配置阶段kubelet调用CNI插件/opt/cni/bin/calicocalico插件从IPAM分配IP地址创建veth pair设备一端在Pod网络命名空间一端在主机配置路由规则和ARP表可以通过以下命令检查这些配置# 查看Pod的veth设备 ip link show | grep cali # 检查路由表 ip route show | grep cali # 查看ARP条目 ip neigh show | grep cali3.2 数据包转发路径数据包在Calico网络中的典型流转路径场景转发方式相关配置参数同节点Pod通信通过Linux bridge直接转发N/A跨节点Pod通信IPIP模式通过tunl0隧道封装CALICO_IPV4POOL_IPIPAlways跨节点Pod通信BGP模式直接路由CALICO_IPV4POOL_IPIPNever查看当前使用的转发模式kubectl get ippool -o yaml | grep ipipMode4. 常见故障排查实战指南当遇到网络问题时可以按照以下步骤系统性地排查4.1 Pod网络不通的排查流程检查基础组件状态# Calico核心Pod状态 kubectl get pods -n kube-system -l k8s-appcalico-node # 节点网络状态 calicoctl node status验证网络策略# 检查是否有网络策略阻止了流量 kubectl get networkpolicies --all-namespaces # 临时禁用所有网络策略进行测试 kubectl scale deploy -n kube-system calico-kube-controllers --replicas0检查路由和防火墙规则# 查看iptables规则 iptables-save | grep cali # 检查IPIP隧道状态 ip tunnel show tunl04.2 典型错误与解决方案问题1calico-node持续CrashLoopBackOff可能原因镜像拉取失败内核模块缺失权限问题解决方案# 查看具体错误原因 kubectl describe pod -n kube-system calico-node-pod # 常见修复命令 sudo modprobe ip_tables sudo sysctl -w net.ipv4.ip_forward1问题2Pod获取不到IP地址排查步骤检查IP池是否耗尽calicoctl get ippool -o wide验证IPAM状态kubectl exec -n kube-system calico-node-pod -c calico-node -- /bin/calico-node -ipam show问题3跨节点通信失败调试方法# 跟踪数据包路径 tcpdump -i eth0 -nn host 目标PodIP tcpdump -i tunl0 -nn host 目标PodIP # 检查BGP对等体状态 calicoctl get bgppeers5. 高级配置与性能调优当集群规模扩大后可能需要调整以下参数5.1 大规模集群优化启用Typha服务减少API服务器负载# 在calico-config ConfigMap中修改 typha_service_name: calico-typha调整BGP配置提升路由性能calicoctl create -f - EOF apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: logSeverityScreen: Info nodeToNodeMeshEnabled: true asNumber: 64512 EOF5.2 网络策略性能优化对于网络策略密集的场景# 在calico-node DaemonSet中添加环境变量 env: - name: FELIX_CHAININSERTMODE value: Append - name: FELIX_DEFAULTENDPOINTTOHOSTACTION value: ACCEPT监控Calico性能指标# 暴露Felix指标 kubectl port-forward -n kube-system calico-node-pod 9091:9091 # 然后访问 http://localhost:9091/metrics在实际生产环境中我们曾经遇到一个棘手的案例某节点上的Pod间歇性网络中断。通过分析calico-node日志发现是IPIP隧道MTU配置不当导致的分片问题调整veth_mtu参数后问题解决。这种深度排错经验往往比理论更有价值。

更多文章