Skip to main content

1. NetworkPolicy简介

Kubernetes集群中,NetworkPolicy(网络策略)是一种用于控制Pod之间及Pod与外部网络之间流量的资源对象。通过定义NetworkPolicy,可以实现细粒度的网络访问控制,提升集群的安全性,防止未经授权的流量访问敏感服务。

核心功能

  • 限制不同Pod之间的网络通信
  • 控制Pod与外部网络的流量
  • 支持基于命名空间、标签、IP等多维度的访问规则
  • 配合CNI插件实现网络隔离

注意:NetworkPolicy的生效依赖于底层网络插件(如CalicoCiliumWeave等)对其支持。

默认行为说明

如果没有手动创建任何NetworkPolicy资源,Kubernetes集群默认不会应用任何网络隔离策略

  • 所有Pod之间的网络通信都是允许的,无论是否属于同一命名空间。
  • 外部流量也可以访问Pod(只要有合适的Service或端口暴露),没有基于NetworkPolicy的限制。
  • 只有为某些Pod创建了NetworkPolicy后,这些被选中的Pod才会受到流量限制。未被任何策略选中的Pod依然是“全开放”状态。

结论KubernetesNetworkPolicy是“显式生效”,未定义时网络是“全通”的。若需实现安全隔离,务必主动为关键业务Pod编写NetworkPolicy策略。

2. NetworkPolicy配置与YAML属性详解

NetworkPolicy通过YAML文件进行定义,主要包含以下关键字段:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 3306
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 53

主要属性说明

  • podSelector:选择要应用该策略的Pod(通过标签匹配)
  • policyTypes:指定策略类型(Ingress入站、Egress出站)
  • ingress:定义允许哪些流量进入选中Pod
  • egress:定义允许哪些流量从选中Pod流出
  • from/to:来源或目标,可以是PodNamespaceIP块等
  • ports:允许的端口和协议
  • ipBlock:基于IP范围的规则

3. 常见NetworkPolicy功能配置

3.1 只允许同命名空间内访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: default

3.2 只允许特定Pod访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-pod
namespace: default
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend

3.3 拒绝所有入站流量(默认拒绝)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
ingress: []

3.4 允许DNS和外部互联网访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: UDP
port: 53

4. 典型业务场景与实现示例

4.1 数据库仅允许应用层访问

场景说明:数据库Pod只允许来自应用Pod的访问,禁止其他流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-only-allow-app
namespace: default
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: app
ports:
- protocol: TCP
port: 3306

4.2 多租户环境下的命名空间隔离

场景说明:不同租户的命名空间之间完全隔离,互不访问。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-ns-isolation
namespace: tenant-a
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
name: tenant-a

4.3 允许监控系统访问所有Pod

场景说明Prometheus等监控Pod需要采集全集群数据。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-prometheus
namespace: default
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector: {}
podSelector:
matchLabels:
app: prometheus

4.4 仅允许Pod访问外部特定IP

场景说明:业务Pod只能访问公司内网或指定外部服务。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-internal
namespace: default
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.1.0.0/16

5. 总结与最佳实践

  • 制定NetworkPolicy时建议先从最小权限原则出发,逐步放开必要流量
  • 配合标签、命名空间合理划分访问边界
  • 部署前建议在测试环境充分验证策略效果,避免误伤业务流量
  • 关注CNI插件兼容性和性能影响

NetworkPolicy是提升Kubernetes集群安全性的重要手段,合理配置可有效防止横向攻击和数据泄露,是生产环境必不可少的安全保障。

6. 参考资料