Menu Close

Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

8.10. 启用 NetworkPolicy

ovs-subnetovs-multitenant 插件具有自己的传统网络隔离模型,不支持 Kubernetes NetworkPolicy。但是,NetworkPolicy 支持可以通过 ovs-networkpolicy 插件获得。

注意

v1 NetworkPolicy 功能仅适用于 OpenShift Container Platform。这意味着 OpenShift Container Platform 不提供出口策略类型、IPBlock 和组合 podSelector 和 namespaceSelector

注意

不要在默认的 OpenShift Container Platform 项目中应用 NetworkPolicy 功能,因为它们可能会破坏与集群的通信。

警告

NetworkPolicy 规则不适用于主机网络命名空间。启用主机网络的 Pod 不受 NetworkPolicy 规则的影响 。

配置为使用 ovs-networkpolicy 插件的 集群中,网络隔离完全由 NetworkPolicy 对象 控制。默认情况下,项目中的所有 pod 都可被其他 pod 和网络端点访问。要在一个项目中隔离一个或多个 Pod,您可以在该项目中创建 NetworkPolicy 对象来指示允许的入站连接。项目管理员可以在自己的项目中创建和删除 NetworkPolicy 对象。

没有指向它们的 NetworkPolicy 对象的 Pod 可以完全访问,而具有一个或多个指向它们的 NetworkPolicy 对象的 pod 会被隔离。这些隔离的 pod 只接受至少被其中一个 NetworkPolicy 对象 接受的连接。

以下是一些支持不同场景的 NetworkPolicy 对象定义示例:

  • 拒绝所有流量

    要使项目"默认为拒绝"添加匹配所有 pod 但不接受任何流量的 NetworkPolicy 对象。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
    spec:
      podSelector:
      ingress: []
  • 仅接受项目中 pod 的连接

    要使 pod 接受同一项目中其他 pod 的连接,但拒绝其他项目中所有 pod 的连接:

    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

NetworkPolicy 对象是可添加的;也就是说,您可以组合多个 NetworkPolicy 对象来满足复杂的网络要求。

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

8.10.1. 高效地使用 NetworkPolicy

NetworkPolicy 对象 允许您在命名空间中通过标签来相互隔离不同的 pod。

NetworkPolicy 对象应用到单一命名空间中的大量 pod 时,效率较低。pod 标签不存在于 IP 级别上,因此 NetworkPolicy 对象 会为使用 pod Selector 选择的每个 pod 之间生成单独的 OVS 流规则。

例如,如果 NetworkPolicy 对象中的 spec podSelectoringress podSelector 每个都匹配 200 个 pod,则会生成 40000(200*200)OVS 流规则。这可能会减慢机器的速度。

若要减少 OVS 流规则的数量,可使用命名空间来包含需要隔离的 pod 组。

使用 namespaceSelectors 或空 podSelectors 选择整个命名空间的 NetworkPolicy 对象 只会生成与命名空间的 VXLAN VNID 匹配的 OVS 流规则。

保留不需要在原始命名空间中隔离的 pod,并将需要隔离的 pod 移到一个或多个不同的命名空间中。

创建额外的目标跨命名空间策略,以允许来自隔离 pod 的特定流量。