×

作为集群管理员,您可以在集群安装后更改集群网络的MTU。此更改具有破坏性,因为集群节点必须重新引导才能完成MTU更改。

关于集群MTU

在安装期间,集群网络的最大传输单元 (MTU) 会根据集群中节点的主网络接口的MTU自动检测。您通常不需要覆盖检测到的MTU。

您可能需要更改集群网络的MTU,原因如下:

  • 在集群安装期间检测到的MTU不适合您的基础设施。

  • 您的集群基础设施现在需要不同的MTU,例如添加需要不同MTU才能获得最佳性能的节点。

只有OVN-Kubernetes集群网络插件支持更改MTU值。

服务中断注意事项

当您在集群上启动MTU更改时,以下影响可能会影响服务可用性:

  • 至少需要两次滚动重启才能完成迁移到新的MTU。在此期间,某些节点在重启时不可用。

  • 部署到集群的特定应用程序,其超时间隔短于绝对TCP超时间隔,在MTU更改期间可能会出现中断。

MTU值选择

在规划MTU迁移时,需要考虑两个相关但不同的MTU值。

  • 硬件MTU:此MTU值根据您的网络基础设施的具体情况设置。

  • 集群网络MTU:此MTU值始终小于您的硬件MTU,以考虑集群网络覆盖开销。具体的开销由您的网络插件确定。对于OVN-Kubernetes,开销为100字节。

如果您的集群需要为不同的节点使用不同的MTU值,则必须从集群中任何节点使用的最低MTU值中减去网络插件的开销值。例如,如果集群中某些节点的MTU为9001,而某些节点的MTU为1500,则必须将此值设置为1400

为避免选择节点无法接受的MTU值,请使用ip -d link命令验证网络接口接受的最大MTU值 (maxmtu)。

迁移过程的工作原理

下表通过将过程中用户启动的步骤与迁移响应执行的操作区分开来,总结了迁移过程。

表1. 集群MTU的实时迁移
用户启动的步骤 OpenShift Container Platform活动

在集群网络操作符配置中设置以下值:

  • spec.migration.mtu.machine.to

  • spec.migration.mtu.network.from

  • spec.migration.mtu.network.to

集群网络操作符 (CNO):确认每个字段都设置为有效值。

  • mtu.machine.to 必须设置为新的硬件 MTU,或者如果硬件的 MTU 没有更改,则设置为当前硬件 MTU。此值是临时的,用作迁移过程的一部分。单独地,如果您指定的硬件 MTU 与您现有的硬件 MTU 值不同,则必须通过其他方式手动配置 MTU 以使其持久化,例如使用机器配置、DHCP 设置或 Linux 内核命令行。

  • mtu.network.from 字段必须等于 network.status.clusterNetworkMTU 字段,该字段是集群网络的当前 MTU。

  • mtu.network.to 字段必须设置为目标集群网络 MTU,并且必须低于硬件 MTU,以便允许网络插件的覆盖开销。对于 OVN-Kubernetes,开销为 100 字节。

如果提供的值有效,则 CNO 将写入一个新的临时配置,其中集群网络的 MTU 设置为 mtu.network.to 字段的值。

机器配置操作符 (MCO):对集群中的每个节点执行滚动重启。

重新配置集群上节点的主网络接口的 MTU。您可以使用多种方法来实现此目的,包括

  • 部署具有 MTU 更改的新 NetworkManager 连接配置文件

  • 通过 DHCP 服务器设置更改 MTU

  • 通过引导参数更改 MTU

N/A

在网络插件的 CNO 配置中设置 mtu 值,并将 spec.migration 设置为 null

机器配置操作符 (MCO):使用新的 MTU 配置对集群中的每个节点执行滚动重启。

更改集群网络 MTU

作为集群管理员,您可以增加或减少集群的最大传输单元 (MTU)。

迁移是有破坏性的,集群中的节点在 MTU 更新生效时可能会暂时不可用。

以下过程描述了如何使用机器配置、动态主机配置协议 (DHCP) 或 ISO 镜像更改集群网络 MTU。如果您使用 DHCP 或 ISO 方法,则必须参考安装集群后保留的配置工件以完成此过程。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 您可以使用具有 cluster-admin 权限的帐户访问集群。

  • 您已确定集群的目标 MTU。OVN-Kubernetes 网络插件的 MTU 必须设置为集群中最低硬件 MTU 值减去 100

步骤
  1. 要获取集群网络的当前 MTU,请输入以下命令

    $ oc describe network.config cluster
    示例输出
    ...
    Status:
      Cluster Network:
        Cidr:               10.217.0.0/22
        Host Prefix:        23
      Cluster Network MTU:  1400
      Network Type:         OVNKubernetes
      Service Network:
        10.217.4.0/23
    ...
  2. 准备您的硬件 MTU 配置

    • 如果您的硬件 MTU 是使用 DHCP 指定的,请更新您的 DHCP 配置,例如使用以下 dnsmasq 配置

      dhcp-option-force=26,<mtu>

      其中

      <mtu>

      指定 DHCP 服务器要通告的硬件 MTU。

    • 如果您的硬件 MTU 是使用带有 PXE 的内核命令行指定的,请相应地更新该配置。

    • 如果您的硬件 MTU 是在 NetworkManager 连接配置中指定的,请完成以下步骤。如果您没有使用 DHCP、内核命令行或其他方法显式指定网络配置,则此方法是 OpenShift Container Platform 的默认方法。为了使以下过程无需修改即可工作,您的集群节点必须全部使用相同的底层网络配置。

      1. 通过输入以下命令查找主网络接口

    $ oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0

    +

    其中

    <node_name>

    指定集群中节点的名称。

    1. <interface>-mtu.conf 文件中创建以下 NetworkManager 配置

      示例 NetworkManager 连接配置
      [connection-<interface>-mtu]
      match-device=interface-name:<interface>
      ethernet.mtu=<mtu>

      其中

      <mtu>

      指定新的硬件 MTU 值。

      <interface>

      指定主网络接口名称。

    2. 创建两个 MachineConfig 对象,一个用于控制平面节点,另一个用于集群中的工作节点

      1. control-plane-interface.bu 文件中创建以下 Butane 配置

        variant: openshift
        version: 4.17.0
        metadata:
          name: 01-control-plane-interface
          labels:
            machineconfiguration.openshift.io/role: master
        storage:
          files:
            - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf (1)
              contents:
                local: <interface>-mtu.conf (2)
              mode: 0600
        1 指定主网络接口的 NetworkManager 连接名称。
        2 指定上一步中更新的 NetworkManager 配置文件的本地文件名。
      2. worker-interface.bu 文件中创建以下 Butane 配置

        variant: openshift
        version: 4.17.0
        metadata:
          name: 01-worker-interface
          labels:
            machineconfiguration.openshift.io/role: worker
        storage:
          files:
            - path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf (1)
              contents:
                local: <interface>-mtu.conf (2)
              mode: 0600
        1 指定主网络接口的 NetworkManager 连接名称。
        2 指定上一步中更新的 NetworkManager 配置文件的本地文件名。
      3. 通过运行以下命令从 Butane 配置创建 MachineConfig 对象

        $ for manifest in control-plane-interface worker-interface; do
            butane --files-dir . $manifest.bu > $manifest.yaml
          done

        在此过程的后面明确指示之前,不要应用这些机器配置。现在应用这些机器配置会导致集群稳定性下降。

  3. 要开始 MTU 迁移,请通过输入以下命令指定迁移配置。机器配置操作符将对集群中的节点执行滚动重启,以准备进行 MTU 更改。

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'

    其中

    <overlay_from>

    指定当前集群网络 MTU 值。

    <overlay_to>

    指定集群网络的目标 MTU。此值相对于 <machine_to> 的值设置。对于 OVN-Kubernetes,此值必须为 <machine_to> 的值减去 100

    <machine_to>

    指定底层主机网络上主网络接口的 MTU。

    增加集群 MTU 的示例
    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'
  4. 随着机器配置操作符更新每个机器配置池中的机器,它将逐个重启每个节点。您必须等到所有节点都更新完毕。通过输入以下命令检查机器配置池状态

    $ oc get machineconfigpools

    成功更新的节点具有以下状态:UPDATED=trueUPDATING=falseDEGRADED=false

    默认情况下,机器配置操作符一次更新每个池中的一台机器,导致迁移所需的时间随着集群大小的增加而增加。

  5. 确认主机上新机器配置的状态

    1. 要列出机器配置状态和应用的机器配置的名称,请输入以下命令

      $ oc describe node | egrep "hostname|machineconfig"
      示例输出
      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done
    2. 验证以下语句是否为真

      • machineconfiguration.openshift.io/state 字段的值为 Done

      • machineconfiguration.openshift.io/currentConfig 字段的值等于 machineconfiguration.openshift.io/desiredConfig 字段的值。

    3. 要确认机器配置是否正确,请输入以下命令

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart

      其中 <config_name>machineconfiguration.openshift.io/currentConfig 字段中机器配置的名称。

      机器配置必须包含以下对 systemd 配置的更新

      ExecStart=/usr/local/bin/mtu-migration.sh
  6. 更新底层网络接口 MTU 值

    • 如果您使用 NetworkManager 连接配置指定新的 MTU,请输入以下命令。机器配置操作符将自动对集群中的节点执行滚动重启。

      $ for manifest in control-plane-interface worker-interface; do
          oc create -f $manifest.yaml
        done
    • 如果您使用 DHCP 服务器选项和内核命令行以及 PXE 指定新的 MTU,请对您的基础架构进行必要的更改。

  7. 随着机器配置操作符更新每个机器配置池中的机器,它将逐个重启每个节点。您必须等到所有节点都更新完毕。通过输入以下命令检查机器配置池状态

    $ oc get machineconfigpools

    成功更新的节点具有以下状态:UPDATED=trueUPDATING=falseDEGRADED=false

    默认情况下,机器配置操作符一次更新每个池中的一台机器,导致迁移所需的时间随着集群大小的增加而增加。

  8. 确认主机上新机器配置的状态

    1. 要列出机器配置状态和应用的机器配置的名称,请输入以下命令

      $ oc describe node | egrep "hostname|machineconfig"
      示例输出
      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

      验证以下语句是否为真

      • machineconfiguration.openshift.io/state 字段的值为 Done

      • machineconfiguration.openshift.io/currentConfig 字段的值等于 machineconfiguration.openshift.io/desiredConfig 字段的值。

    2. 要确认机器配置是否正确,请输入以下命令

      $ oc get machineconfig <config_name> -o yaml | grep path:

      其中 <config_name>machineconfiguration.openshift.io/currentConfig 字段中机器配置的名称。

      如果机器配置成功部署,则之前的输出包含 /etc/NetworkManager/conf.d/99-<interface>-mtu.conf 文件路径和 ExecStart=/usr/local/bin/mtu-migration.sh 行。

  9. 要完成 MTU 迁移,请为 OVN-Kubernetes 网络插件输入以下命令:

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'

    其中

    <mtu>

    指定您使用<overlay_to>指定的新的集群网络 MTU。

  10. 完成 MTU 迁移后,每个机器配置池节点将逐个重启。您必须等待所有节点更新完成。通过输入以下命令检查机器配置池状态:

    $ oc get machineconfigpools

    成功更新的节点具有以下状态:UPDATED=trueUPDATING=falseDEGRADED=false

验证
  1. 要获取集群网络的当前 MTU,请输入以下命令:

    $ oc describe network.config cluster
  2. 获取节点主网络接口的当前 MTU

    1. 要列出集群中的节点,请输入以下命令:

      $ oc get nodes
    2. 要获取节点上主网络接口的当前 MTU 设置,请输入以下命令:

      $ oc debug node/<node> -- chroot /host ip address show <interface>

      其中

      <node>

      指定上一步输出中的一个节点。

      <interface>

      指定节点的主网络接口名称。

      示例输出
      ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8051