1. NetworkPolicy简介
在Kubernetes集群中,NetworkPolicy(网络策略)是一种用于控制Pod之间及Pod与外部网络之间流量的资源对象。通过定义NetworkPolicy,可以实现细粒度的网络访问控制,提升集群的安全性,防止未经授权的流量访问敏感服务。
核心功能:
- 限制不同
Pod之间的网络通信 - 控制
Pod与外部网络的流量 - 支持基于命名空间、标签、
IP等多维度的访问规则 - 配合
CNI插件实现网络隔离
注意:
NetworkPolicy的生效依赖于底层网络插件(如Calico、Cilium、Weave等)对其支持。
默认行为说明
如果没有手动创建任何NetworkPolicy资源,Kubernetes集群默认不会应用任何网络隔离策略:
- 所有
Pod之间的网络通信都是允许的,无论是否属于同一命名空间。 - 外部流量也可以访问
Pod(只要有合适的Service或端口暴露),没有基于NetworkPolicy的限制。 - 只有为某些
Pod创建了NetworkPolicy后,这些被选中的Pod才会受到流量限制。未被任何策略选中的Pod依然是“全开放”状态。
结论:Kubernetes的NetworkPolicy是“显式生效”,未定义时网络是“全通”的。若需实现安全隔离,务必主动为关键业务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:定义允许哪些流量进入选中Podegress:定义允许哪些流量从选中Pod流出from/to:来源或目标,可以是Pod、Namespace、IP块等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集群安全性的重要手段,合理配置可有效防止横向攻击和数据泄露,是生产环境必不可少的安全保障。