×

本节解释了nodesnetworks对等。管理员可以使用本节中的示例来设计AdminNetworkPolicyBaselineAdminNetworkPolicy以控制其集群中的北向流量。

AdminNetworkPolicy 和 BaselineAdminNetworkPolicy 的北向流量控制

除了支持东西向流量控制外,ANP 和 BANP 还允许管理员控制离开集群的北向流量或从节点到集群中其他节点的流量。最终用户可以执行以下操作:

  • 使用nodes出口对等实现对集群节点的出口流量控制

  • 使用nodesnetworks出口对等实现对 Kubernetes API 服务器的出口流量控制

  • 使用networks对等实现对集群外部外部目的地的出口流量控制

对于 ANP 和 BANP,只能为出口规则指定nodesnetworks对等。

使用节点对等来控制对集群节点的出口流量

使用nodes对等,管理员可以控制从 Pod 到集群中节点的出口流量。这样做的好处是,当向集群添加或从集群删除节点时,您无需更改策略。

以下示例允许任何具有restrictedconfidentialinternal安全级别的命名空间通过节点选择器对等访问端口6443上的 Kubernetes API 服务器。它还拒绝来自任何具有restrictedconfidentialinternal安全级别的命名空间对集群中所有工作节点的流量。

使用nodes对等的 ANP Allow 出口的示例
apiVersion: policy.networking.k8s.io/v1alpha1
kind: AdminNetworkPolicy
metadata:
  name: egress-security-allow
spec:
  egress:
  - action: Deny
    to:
    - nodes:
        matchExpressions:
        - key: node-role.kubernetes.io/worker
          operator: Exists
  - action: Allow
    name: allow-to-kubernetes-api-server-and-engr-dept-pods
    ports:
    - portNumber:
        port: 6443
        protocol: TCP
    to:
    - nodes: (1)
        matchExpressions:
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
    - pods: (2)
        namespaceSelector:
          matchLabels:
            dept: engr
        podSelector: {}
  priority: 55
  subject: (3)
    namespaces:
      matchExpressions:
      - key: security (4)
        operator: In
        values:
        - restricted
        - confidential
        - internal
1 使用matchExpressions字段指定集群中的一个或一组节点。
2 指定所有标有dept: engr的 Pod。
3 指定 ANP 的主体,其中包括与网络策略使用的标签匹配的任何命名空间。此示例匹配任何具有restrictedconfidentialinternal级别security的命名空间。
4 matchExpressions字段指定键/值对。

使用网络对等来控制对外部目的地的出口流量

集群管理员可以在networks对等中使用 CIDR 范围,并应用策略来控制从 Pod 发出并到达在使用networks字段指定的 CIDR 范围内配置的 IP 地址的目的地处的出口流量。

以下示例使用networks对等,并将 ANP 和 BANP 策略组合在一起以限制出口流量。

谨慎使用 ANP 和 BANP 中namespace字段中的空选择器({})。使用空选择器时,它还会选择 OpenShift 命名空间。

如果在 ANP 或 BANP Deny规则中使用0.0.0.0/0的值,则必须在将Deny设置为0.0.0.0/0之前设置更高优先级的 ANP Allow规则到必要的目的地。

使用networks对等的 ANP 和 BANP 示例
apiVersion: policy.networking.k8s.io/v1alpha1
kind: AdminNetworkPolicy
metadata:
  name: network-as-egress-peer
spec:
  priority: 70
  subject:
    namespaces: {} # Use the empty selector with caution because it also selects OpenShift namespaces as well.
  egress:
  - name: "deny-egress-to-external-dns-servers"
    action: "Deny"
    to:
    - networks:(1)
      - 8.8.8.8/32
      - 8.8.4.4/32
      - 208.67.222.222/32
    ports:
      - portNumber:
          protocol: UDP
          port: 53
  - name: "allow-all-egress-to-intranet"
    action: "Allow"
    to:
    - networks: (2)
      - 89.246.180.0/22
      - 60.45.72.0/22
  - name: "allow-all-intra-cluster-traffic"
    action: "Allow"
    to:
    - namespaces: {} # Use the empty selector with caution because it also selects OpenShift namespaces as well.
  - name: "pass-all-egress-to-internet"
    action: "Pass"
    to:
    - networks:
      - 0.0.0.0/0 (3)
---
apiVersion: policy.networking.k8s.io/v1alpha1
kind: BaselineAdminNetworkPolicy
metadata:
  name: default
spec:
  subject:
    namespaces: {} # Use the empty selector with caution because it also selects OpenShift namespaces as well.
  egress:
  - name: "deny-all-egress-to-internet"
    action: "Deny"
    to:
    - networks:
      - 0.0.0.0/0 (3)
---
1 使用networks指定集群外部的 CIDR 网络范围。
2 指定来自您的资源的集群内流量的 CIDR 范围。
3 通过将networks值设置为0.0.0.0/0来指定对所有内容的Deny出口。在将Deny设置为0.0.0.0/0之前,请确保您对必要的目的地有更高优先级的Allow规则,因为这将拒绝所有流量,包括对 Kubernetes API 和 DNS 服务器的流量。

network-as-egress-peer ANP 和使用networks 对等体的default BANP 共同实施以下出站策略

  • 所有 Pod 都无法与列出的 IP 地址处的外部 DNS 服务器通信。

  • 所有 Pod 都可以与公司内网的其余部分通信。

  • 所有 Pod 都可以与其他 Pod、节点和服务通信。

  • 所有 Pod 都无法访问互联网。结合最后一个 ANP Pass规则和强 BANP Deny规则,创建了一个保护集群中流量的安全防护策略。

同时使用节点对等体和网络对等体

集群管理员可以在您的 ANP 和 BANP 策略中组合nodesnetworks 对等体。

nodesnetworks 对等体的示例
apiVersion: policy.networking.k8s.io/v1alpha1
kind: AdminNetworkPolicy
metadata:
  name: egress-peer-1 (1)
spec:
  egress: (2)
  - action: "Allow"
    name: "allow-egress"
    to:
    - nodes:
        matchExpressions:
        - key: worker-group
          operator: In
          values:
          - workloads # Egress traffic from nodes with label worker-group: workloads is allowed.
    - networks:
      - 104.154.164.170/32
    - pods:
        namespaceSelector:
          matchLabels:
            apps: external-apps
        podSelector:
          matchLabels:
            app: web # This rule in the policy allows the traffic directed to pods labeled apps: web in projects with apps: external-apps to leave the cluster.
  - action: "Deny"
    name: "deny-egress"
    to:
    - nodes:
        matchExpressions:
        - key: worker-group
          operator: In
          values:
          - infra # Egress traffic from nodes with label worker-group: infra is denied.
    - networks:
      - 104.154.164.160/32 # Egress traffic to this IP address from cluster is denied.
    - pods:
        namespaceSelector:
          matchLabels:
            apps: internal-apps
        podSelector: {}
  - action: "Pass"
    name: "pass-egress"
    to:
    - nodes:
        matchExpressions:
        - key: node-role.kubernetes.io/worker
          operator: Exists # All other egress traffic is passed to NetworkPolicy or BANP for evaluation.
  priority: 30 (3)
  subject: (4)
    namespaces:
      matchLabels:
        apps: all-apps
1 指定策略的名称。
2 对于nodesnetworks 对等体,您只能在 ANP 中将北向流量控制用作egress(出站)。
3 指定 ANP 的优先级,确定其评估顺序。优先级较低的规则具有更高的优先级。ANP 接受 0-99 的值,其中 0 为最高优先级,99 为最低优先级。
4 指定要在其上应用策略规则的集群中的一组 Pod。在本例中,所有命名空间中具有apps: all-apps 标签的任何 Pod 都是该策略的subject(主体)。