第 2 章 网络策略


2.1. 创建网络策略

要限制工作负载之间的流量并改进应用程序安全性,请为集群配置 NetworkPolicy 对象。网络策略为所选 pod 定义允许入口和出口连接,帮助在命名空间中隔离应用程序。

作为开发者,您可以定义网络策略来限制集群中 pod 的流量。

2.1.1. 关于网络策略

要控制工作负载之间的流量并改进网络隔离,请为您的项目配置 NetworkPolicy 对象。网络策略为所选 pod 定义允许入口和出口连接,并帮助在集群中保护应用程序。

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

重要

在 OpenShift Dedicated 4.22 中,OpenShift Dedicated 现在默认在某些命名空间中包括 NetworkPolicy 对象。此包括提高了整体安全性,并更好地保护 control plane 组件。不要修改 OpenShift Dedicated 默认包含在自己的命名空间中。要检查默认包含对象的命名空间,您可以运行以下命令:

$ oc get networkpolicies --all-namespaces

OpenShift Dedicated 4.22 发行版本不会将对象包括在所有 OpenShift Dedicated 命名空间中;之后的 OpenShift Dedicated 发行版本可能将对象包含在额外的命名空间中。

默认情况下,项目中的所有 pod 都可从任何网络端点访问。

如果一个 pod 由一个或多个 NetworkPolicy 对象中的选择器匹配,则 pod 只接受至少被其中一个 NetworkPolicy 对象所允许的连接。未被任何 NetworkPolicy 对象选择的 pod,仍可完全访问。

2.1.1.1. 策略添加

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

例如,如果您在同一项目中定义了 allow-same-namespace 策略和 allow-http-and-https 策略,则具有 role=frontend 标签的 Pod 可以接受任何策略所允许的连接。

这意味着 pod 接受:

  • 来自同一命名空间中的 pod 的任何端口上的连接。
  • 端口 80443 上的来自任意命名空间中 pod 的连接。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-router
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/ingress: ""
  podSelector: {}
  policyTypes:
  - Ingress

policy-group.network.openshift.io/ingress:"" 标签支持 OVN-Kubernetes。

要减少集群攻击面并确保可预测的网络行为,OpenShift Dedicated 在关键网络组件上强制实施最低特权网络策略。

管理集群 DNS 和集群 Ingress 的 Operator 会在各自命名空间中自动安装并维护默认的"deny-all" NetworkPolicy 对象。

使用以下命名空间中的目标"allow"策略控制流量:

  • DNS 组件命名空间(openshift-dnsopenshift-dns-operator):

    • Egress 仅限于 API 服务器和所需的 DNS 端口。
    • Ingress 仅限于基本的 DNS 流量和指标。
  • Ingress 组件命名空间(openshift-ingressopenshift-ingress-operator):

    • Egress 仅限于 API 服务器、DNS 端口和路由端点。
    • Ingress 仅限于 HTTP/HTTPS 流量和指标。
重要

不要在这些命名空间中运行非受管或自定义 pod。由于这些命名空间在 deny-by-default 模型上运行,因此这些命名空间中运行的任何非受管容器的网络流量都将被阻止。

2.1.2. 使用 OVN-Kubernetes 网络插件优化网络策略

了解如何优化 OVN-Kubernetes 网络策略,以减少流数,并确保在需要时允许外部 IP 流量。

在设计您的网络策略时,请参考以下指南:

  • 对于具有相同 spec.podSelector spec 的网络策略,使用带有多个 ingressegress 规则的一个网络策略比带有 ingressegress 子集的多个网络策略更高效。
  • 每个基于 podSelectornamespaceSelector spec 的 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 spec。如果不同的网络策略有相同的 ingressegress 规则,则创建一个带有通用的 spec.podSelector spec 可能更有效率。例如,以下两个策略有不同的规则:

    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

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

在 OVN-Kubernetes 中,NetworkPolicy 自定义资源(CR)强制执行严格的隔离规则。如果服务使用外部 IP 公开,网络策略可以阻止来自其他命名空间的访问,除非明确配置为允许流量。

要允许在命名空间间访问外部 IP,请创建一个 NetworkPolicy CR,该 CR 明确允许来自所需命名空间的入口流量,并确保允许流量在指定的服务端口中。在不允许流量到所需端口的情况下,访问可能仍然会被限制。

输出示例

  apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    annotations:
    name: <policy_name>
    namespace: openshift-ingress
  spec:
    ingress:
    - ports:
      - port: 80
        protocol: TCP
    - ports:
      - port: 443
        protocol: TCP
    - from:
      - namespaceSelector:
          matchLabels:
          kubernetes.io/metadata.name: <my_namespace>
    podSelector: {}
    policyTypes:
    - Ingress

其中:

<policy_name>
指定策略的名称。
<my_namespace>
指定部署策略的命名空间的名称。

如需了解更多详细信息,请参阅"关于网络策略"。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部