核心答案
多团队共享集群时,靠转发规则(NetworkPolicy、路由表、安全组等)隔离彼此流量,是目前性价比最高、维护成本最低的隔离方案,不需要拆集群,也不需要重建网络。转发规则的本质是”在数据通路上设卡”,让不该通的流量在源头就被拦下,而不是把每个团队都关进单独的集群里,共享集群省资源,转发规则保安全,这两件事可以兼得。
为什么共享集群容易”串味”
共享集群的价值在于把空闲的计算资源摊薄,Kubernetes里几十个团队挤在同一个集群是很常见的事,但问题往往不是CPU不够、内存不足,而是网络层面先出乱子。
流量干扰比资源争抢更隐蔽
资源争抢还能靠LimitRange和ResourceQuota管住,流量干扰却经常让人毫无防备:
- 某团队的压力测试把入口带宽占满,其他团队的接口响应时间直接翻倍
- 一个团队升级中间件时广播包激增,波及同节点上的其他业务
- 测试环境误连了生产命名空间的数据库,整个数据链路被拖垮
这类问题的麻烦之处在于,它不体现在监控面板的CPU曲线上,而是表现为”玄学卡顿”,排查到最后,通常发现是网络拓扑太开放,任何Pod都能访问任何服务。
默认网络策略比你想的开阔得多
行业共识认为,绝大多数Kubernetes集群在默认状态下不设防,没有NetworkPolicy时,Namespace只是逻辑分区,不承担隔离职责,这相当于合租房里每个房间都没有门锁,邻居之间可以自由串门。
所以转发规则隔离要做的事,就是把这扇门装上,并且规定谁能进来、谁能出去。
多团队共享集群隔离方案对比
先把主流的隔离思路摆在一起看,再决定你的网络策略该落在哪一层。
| 隔离方案 | 实现方式 | 隔离粒度 | 运维成本 | 适用场景 |
|---|---|---|---|---|
| 独立集群 | 物理或云上拆成多个集群 | 最强,硬隔离 | 较高,多套控制面要管 | 合规严格、故障域必须分离的业务 |
| Namespace + RBAC | 逻辑分区加权限控制 | 弱,仅权限隔离 | 低 | 团队间相互信任,仅做资源划分 |
| NetworkPolicy转发规则 | 基于标签和IP段的五元组规则 | 强,网络层拦截 | 中低,规则统一管理 | 绝大多数共享集群场景 |
| 服务网格Sidecar | Istio、Linkerd等注入代理,按策略转发 | 最强,L7层可控 | 较高,Sidecar资源占用 | 需要灰度、限流、全链路观测的业务 |
从表格能看出,转发规则处于”隔离能力与运维成本的甜蜜点”
,独立集群虽稳,但对中小团队来说,多套集群的监控、升级、权限管理会挤占业务研发时间,费用也不止翻倍。
NetworkPolicy不是万能的
要澄清一个认知误区:NetworkPolicy只管Pod与Pod之间的东西向流量,管不了入口网关到Pod的流量,也管不了Pod访问外部服务的出站流量,后者要靠Ingress规则、Egress网关、DNS策略来配合。
所以一个完整的共享集群隔离方案,通常不是单一规则,而是三层转发规则的叠加:集群入口(Ingress)→服务间访问(NetworkPolicy)→出站访问(Egress)。
集群流量隔离怎么做
很多团队问的是同一个问题:”集群流量隔离怎么做才能不吃性能、不怕踩坑?” 下面这份步骤清单,来自多个生产环境的实操经验,可以直接照搬。
第一步:给所有Namespace打上团队标签
隔离的前提是”能被识别”,建议运维团队先定一套命名规范,
- team=platform,基础设施团队
- team=payment,支付团队
- team=data,数据团队
然后逐个检查现有Namespace,缺失标签的立即补上,这是转发规则的匹配依据,没有标签,规则就是空的。
第二步:从拒绝所有流量开始,逐步放行
新手容易犯的错是一上来就写”允许某某团队互访”,结果把一堆遗留连接也放过了,正确的做法是:
先写一条默认拒绝规则,再按业务关系逐条放行。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: payment-prod
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
这条规则会让该Namespace内的Pod默认拒绝所有入站和出站流量,然后针对真实调用关系补充白名单规则,例如允许platform-team的Prometheus抓取指标:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring
namespace: payment-prod
spec:
podSelector:
matchLabels:
app: payment-api
policyTypes:
- Ingress
policyTypes:
ingress:
- from:
- namespaceSelector:
matchLabels:
team: platform
podSelector:
matchLabels:
app: prometheus
ports:
- port: 9090
注意:这段配置是示意,实际生效前要在测试环境验证字段拼写,每条规则伴随一位业务方责任人,不能只靠运维兜底。
第三步:CNI插件的选择决定了规则上限
转发规则的执行者是CNI插件,不是Kubernetes本身,绝大多数云厂商的托管集群自带的CNI(如简米云Terway、华为云云原生网络)都支持NetworkPolicy。
自建的Kubernetes集群在选型时,建议考虑以下支持情况:
- Calico:规则能力最成熟,支持IP段、端口、协议的五元组过滤,还有丰富的审计日志
- Cilium:基于eBPF实现,转发性能更好,支持L7协议识别,适合对时延敏感的业务
- Flannel:默认不支持NetworkPolicy,需要额外叠加组件,不建议用于隔离场景
对于新建集群,如果团队有运维余力,推荐Cilium;如果希望规则调试方便、社区资料多,Calico是稳妥选择。
第四步:服务网格带来的L7级隔离能力
当转发规则下沉到服务网格层,你能获得更细的控制维度不再是”IP+端口”,而是HTTP方法、请求路径、请求头:
- 让payment团队只能调用订单服务的:/api/order/,不能访问其他路径
- 对data团队的大查询请求,限制为每秒10次,防止拖垮后端存储
- 对非业务团队的出站流量,强制路由到专用Egress网关,减少公网暴露面
服务网格方案的代价是每个Pod会多一个Sidecar容器,内存开销一般占业务容器的5%~10%之间,通常可以接受,但如果集群里大量跑的是批处理任务,且内存极度紧张,L4层转发规则(即NetworkPolicy)更务实。
共享集群隔离方案对比的几条实战结论
把上面两种方案放在一个团队的真实场景里做过对比,总结如下:
团队规模在50人以下时,NetworkPolicy够用
大多数情况下,小团队的调用关系不超过几十条,维护一套NetworkPolicy清单并不吃力,而且规则看得见摸得着,团队成员学习成本低。
超过百人规模的研发团队,可以考虑服务网格
人一多,微服务数量膨胀,L4规则会变得极难维护上百条规则之间还可能有交集和冲突,服务网格的控制面统一管理策略,审批流程更清晰,审计更安全。
多集群隔离费用和人力成本对比
这里回应很多人关心的”多集群隔离费用”,独立集群看似管理简单,实际上每增加一套集群,就意味着:
- 额外的控制面费用,通常在数百元到上千元每月不等(取决于云厂商规格)
- 至少0.5人天的日常巡检、升级负担
- 多个集群间的CI/CD流水线要同步适配
共享集群加转发规则,省下的是这部分预算,多付出的是规则维护的脑力。对绝大多数团队,前者远大于后者。
网络策略性能损耗不用过于担心
业内专家指出,数据面的规则匹配几乎不产生额外开销,只有首次建立连接时会做规则查找,后续的连接跟踪复用已有状态,更多时候,网络瓶颈来自节点的带宽上限,而非规则本身。
不翻车的细节打磨
转发规则落地之后,还有几个细节能在关键时刻帮你少熬夜。
定期评审规则,清理僵尸条目
业务升级、应用下线后,NetworkPolicy中常会残留不再使用的IP段、端口和标签,建议每两个月由运维和业务负责人共同做一次规则评审:
- 用工具扫描规则,找出长期无流量命中的条目
- 清理规则前,观察至少一周的流量日志,防止误删
- 将评审结果记录在版本控制中,方便回滚
监控规则命中率,而不只监控流量大小
规则命中率指标能直接反映隔离策略是否在被正常执行,如果发现某条规则长期命中率为0,要么业务已下线,要么匹配标签写错导致流量没有走这条规则,后者更危险它会让你错误地认为”已经隔离了”,实际上对方一直在裸奔。
排查跨团队流量要用的命令
当出现疑似跨团队的流量异常时,常用的排查顺序如下:
# 查看目标Pod关联的NetworkPolicy kubectl describe networkpolicy -n <namespace> # 查看Pod的标签是否与规则匹配(四步) kubectl get pod --show-labels -n <namespace> kubectl get networkpolicy -n <namespace> -o yaml # 用临时Pod测试连通性 kubectl run test-pod --image=busybox -it --rm --restart=Never -n default nc -zv <目标IP> <目标端口>
测试命令跑通后发现不通的情况时,先检查端口是否写错,再确认源Pod的命名空间标签,最后看安全组和防火墙,层级越深,问题越容易被忽略。
Q&A:共享集群被干扰怎么排查
Q:共享集群里网络被其他团队占满,但找不到肇事者,怎么排查?
A: 首先缩小范围登录到CNI插件的监控面板,查看各节点的带宽趋势,定位异常时间段内流量骤增的节点与Pod,其次查看该Pod的标签归属哪个团队,再结合其网络策略排查,确认是否存在未做限制的出站访问,如果现场已无法复现,开启CNI的流量日志,记录Pod级进出流量一段时间,通过Top N排行快速定位,多数情况下,问题出在某个测试环境Pod对外发起了大规模请求,且没有配置Egress规则。
Q:共享集群隔离方案对比的结果,是否意味着不必再考虑独立集群?
A: 不完全是,转发规则解决的是”流量干扰”,无法解决”故障爆炸半径”问题,如果某个团队的业务在极端情况下可能拖垮节点、耗尽DNS连接、打爆Conntrack表,则这类业务还是需要单独集群来兜底,共享集群内部靠转发规则隔离流量,但关键业务的物理隔离依赖仍要保留。
Q:给已有集群补转发规则,会不会导致现网服务大面积中断?
A: 直接给生产集群一次性应用全量规则,出现中断的概率确实存在,稳妥的做法是先在其旁路环境验证,规则在测试环境运行一周后再逐步应用到生产,且每次只变更一个Namespace,操作时先将默认策略设为Allow(不写拒绝规则),仅仅观察各类异常访问,观察期结束后再切成Deny策略,这样整个过程无需任何业务重启,切换对业务是无感的。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/633676.html





