×

关于网络策略

默认情况下,项目中的所有 Pod 都可以从其他 Pod 和网络端点访问。要隔离项目中的一个或多个 Pod,您可以在该项目中创建 `NetworkPolicy` 对象以指示允许的传入连接。项目管理员可以在其自己的项目中创建和删除 `NetworkPolicy` 对象。

如果一个 Pod 与一个或多个 `NetworkPolicy` 对象中的选择器匹配,则该 Pod 仅接受至少一个 `NetworkPolicy` 对象允许的连接。任何 `NetworkPolicy` 对象都没有选择的 Pod 是完全可访问的。

网络策略仅应用于 TCP、UDP、ICMP 和 SCTP 协议。其他协议不受影响。

网络策略不适用于主机网络命名空间。启用主机网络的 Pod 不受网络策略规则的影响。但是,连接到主机网络 Pod 的 Pod 可能会受到网络策略规则的影响。

网络策略无法阻止来自本地主机或其驻留节点的流量。

以下 `NetworkPolicy` 对象示例演示了支持不同场景的方法

  • 拒绝所有流量

    要使项目默认拒绝连接,请添加一个匹配所有 Pod 但不接受任何流量的 `NetworkPolicy` 对象。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
    spec:
      podSelector: {}
      ingress: []
  • 仅允许来自 OpenShift 专用 Ingress Controller 的连接

    要使项目仅允许来自 OpenShift 专用 Ingress Controller 的连接,请添加以下 `NetworkPolicy` 对象。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-from-openshift-ingress
    spec:
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              network.openshift.io/policy-group: ingress
      podSelector: {}
      policyTypes:
      - Ingress
  • 仅接受来自项目内 Pod 的连接

    要允许来自同一命名空间中 `hostNetwork` Pod 的入站连接,您需要将 `allow-from-hostnetwork` 策略与 `allow-same-namespace` 策略一起应用。

    要使 Pod 接受来自同一项目中其他 Pod 的连接,但拒绝来自其他项目中 Pod 的所有其他连接,请添加以下 `NetworkPolicy` 对象。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-same-namespace
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector: {}
  • 仅允许基于 Pod 标签的 HTTP 和 HTTPS 流量

    要仅允许对具有特定标签(在以下示例中为 `role=frontend`)的 Pod 进行 HTTP 和 HTTPS 访问,请添加一个类似于以下内容的 `NetworkPolicy` 对象。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-http-and-https
    spec:
      podSelector:
        matchLabels:
          role: frontend
      ingress:
      - ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443
  • 使用命名空间和 Pod 选择器接受连接

    要通过组合命名空间和 Pod 选择器来匹配网络流量,您可以使用类似于以下内容的 `NetworkPolicy` 对象。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-pod-and-namespace-both
    spec:
      podSelector:
        matchLabels:
          name: test-pods
      ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                project: project_name
            podSelector:
              matchLabels:
                name: test-pods

`NetworkPolicy` 对象是累加的,这意味着您可以将多个 `NetworkPolicy` 对象组合在一起以满足复杂的网络需求。

例如,对于前面示例中定义的NetworkPolicy对象,您可以在同一个项目中定义allow-same-namespaceallow-http-and-https策略。这样就允许带有标签role=frontend的 Pod 接受每项策略允许的任何连接。也就是说,来自同一命名空间中 Pod 的任何端口上的连接,以及来自任何命名空间中 Pod 的80443端口上的连接。

使用 allow-from-router 网络策略

使用以下NetworkPolicy允许外部流量,而不管路由器配置如何

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-router
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/ingress: ""(1)
  podSelector: {}
  policyTypes:
  - Ingress
1 policy-group.network.openshift.io/ingress:""标签支持 OVN-Kubernetes。

使用 allow-from-hostnetwork 网络策略

添加以下allow-from-hostnetwork NetworkPolicy对象以引导来自主机网络 Pod 的流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-hostnetwork
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/host-network: ""
  podSelector: {}
  policyTypes:
  - Ingress

OVN-Kubernetes 网络插件的网络策略优化

设计网络策略时,请参考以下指南

  • 对于具有相同spec.podSelector规范的网络策略,使用一个包含多个ingressegress规则的网络策略,比使用多个包含ingressegress规则子集的网络策略更高效。

  • 每个基于podSelectornamespaceSelector规范的ingressegress规则生成的 OVS 流数量与网络策略选择的 Pod 数量 + ingress 或 egress 规则选择的 Pod 数量成正比。因此,最好使用可以在一个规则中选择尽可能多 Pod 的podSelectornamespaceSelector规范,而不是为每个 Pod 创建单独的规则。

    例如,以下策略包含两条规则

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
      - from:
        - podSelector:
            matchLabels:
              role: backend

    以下策略将这两条规则表达为一条规则

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchExpressions:
            - {key: role, operator: In, values: [frontend, backend]}

    同样的指南也适用于spec.podSelector规范。如果不同的网络策略具有相同的ingressegress规则,则创建一个具有公共spec.podSelector规范的网络策略可能会更高效。例如,以下两个策略具有不同的规则

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy1
    spec:
      podSelector:
        matchLabels:
          role: db
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy2
    spec:
      podSelector:
        matchLabels:
          role: client
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    以下网络策略将这两条规则表达为一条规则

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy3
    spec:
      podSelector:
        matchExpressions:
        - {key: role, operator: In, values: [db, client]}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    只有在将多个选择器表达为一个选择器时,才能应用此优化。如果选择器基于不同的标签,则可能无法应用此优化。在这种情况下,请考虑专门为网络策略优化应用一些新的标签。

后续步骤