Kubernetes网络策略
Kubernetes网络策略(Network Policies)是Kubernetes中用于控制Pod之间网络通信的规则集合。通过定义网络策略,用户可以限制哪些Pod可以相互通信,从而增强集群的安全性。网络策略基于标签选择器(Label Selectors)和命名空间(Namespace)来定义流量规则,支持入口(Ingress)和出口(Egress)流量的控制。
简介[编辑 | 编辑源代码]
Kubernetes默认情况下允许所有Pod之间自由通信,但在生产环境中,通常需要限制某些敏感服务的访问权限。网络策略允许管理员通过声明式的方式定义哪些Pod可以接收或发送流量,类似于传统的防火墙规则。
网络策略的实现依赖于CNI插件(如Calico、Cilium或Weave Net),并非所有网络插件都支持网络策略功能。因此,在启用网络策略前,需确认集群的CNI插件是否兼容。
核心概念[编辑 | 编辑源代码]
基本组件[编辑 | 编辑源代码]
- PodSelector:选择应用策略的目标Pod。
- PolicyTypes:指定策略类型(`Ingress`、`Egress`或两者)。
- Ingress Rules:定义允许进入目标Pod的流量规则。
- Egress Rules:定义允许从目标Pod发出的流量规则。
默认行为[编辑 | 编辑源代码]
- 如果命名空间中未定义任何网络策略,则所有流量被允许(默认允许所有)。
- 一旦在命名空间中创建了网络策略,则只有匹配规则的流量被允许(默认拒绝所有)。
网络策略示例[编辑 | 编辑源代码]
以下是一个基础的网络策略示例,限制只有带有标签`role: frontend`的Pod可以访问带有标签`role: backend`的Pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: default
spec:
podSelector:
matchLabels:
role: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
解释[编辑 | 编辑源代码]
- `podSelector`:选择标签为`role: backend`的Pod作为策略目标。
- `ingress.from.podSelector`:仅允许标签为`role: frontend`的Pod访问。
- `ports`:仅允许TCP协议的80端口流量。
高级用例[编辑 | 编辑源代码]
多条件流量控制[编辑 | 编辑源代码]
以下策略允许来自特定命名空间(`monitoring`)和特定Pod标签(`app: prometheus`)的流量:
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
podSelector:
matchLabels:
app: prometheus
出口策略示例[编辑 | 编辑源代码]
限制Pod仅能访问外部IP地址`1.2.3.4`的53端口(DNS服务):
egress:
- to:
- ipBlock:
cidr: 1.2.3.4/32
ports:
- protocol: UDP
port: 53
实际场景[编辑 | 编辑源代码]
微服务隔离[编辑 | 编辑源代码]
假设一个电商应用包含以下组件:
- `frontend`(标签: `tier: web`)
- `backend`(标签: `tier: app`)
- `database`(标签: `tier: db`)
网络策略可配置为: 1. 仅允许`frontend`访问`backend`。 2. 仅允许`backend`访问`database`。 3. 拒绝其他所有流量。
关键服务保护[编辑 | 编辑源代码]
保护Redis服务仅允许特定应用访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: redis-allow
spec:
podSelector:
matchLabels:
app: redis
ingress:
- from:
- podSelector:
matchLabels:
app: inventory
ports:
- protocol: TCP
port: 6379
数学表达[编辑 | 编辑源代码]
网络策略的匹配逻辑可以用集合论表示。假设:
- 允许的入口流量集合为。
- Pod标签集合为。
- 命名空间标签集合为。
则流量允许条件为:
注意事项[编辑 | 编辑源代码]
1. 插件兼容性:确保CNI插件支持`NetworkPolicy` API。 2. 默认拒绝:首个策略会覆盖默认的“允许所有”规则。 3. 规则优先级:多个策略会叠加生效(允许的流量取并集)。 4. 性能影响:复杂策略可能增加网络延迟。
总结[编辑 | 编辑源代码]
Kubernetes网络策略是集群网络安全的关键工具,通过精细化的流量控制可有效减少攻击面。初学者应从简单的Pod选择器开始,逐步学习多条件策略和出口控制。实际部署时需结合监控工具验证策略有效性。