×

UserDefinedNetwork 仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让客户尽早访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围

在实施用户定义网络 (UDN) 之前,OVN-Kubernetes CNI 插件仅支持所有 Pod 附加到的主网络或主要网络上的第 3 层拓扑。这允许所有集群中的 Pod 都是同一全局第 3 层网络的一部分的网络模型,但限制了自定义主网络配置的能力。

用户定义网络为集群管理员和用户提供了高度可定制的主网络和次要网络类型的网络配置选项。使用 UDN,管理员可以创建具有增强隔离、工作负载的 IP 地址管理和高级网络功能的定制网络拓扑。UDN 支持第 2 层和第 3 层拓扑类型,能够实现各种网络架构和拓扑,从而增强网络的灵活性和安全性,并提高性能。

  • 对主网络和次要网络上 Localnet 拓扑的支持将在 OpenShift Container Platform 的未来版本中添加。

与仅限命名空间范围的 NAD 不同,UDN 使管理员能够通过利用ClusterUserDefinedNetwork 自定义资源 (CR) 来创建和定义跨越多个命名空间的附加集群级网络。UDN 还使管理员和用户能够使用UserDefinedNetwork CR 在命名空间级别定义附加网络。

以下部分进一步强调了用户定义网络的优势和限制、创建ClusterUserDefinedNetworkUserDefinedNetwork 自定义资源时的最佳实践、如何创建自定义资源以及可能与您的部署相关的其他配置详细信息。

用户定义网络的优势

用户定义网络提供以下优势:

  1. 增强的网络隔离以确保安全

    • 租户隔离:命名空间可以拥有自己的隔离主网络,类似于在 Red Hat OpenStack Platform (RHOSP) 中隔离租户的方式。这通过降低跨租户流量的风险来提高安全性。

  2. 网络灵活性

    • 第 2 层和第 3 层支持:集群管理员可以将主网络配置为第 2 层或第 3 层网络类型。这为主网络提供了次要网络的灵活性。

  3. 简化的网络管理

    • 降低网络配置复杂性:使用用户定义网络,无需复杂的网络策略,因为可以通过将工作负载分组到不同的网络中来实现隔离。

  4. 高级功能

    • 一致且可选择的 IP 地址分配:用户可以指定并在不同的命名空间和集群中重用 IP 子网,从而提供一致的网络环境。

    • 支持多个网络:用户定义网络功能允许管理员将多个命名空间连接到单个网络,或为不同的命名空间集创建不同的网络。

  5. 简化从 Red Hat OpenStack Platform (RHOSP) 迁移应用程序

    • 网络一致性:使用用户定义网络,通过提供类似的网络隔离和配置选项,可以简化从 OpenStack 到 OpenShift Container Platform 的应用程序迁移。

开发人员和管理员可以使用自定义资源创建命名空间范围的用户定义网络。该过程概述如下:创建命名空间,创建和配置自定义资源,在命名空间中创建 Pod。

UserDefinedNetwork 自定义资源的限制

虽然用户定义网络 (UDN) 提供高度可定制的网络配置选项,但在实施和管理这些网络时,集群管理员和开发人员应注意其限制。在实施用户定义网络之前,请考虑以下限制。

  • DNS 限制:

    • Pod 的 DNS 查询将解析为集群默认网络上的 Pod 的 IP 地址。即使 Pod 是用户定义网络的一部分,DNS 查询也不会解析为该用户定义网络上的 Pod 的 IP 地址。但是,服务和外部实体的 DNS 查询将按预期运行。

    • 当 Pod 分配给主 UDN 时,它可以访问集群默认网络上的 Kubernetes API (KAPI) 和 DNS 服务。

  • 初始网络分配:必须先创建命名空间和网络,然后再创建 Pod。将具有 Pod 的命名空间分配给新网络或在现有命名空间中创建 UDN 将不被 OVN-Kubernetes 接受。

  • 健康检查限制:Kubelet 健康检查由集群默认网络执行,它不会确认 Pod 上主接口的网络连接。因此,在使用用户定义网络的情况下,可能出现 Pod 在默认网络中显示为健康状态,但在主接口上连接中断的情况。

  • 网络策略限制:允许在连接到不同用户定义主网络的命名空间之间进行流量的网络策略无效。由于这些隔离网络之间没有连接,因此这些流量策略不会生效。

UserDefinedNetwork 最佳实践

在设置UserDefinedNetwork (UDN) 资源之前,用户应考虑以下信息:

  • 不应使用openshift-*命名空间来设置 UDN。

  • 用户定义网络需要 2 个伪装 IP 地址。您必须重新配置您的伪装子网,使其足够大以容纳所需的网络数量。

    • 对于 OpenShift Container Platform 4.17 及更高版本,集群使用169.254.0.0/17作为 IPv4 的默认伪装子网,以及fd69::/112作为 IPv6 的默认伪装子网。用户应避免使用这些范围。对于已更新的集群,默认伪装子网没有变化。

    • 在为项目配置用户定义网络后,不支持更改集群的伪装子网。在设置 UDN 后尝试修改伪装子网可能会中断网络连接并导致配置问题。

  • 确保租户使用UserDefinedNetwork资源而不是NetworkAttachmentDefinition (NAD) 资源。这可能会在租户之间造成安全风险。

  • 在创建网络分段时,只有在无法使用 UDN 资源完成用户定义网络分段时,才应使用 NAD 资源。

  • UDN 的集群子网和服务 CIDR 不能与默认集群子网 CIDR 重叠。OVN-Kubernetes 网络插件使用100.64.0.0/16作为默认网络的连接子网,您不能使用该值来配置 UDN 的joinSubnets字段。如果默认地址值在集群的任何网络中使用,则必须通过设置joinSubnets字段来覆盖它。更多信息,请参见“UserDefinedNetworks CR 的附加配置细节”。

创建 UserDefinedNetwork 自定义资源

以下步骤创建一个命名空间范围的用户定义网络。根据您的用例,使用my-layer-two-udn.yaml示例(用于Layer2拓扑类型)或my-layer-three-udn.yaml示例(用于Layer3拓扑类型)创建您的请求。

步骤
  1. Layer2Layer3拓扑类型的用户定义网络创建一个请求。

    1. 创建一个 YAML 文件,例如my-layer-two-udn.yaml,以定义您对Layer2拓扑的请求,如下例所示。

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-1 (1)
        namespace: <some_custom_namespace>
      spec:
        topology: Layer2 (2)
        layer2: (3)
          role: Primary (4)
          subnets:
            - "10.0.0.0/24"
            - "2001:db8::/60" (5)
      1 您的UserDefinedNetwork资源的名称。这不能是default,也不能与集群网络操作员 (CNO) 创建的任何全局命名空间重复。
      2 topology字段描述网络配置;可接受的值为Layer2Layer3。指定Layer2拓扑类型将创建一个由所有节点共享的逻辑交换机。
      3 此字段指定拓扑配置。它可以是layer2layer3
      4 指定PrimarySecondary。在 4.17 中,只支持Primary角色规范。
      5 对于Layer2拓扑类型,以下内容指定subnet字段的配置详细信息。
      • subnets 字段是可选的。

      • subnets 字段的类型为string,并接受 IPv4 和 IPv6 的标准 CIDR 格式。

      • subnets 字段接受一到两个项目。对于两个项目,它们必须属于不同的族。例如,subnets 值为10.100.0.0/162001:db8::/64

      • 可以省略Layer2子网。如果省略,用户必须为 Pod 配置 IP 地址。因此,端口安全仅阻止 MAC 欺骗。

      • 当指定ipamLifecycle字段时,Layer2subnets字段是必需的。

    2. 创建一个 YAML 文件,例如my-layer-three-udn.yaml,以定义您对Layer3拓扑的请求,如下例所示。

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-2-primary (1)
        namespace: <some_custom_namespace>
      spec:
        topology: Layer3 (2)
        layer3: (3)
          role: Primary (4)
          subnets: (5)
            - cidr: 10.150.0.0/16
              hostSubnet: 24
            - cidr: 2001:db8::/60
              hostSubnet: 64
      1 您的UserDefinedNetwork资源的名称。这不能是default,也不能与集群网络操作员 (CNO) 创建的任何全局命名空间重复。
      2 topology字段描述网络配置;可接受的值为Layer2Layer3。指定Layer3拓扑类型将为每个节点创建一个第 2 层段,每个段都有一个不同的子网。第 3 层路由用于互连节点子网。
      3 此字段指定拓扑配置。有效值为layer2layer3
      4 指定PrimarySecondary角色。在 4.17 中,只支持Primary角色规范。
      5 对于Layer3拓扑类型,以下内容指定subnet字段的配置详细信息。
      • subnets字段是必需的。

      • subnets字段的类型为cidrhostSubnet

        • cidr是集群子网,并接受字符串值。

        • hostSubnet指定集群子网被分割到的节点子网前缀。

        • 对于 IPv6,只支持/64长度的hostSubnet

  2. 通过运行以下命令应用您的请求:

    $ oc apply -f <my_layer_two_udn.yaml>

    其中<my_layer_two_udn.yaml>是您的Layer2Layer3配置文件的名称。

  3. 通过运行以下命令验证您的请求是否成功:

    $ oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml

    其中some_custom_namespace是您为用户定义网络创建的命名空间。

    示例输出
    apiVersion: k8s.ovn.org/v1
    kind: UserDefinedNetwork
    metadata:
      creationTimestamp: "2024-08-28T17:18:47Z"
      finalizers:
      - k8s.ovn.org/user-defined-network-protection
      generation: 1
      name: udn-1
      namespace: some-custom-namespace
      resourceVersion: "53313"
      uid: f483626d-6846-48a1-b88e-6bbeb8bcde8c
    spec:
      layer2:
        role: Primary
        subnets:
        - 10.0.0.0/24
        - 2001:db8::/60
      topology: Layer2
    status:
      conditions:
      - lastTransitionTime: "2024-08-28T17:18:47Z"
        message: NetworkAttachmentDefinition has been created
        reason: NetworkAttachmentDefinitionReady
        status: "True"
        type: NetworkReady

UserDefinedNetworks CR 的附加配置细节

下表解释了 UDN 的其他可选配置。不建议在没有明确需求和对 OVN-Kubernetes 网络拓扑的理解的情况下设置这些字段。

表 1. UserDefinedNetworks可选配置
字段 类型 描述

spec.joinSubnets

对象

省略时,平台将为joinSubnets字段设置默认值:IPv4 为100.65.0.0/16,IPv6 为fd99::/64。如果默认地址值在集群的任何网络中使用,则必须通过设置joinSubnets字段来覆盖它。如果选择设置此字段,请确保它不会与集群中的其他子网冲突,例如集群子网、default网络集群子网和伪装子网。

joinSubnets字段配置用户定义网络内不同段之间的路由。双栈集群可以设置 2 个子网,每个 IP 族一个;否则,只允许 1 个子网。此字段仅允许用于Primary网络。

spec.IPAMLifecycle

对象

IPAMLifecycle字段配置 IP 地址管理系统 (IPAM)。您可以将此字段用于虚拟工作负载,以确保持久 IP 地址。当topologylayer2时,允许使用此字段。当指定此字段时,必须指定subnets字段。设置Persistent值可确保您的虚拟工作负载在重新引导和迁移期间拥有持久 IP 地址。这些地址由容器网络接口 (CNI) 分配,并由 OVN-Kubernetes 用于编程 Pod IP 地址。您不能为此更改 Pod 注解。

spec.layer2.mtuspec.layer3.mtu

整数

最大传输单元 (MTU)。默认值为1400。IPv4 的边界为574,IPv6 的边界为1280