本文目录导读:

Kubernetes 网络安全策略的配置本身不算特别复杂,但真正复杂的部分是理解其背后的网络模型和正确应用策略的逻辑,为了让你更直观地理解,我们可以从几个层面来分析:
简单层面:配置一个基础的“拒绝所有”策略
如果你只是想实现一个简单的功能:“我的 Pod 默认只允许被同命名空间的 Pod 访问,拒绝所有外部访问”,那么配置起来非常简单:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: your-namespace
spec:
podSelector: {} # 匹配该命名空间下的所有 Pod
policyTypes:
- Ingress
- Egress
这样一条策略,几行 YAML 就能完成,从这个角度看,它并不复杂。
复杂层面:实际生产环境的挑战
在实际生产环境中,Kubernetes 网络安全策略会变得复杂,主要体现在以下几个方面:
-
网络插件(CNI)依赖:
- 不是所有 CNI 都支持:NetworkPolicy 是一个 API 对象,但它需要底层的 CNI 插件(如 Calico、Cilium、Weave、Antrea 等)来真正执行,如果你用的是 Flannel(默认不支持)或一些简单的 CNI,NetworkPolicy 根本不会生效。
- 不同 CNI 的实现差异:Calico 的策略实现非常成熟,但配置复杂;Cilium 基于 eBPF 性能极佳,但学习曲线陡,你需要根据 CNI 的特性来调整策略写法。
-
策略的叠加与冲突:
- 规则逻辑:NetworkPolicy 的策略是 “加法” 和 “减法” 的混合,默认是“允许所有”(无策略时),只要有一条策略匹配了你的 Pod,就会变成“拒绝所有”,然后你只能显式地添加白名单。
- IP段、命名空间、标签的混合:你经常需要同时指定
podSelector(匹配 Pod)、namespaceSelector(匹配整个命名空间)、ipBlock(匹配某个 IP 段),它们之间的逻辑关系(AND 还是 OR)容易搞混。 - 多策略叠加:一个 Pod 可以同时被多个 NetworkPolicy 匹配,最终效果是所有策略规则的并集(合并结果),一旦某条策略写错,可能导致 Pod 网络不通。
-
调试困难:
- 缺乏直观反馈:策略写完后,网络不会立即报错,而是默默拒绝(丢包或拒绝连接),你只能从应用层面的超时错误去反推,排查过程比较痛苦。
- 日志不友好:默认情况下,Kubernetes 不会记录被 NetworkPolicy 拒绝的流量,你需要额外开启审计日志(如 Calico 的
Felix日志),但日志量巨大且解析复杂。
-
需要理解网络拓扑:
- 你需要清楚:哪些 Pod 需要访问数据库?哪些需要访问外部 API?哪些可以互相通信?这要求你对自己部署的应用架构有很清晰的认识。
- 跨命名空间访问:不同命名空间的服务如何精确控制?只允许
prod命名空间的 Pod 访问logging命名空间的 Elasticsearch,其他命名空间不行,这需要精确的namespaceSelector配合kube-system的 DNS 策略。
典型的复杂场景举例
问题:你想让一个前端 Pod(app: frontend)只能被来自 Internet 的 Ingress 控制器访问,并且它只能访问后端 Pod(app: backend)的 8080 端口,后端 Pod 只能访问数据库 Pod(app: database)的 3306 端口。
你需要写 3 条 高度关联的策略:
- frontend:
Ingress:只允许namespace: ingress-nginx和pod: ingress-controller的流量。Egress:只允许访问namespace: your-ns且pod: backend且port: 8080。 - backend:
Ingress:只允许pod: frontend的流量。Egress:只允许访问pod: database且port: 3306。 - database:
Ingress:只允许pod: backend的流量。Egress:无(禁止出站访问)。
这个过程中,你要频繁使用 port、protocol 等参数,并且要考虑跨命名空间的 namespaceSelector 和 podSelector 的匹配逻辑(是 AND 还是 OR?其实是 namespaceSelector 和 podSelector 之间是 AND,而同一个 from 数组里多条规则是 OR)。
回到你的问题:复杂吗?
- 入门使用:不复杂,写个“拒绝所有”或者“只允许命名空间内部访问”的策略,大概 10 分钟能搞定。
- 生产环境精细化管控:中等复杂,需要你对 CNI、网络模型、API 对象有较好理解,并且需要投入时间调试。
- 大规模多租户/零信任环境:很复杂,需要引入策略管理工具(如 Calico Enterprise、Cilium Network Policy)、自动化测试、审计合规工具,甚至需要将策略与 GitOps 流程结合。
给你的建议
- 先用简单的:先实现“默认拒绝所有”和“只允许同命名空间内部访问”,这是性价比最高的最佳实践。
- 选对 CNI:确保你的集群使用支持 NetworkPolicy 的 CNI(推荐 Calico 或 Cilium)。
- 从观察开始:先用工具(如
kubectl netpol插件或 Calico 的calicoctl)分析当前集群中 Pod 的实际允许策略,而不是盲目添加。 - 逐步精细化:先开放整个命名空间,再逐步缩小到特定 Pod 和端口。
- 使用工具辅助:考虑使用像
netpolicy.io、kubeshark或 Visual Network Policy Editor 等工具来可视化你的策略。
配置语法简单,但正确配置和长期维护的难度中等偏高,它更像是一把精细的锁——拧一把很容易,但要把它完美地安装到一扇门上并确保钥匙系统完美运行,还是需要花些心思的。