
Kubernetes网络策略是保障集群安全的关键组件,通过精细控制Pod间的通信流量,可以有效实现零信任网络架构。本文将介绍10个实用的网络策略案例,覆盖多租户隔离、监控采集、数据库白名单、出口限流等常见场景。
场景:多租户集群中,强制不同团队命名空间完全隔离。
策略:拒绝所有出入站流量。
# 01-namespace-deny-all.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-cross-namespace
namespace: team-a
spec:
podSelector: {}
policyTypes: [Ingress, Egress]场景:Prometheus 位于 monitoring 命名空间,需要抓取业务Pod 指标。
策略:对目标命名空间放行来自 monitoring 命名空间的所有入站流量。
# 02-allow-monitoring.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring
namespace: default
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
policyTypes: [Ingress]场景:前端 Web服务只需暴露 80/443。
策略:按Pod标签 app=web 匹配,仅放行 TCP 80/443。
# 03-web-ports-only.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: web-ports-only
namespace: default
spec:
podSelector:
matchLabels:
app: web
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
policyTypes: [Ingress]场景:仅后端组件能访问 PostgreSQL。
策略:Pod 标签 app=database 仅接受来自 app=backend 且端口 5432 的流量。
# 04-db-access.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access
namespace: default
spec:
podSelector:
matchLabels:
app: database
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 5432
policyTypes: [Ingress]场景:安全合规要求限制 Pod 只能访问指定外部 DNS。
策略:匹配 app=restricted 的 Pod,仅允许访问 8.8.8.8:53。
# 05-egress-dns-only.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-dns-only
namespace: default
spec:
podSelector:
matchLabels:
app: restricted
egress:
- to:
- ipBlock:
cidr: 8.8.8.8/32
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
policyTypes: [Egress]场景:Admin 界面只允许公司内网 IP 访问。
策略:匹配 app=admin 的 Pod,放行 CIDR 192.168.1.0/24。
# 06-allow-office-cidr.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-office-ip
namespace: default
spec:
podSelector:
matchLabels:
app: admin
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
policyTypes: [Ingress]场景:敏感服务需同时满足「来源命名空间=prod」且「Pod 角色=auditor」。
策略:使用两个 Selector 组合,逻辑为“与”。
# 07-multi-condition.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: multi-condition
namespace: default
spec:
podSelector:
matchLabels:
app: sensitive
ingress:
- from:
- namespaceSelector:
matchLabels:
env: prod
podSelector:
matchLabels:
role: auditor
policyTypes: [Ingress]场景:高安全基线,先全部拒绝出站,再按需开洞。
策略:匹配所有 Pod,仅启用 Egress 类型,无规则即拒绝。
# 08-deny-all-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: default
spec:
podSelector: {}
policyTypes: [Egress]场景:微服务 A 的多个实例需自由通信,但拒绝其他组。
策略:通过相同标签 group=microservice-a 实现组内全互通。
# 09-allow-same-group.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-group
namespace: default
spec:
podSelector:
matchLabels:
group: microservice-a
ingress:
- from:
- podSelector:
matchLabels:
group: microservice-a
policyTypes: [Ingress]场景:作为“默认关闭”安全基线,后续逐步放行。
策略:匹配全部 Pod,同时启用 Ingress + Egress,无规则即全部拒绝。
# 10-default-deny-all.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {}
policyTypes: [Ingress, Egress]这些网络策略案例覆盖了Kubernetes网络安全的常见场景,从基本的命名空间隔离到精细的端口控制。实际应用中,建议采用“默认拒绝”的安全模型,然后逐步添加必要的允许规则。同时,网络策略应与RBAC等其他安全机制配合使用,构建全面的安全防护体系。
1、先 apply 10-default-deny-all.yaml,再按需叠加放行规则,确保“默认拒绝”。
2、规则叠加顺序无关,NetworkPolicy 是或关系;不同文件间注意命名冲突。
3、出口策略需确认集群 DNS、Service Mesh、Ingress Controller 是否受影响,必要时单独放行。
4、与 RBAC、PodSecurityPolicy/OPA、ServiceAccount 配合,形成多层次安全体系。
5、生产环境建议启用 NetworkPolicy 日志审计(如 Calico Policy Reporter、Cilium Hubble)以便排障。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!