网络策略是什么
网络策略是以对象为粒度的防火墙规则:先选定一组对象,再声明允许哪些来源、访问哪些端口。它的语义是允许清单——一旦某个对象被策略选中,未明确放行的流量就被拒绝。这一点与习惯上的「加一条拒绝规则」相反,理解错了会把服务整体切断。
生效前提是网络插件支持
策略对象由网络插件负责实现,插件不支持时对象能创建成功但完全不生效,也不会报错。因此上线网络策略前必须确认插件能力,否则会得到「以为已经隔离了、实际上仍然互通」的错觉。这也是排查时需要先回答的第一个问题。
基本信息
| 作用层级 | 网络层与传输层,基于地址、端口与协议 |
|---|---|
| 生效前提 | 集群网络插件支持策略执行 |
| 作用对象 | 由选择器选中的对象,默认在所属命名空间内 |
| 规则语义 | 允许清单,未放行即拒绝 |
| 方向 | 可分入站与出站两个方向 |
| 叠加行为 | 多个策略之间是并集关系,任一允许即通过 |
典型使用场景
- 数据库隔离:只允许应用层访问数据库端口,其他来源一律拒绝
- 默认拒绝:为新命名空间铺一条基线,只放行必要流量
- 东西向收敛:限制服务之间不必要的互相访问,缩小横向移动面
- 合规要求:按审计要求证明关键组件之间的访问是受控的
- 排障隔离:临时限制某个服务的入站来源,判断问题是否来自外部调用
- 多租户隔离:不同团队的对象之间默认互不可达
允许同命名空间内指定标签访问
允许同命名空间内指定标签访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-web
namespace: prod
spec:
podSelector: # 策略作用在哪些对象上
matchLabels:
app: db
policyTypes: ["Ingress"] # 声明管入站方向
ingress:
- from:
- podSelector: # 允许哪些来源
matchLabels:
app: web
ports:
- protocol: TCP
port: 5432验证与排查
验证与排查
kubectl get networkpolicy -A # 看已生效的策略范围
kubectl describe networkpolicy db-allow-web -n prod # 查看规则语义
kubectl exec -it test-pod -- nc -zv db.prod 5432 # 在容器内验证端口连通
kubectl exec -it test-pod -- nslookup kubernetes.default # 确认解析未被策略影响关键点读法
| 配置 | 含义 | 常见误解 |
|---|---|---|
| podSelector | 策略作用的对象范围 | 空选择器表示命名空间内全部对象 |
| policyTypes | 管理的方向 | 只写入站时入站不受影响 |
| from 来源 | 允许哪些来源访问 | 同命名空间内用标签指定来源 |
| ports | 允许访问的端口 | 不写端口表示允许全部端口 |
策略一旦选中某个对象,未被放行的入站流量都会被拒绝,包括健康检查与监控采集,上线前要把这些来源一并加入允许清单。
解析流量同样需要放行,默认拒绝入站的命名空间里,未放行解析来源会导致服务名解析超时。