网络策略(NetworkPolicy)是Kubernetes中的一种资源对象,用于定义和控制Pod之间的网络通信规则。它允许您在Kubernetes集群中定义详细的网络规则,以控制哪些Pod可以相互通信,以及允许或禁止的流量。网络策略提供了一种实现细粒度网络访问控制的方式,帮助管理员和开发者确保集群中的网络通信符合特定的安全性和策略需求。

一、Pod隔离的两种类型

Pod 有两种隔离:

  • 出口隔离
  • 入口隔离

它们涉及到可以建立哪些连接。这里的“隔离”不是绝对的,而是意味着“有一些限制”。另外的,“非隔离方向”意味着在所述方向上没有限制。这两种隔离(或不隔离)是独立声明的, 并且都与从一个 Pod 到另一个 Pod 的连接有关。

默认情况下,一个 Pod 的出口是非隔离的,即所有外向连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其policyTypes 中包含 Egress,则该 Pod 是出口隔离的, 称这样的策略适用于该 Pod 的出口。当一个 Pod 的出口被隔离时, 唯一允许的来自 Pod 的连接是适用于出口的 Pod 的某个 NetworkPolicy 的 egress 列表所允许的连接。这些 egress 列表的效果是相加的。

默认情况下,一个 Pod 对入口是非隔离的,即所有入站连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其 policyTypes 中包含 Ingress,则该 Pod 被隔离入口, 称这种策略适用于该 Pod 的入口。当一个 Pod 的入口被隔离时,唯一允许进入该 Pod 的连接是来自该 Pod 节点的连接和适用于入口的 Pod 的某个 NetworkPolicy 的 ingress 列表所允许的连接。这些 ingress 列表的效果是相加的。

网络策略是相加的,所以不会产生冲突。如果策略适用于 Pod 某一特定方向的流量,Pod 在对应方向所允许的连接是适用的网络策略所允许的集合。因此,评估的顺序不影响策略的结果。要允许从源 Pod 到目的 Pod 的连接,源 Pod 的出口策略和目的 Pod 的入口策略都需要允许连接。如果任何一方不允许连接,建立连接将会失败。

二、NetworkPolicy 配置详解

以下是一个NetworkPolicy的示例,参阅 NetworkPolicy[1] 来了解资源的完整定义。

apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
  name:test-network-policy
  namespace:default#策略应用在那个名称空间,就说对那个命名空间的pod做限制(目标)
spec:
  podSelector:#选择匹配哪些标签的pod,选择一组pod做网络策略,写{}表示该命名空间下pod
    matchLabels:
      role:db
  policyTypes:
  -Ingress#入网,谁访问pod(即谁访问default名称空间下有role=db标签的pod)
  -Egress#出网,role=db的pod可以访问谁
  ingress:
  -from:
    -ipBlock:
        cidr:172.17.0.0/16
        except:
        -172.17.1.0/24
    -namespaceSelector:
        matchLabels:
          project:myproject
    -podSelector:
        matchLabels:
          role:frontend
    ports:
    -protocol:TCP
      port:6379
  egress:
  -to:
    -ipBlock:
        cidr:10.0.0.0/24
    ports:
    -protocol:TCP
      port:5978