配置 MTU

在 Kube-OVN 中,MTU(最大传输单元)设置对于确保网络性能的最佳状态和避免数据包分片至关重要。
MTU 定义了网络中可传输数据包的最大尺寸。

默认情况下,Kube-OVN 会检测底层物理网络接口的 MTU,并相应地为虚拟网络接口设置 MTU。
但是,在某些场景下,您可能需要为 Kube-OVN 的网络组件自定义 MTU 设置。

默认 MTU 行为

Kube-OVN 会自动检测主机物理网络接口的 MTU,
并相应地为 Pod 和 OVS 接口设置 MTU。

在覆盖网络中,Kube-OVN 会降低 MTU 以适应 VXLAN 或 Geneve 封装的开销。
MTU 的计算方式如下:

封装类型隧道 IP 版本MTU 计算方式
GeneveIPv4物理网络接口 MTU - 100
IPv6物理网络接口 MTU - 120
VXLANIPv4物理网络接口 MTU - 50
IPv6物理网络接口 MTU - 70

在底层网络中,MTU 设置为与物理网络接口 MTU 相同。

自定义 MTU 设置

MTU 设置可以针对覆盖网络进行全局自定义,也可以针对单个子网进行配置。

WARNING

错误调整 MTU 设置可能导致网络性能问题,
包括数据包丢失和分片。请确保 MTU 设置与您的底层网络基础设施兼容后再进行更改。

重要注意事项:增加 MTU 时

当将 MTU 从较小值增加到较大值时,必须重启所有 Pod,以确保新 MTU 在整个集群中统一生效。

为什么需要这样做?

OVS 内部端口(如 ovn0)会自动采用连接到 br-int 桥的所有接口中 最小的 MTU 作为自身 MTU。该行为会导致以下问题:

  1. 您为新创建的 Pod 配置了更大的 MTU
  2. 部分已有 Pod 仍使用原先较小的 MTU
  3. 由于最小 MTU 规则,ovn0 接口保持较小的 MTU
  4. 来自较大 MTU Pod 的流量在数据包超过 ovn0 MTU 时被丢弃

解决方案: 在增加 MTU 设置后,重新创建所有 Pod,确保整个网络路径的 MTU 配置一致。

NOTE

MTU 配置更改仅对新创建的 Pod 生效。
已有 Pod 会保留原有 MTU 设置,直到它们被重新创建。
建议在更改 MTU 设置时规划 Pod 重启。

全局 MTU 配置

要为覆盖网络设置全局 MTU,可以修改 kube-ovn-cni DaemonSet 的命令参数。
例如,设置全局 MTU 为 1400,可以按如下方式更新 DaemonSet:

kubectl -n kube-system edit ds kube-ovn-cni

然后,在容器参数中添加或更新 --mtu=1400

apiVersion: apps/v1
kind: DaemonSet
metadata:
    kubernetes.io/description: |
      This daemon set launches the kube-ovn cni daemon.
  name: kube-ovn-cni
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: kube-ovn-cni
  template:
    metadata:
      labels:
        app: kube-ovn-cni
        component: network
        type: infra
    spec:
      containers:
      - name: cni-server
        args:
        - --mtu=1400
NOTE

全局 MTU 设置仅影响覆盖网络。对于底层网络,
MTU 默认保持与物理网络接口 MTU 一致。

按子网配置 MTU

您也可以通过在子网配置中指定 mtu 字段,为单个子网设置 MTU。
例如,将某个子网的 MTU 设置为 1450,可以使用以下命令:

kubectl patch subnet my-subnet --type merge -p '{"spec": {"mtu": 1450}}'

该设置会覆盖该子网的全局 MTU 配置。