配置 MTU

在 Kube-OVN 中,MTU(Maximum Transmission Unit,最大传输单元)设置对于确保最佳网络性能并避免数据包分片至关重要。 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. 当数据包超过 ovn0 的 MTU 时,使用更大 MTU 的 Pod 发出的流量会被丢弃

解决方案: 在提高 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 设置。