跳转到内容

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. 拒绝其他所有流量。

graph LR A[frontend: tier=web] -->|Allow| B[backend: tier=app] B -->|Allow| C[database: tier=db] A -.->|Deny| C

关键服务保护[编辑 | 编辑源代码]

保护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

数学表达[编辑 | 编辑源代码]

网络策略的匹配逻辑可以用集合论表示。假设:

  • 允许的入口流量集合为I
  • Pod标签集合为P
  • 命名空间标签集合为N

则流量允许条件为: I={(p,n)pPnN}

注意事项[编辑 | 编辑源代码]

1. 插件兼容性:确保CNI插件支持`NetworkPolicy` API。 2. 默认拒绝:首个策略会覆盖默认的“允许所有”规则。 3. 规则优先级:多个策略会叠加生效(允许的流量取并集)。 4. 性能影响:复杂策略可能增加网络延迟。

总结[编辑 | 编辑源代码]

Kubernetes网络策略是集群网络安全的关键工具,通过精细化的流量控制可有效减少攻击面。初学者应从简单的Pod选择器开始,逐步学习多条件策略和出口控制。实际部署时需结合监控工具验证策略有效性。