选对网络插件:kubeasz 集群跨节点通信提速避坑指南
【免费下载链接】kubeasz使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz
业务上线第三天,两个跨节点 Pod 互调的延迟高到被用户投诉。查了半天,发现是网络插件走了隧道封装模式,每个包都多包一层"信封",性能白白打折。
如果你也用 kubeasz 这类 Ansible 工具搭 K8s 集群,网络插件这步别无脑抄默认值。下面按场景给你一套选型思路和落地调法,先看结论。
30 秒速查表:什么场景配什么插件 🧭
先补一个名词:CNI(容器网络接口),就是给每个 Pod 分配 IP、把它们连成一张网的那套标准,flannel、calico 这些都是它的不同实现。
kubeasz 开箱支持 5 种,按场景对号入座:
| 你的场景 | 首选 | 一句话理由 |
|---|---|---|
| 学习、测试,几台机器 | flannel | 最省事,装完就用 |
| 生产集群,节点可能涨到几十上百 | calico | 项目默认,BGP 可扩展,还能加路由反射器 |
| 延迟敏感 + 想要流量可观测 | cilium | eBPF 内核级转发,快,自带 Hubble 面板 |
| 要子网、VLAN、QoS 精细隔离 | kube-ovn | 基于 OVS(开源虚拟交换机),功能最细 |
| 网络 + Service 代理 + 策略想三合一 | kube-router | 少装组件,IPVS 做 Service 转发 |
场景一:轻量起步,测试学习环境 🌱
flannel 是几个选项里最轻的,没有网络策略功能,胜在简单。
kubeasz 默认给它配 vxlan 后端——相当于把包套进 UDP 信封再发,跨网段也能通,但多一层封装就多一层开销。
如果所有节点都在同一个二层网络,把config.yml里FLANNEL_BACKEND改成"host-gw":节点间直接走三层路由,不封装,这是 flannel 下最快也最省心的组合。
场景二:生产级规模化,节点还会涨 📈
calico 是 kubeasz 的默认插件,生产环境的主力。
它靠 BGP 协议干活:一种路由协议,节点之间互相"登记"对方的 Pod 网段,之后跨节点流量直接沿路由走,不用打隧道。
麻烦在于节点多了之后,全互联的 BGP 连接数量会爆炸。calico 给了个解法——BGP 路由反射器(RR),加几个"中间人"节点,其他节点只跟中间人建连,连接数从 n 的平方级降到 n 级。
先落两个配置项:
- 节点超过 50 台,把
CALICO_RR_ENABLED置为true,默认放在 master 上 - 关键开关
CALICO_ENABLE_OVERLAY:自有机房平铺网络设Never,纯直连最省;跨子网设CrossSubnet,隧道 + 路由混合;公有云上懒得动云厂商网络配置就Always,损失一点性能换省事
场景三:极致低延迟,顺带把流量看明白 ⚡
cilium 走的是另一条路。它不依赖传统 iptables 规则链,而是用 eBPF——内核自带的可编程机制,把处理包的小程序"挂"在内核里,省掉用户态来回倒手,延迟更低、吞吐更高。
kubeasz 已经把 cilium 和 Hubble CLI 集成好,config.yml里两个开关:
cilium_hubble_enabled: true:流量日志,相当于"谁在跟谁说话"的流水账cilium_hubble_ui_enabled: true:给上面的流水账配一个可视化面板
如果你更想要"网络插件 + Service 代理 + 网络策略"三合一的轻组合,可以看 kube-router:它用 IPVS(内核级虚拟负载均衡器,比 iptables 规则集更快)做 Service 转发,OVERLAY_TYPE和FIREWALL_ENABLE是它的主要开关。
在 kubeasz 里落地:改两处、跑一条命令 🛠️
第一步,在 hosts 文件([all:vars] 段,可参考 example/hosts.multi-node)指定插件:
CLUSTER_NETWORK="calico"可选值:calico、flannel、kube-router、cilium、kube-ovn。
第二步,在config.yml里微调(只动你选的那个插件的段落),以 calico 直连模式为例:
CALICO_ENABLE_OVERLAY: "Never" CALICO_RR_ENABLED: true第三步,执行网络插件部署剧本,顺便看一眼 Pod 起没起来:
ansible-playbook -i hosts playbooks/06.network.yml kubectl get pod -n kube-system | grep -E 'calico|flannel|cilium'部署后验证清单与常见坑 ✅
验证就四步,全过才算通:
- kube-system 下网络插件 Pod 全部 Running
- 起 3 个测试 Pod 分散在不同节点,互相 ping 通
- calico 环境下
calicoctl node status,所有邻居都是 Established - 可选:
config.yml里打开network_check_enabled: true,它会定期自动巡检节点间连通性
再记三个高频坑:
- 主机名重复:calico 用主机名认节点,两台同名节点在 etcd 里只留一条记录,BGP 邻居直接建不起来。装之前先确认主机名唯一且全小写。
- 网段撞车:hosts 文件里的
CLUSTER_CIDR(Pod 网段)和SERVICE_CIDR不能跟节点自身网段重叠,撞了会出现"时通时不通"的怪现象。 - 云厂商 VPC 不通 IPIP:部分公有云/私有云不放行 IPinIP 封包,这种情况把 calico 的 overlay 设为
Always,或把后端切到vxlan再试。
插件选型不求全,场景定生死。把开头那张速查表抄进你的部署笔记,剩下的交给剧本去跑就行。
想深入细节,看仓库自带文档:网络组件安装总览、Calico 安装讲解。
【免费下载链接】kubeasz使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考