因为最新内核版本不支持 NSX-OVS,所以您可以在将内核升级到最新版本之前,将 NSX-OVS 内核模块切换到上游 OVS 内核模块。如果在内核升级后 NCP 无法与最新的内核配合使用,您可以执行回滚(切换回 NSX-OVS 并对内核执行降级)。

下面第一个过程介绍了升级内核后如何将 NSX-OVS 内核模块切换到上游 OVS 内核模块。第二个过程介绍了对内核执行降级后如何切换回 NSX-OVS 内核模块。

这两个过程都涉及 Kubernetes 概念 taintstolerations。有关这些概念的详细信息,请参见 https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration

切换到上游 OVS 内核模块

  1. 同时修改 daemonset.apps/nsx-ncp-bootstrapdaemonset.apps/nsx-node-agenttolerations 内容。将以下内容:
          - effect: NoExecute
            operator: Exists
    更改为:
          - effect: NoExecute
            key: evict-user-pods
  2. 修改 nsx-node-agent configmap。将 use_nsx_ovs_kernel_module 更改为 False
  3. 运行 Taint worker-node1 "evict-user-pods:NoExecute" 以将此节点中的所有用户 pod 驱逐到其他节点:
    kubectl taint nodes worker-node1 evict-user-pods:NoExecute
  4. 运行 Taint worker-node1 "evict-ncp-pods:NoExecute" 以将此节点中的 nsx-node-agent 和 nsx-ncp-bootstrap pod 驱逐到其他节点:
    kubectl taint nodes worker-node1 evict-ncp-pods:NoExecute
  5. 卸载 ovs-kernel 模块,并在 worker-node1 上还原上游 OVS 内核模块。
    1. 删除目录 /lib/modules/$(uname -r)/weak-updates/openvswitch 下的 kmod 文件 vport-geneve.kovport-gre.kovport-lisp.kovport-stt.kovport-vxlan.koopenvswitch.ko
    2. 如果目录 /lib/modules/$(uname -r)/nsx/usr-ovs-kmod-backup 中存在 vport-geneve.kovport-gre.kovport-lisp.kovport-stt.kovport-vxlan.koopenvswitch.ko 文件,请将它们移动到目录 /lib/modules/$(uname -r)/weak-updates/openvswitch
    3. 删除目录 /lib/modules/$(uname -r)/nsx
  6. 将 worker-node1 的内核升级到最新版本,然后重新引导。

    注意:如果 containerd 和 kubelet 无法运行,请在 worker-node1 上将 SELinux 设置为允许模式。

  7. 重新启动 kubelet。
  8. 从 worker-node1 中移除 taint "evict-ncp-pods:NoExecute"。确认引导和节点代理可以启动。
  9. 从 worker-node1 中移除 taint "evict-user-pods:NoExecute"。确认此节点中的所有 pod 都在运行。
  10. 对其他节点重复步骤 3-9。
  11. 恢复步骤 1 中 nsx-ncp-bootstrap 和 nsx-node-agent DaemonSets 的 tolerations 内容。

切换回 NSX-OVS 内核模块

  1. 同时修改 daemonset.apps/nsx-ncp-bootstrapdaemonset.apps/nsx-node-agenttolerations 内容。将以下内容:
          - effect: NoExecute
            operator: Exists
    更改为:
          - effect: NoExecute
            key: evict-user-pods
  2. 修改 nsx-node-agent configmap。将 use_nsx_ovs_kernel_module 更改为 True
  3. 运行 Taint worker-node1 "evict-user-pods:NoExecute" 以将此节点中的所有用户 pod 驱逐到其他节点:
    kubectl taint nodes worker-node1 evict-user-pods:NoExecute
  4. 运行 Taint worker-node1 "evict-ncp-pods:NoExecute" 以将此节点中的 nsx-node-agent 和 nsx-ncp-bootstrap pod 驱逐到其他节点:
    kubectl taint nodes worker-node1 evict-ncp-pods:NoExecute
  5. 将 worker-node1 的内核降级到受支持的版本,然后重新引导。

    注意:如果 containerd 和 kubelet 无法运行,请在 worker-node1 上将 SELinux 设置为允许模式。

  6. 重新启动 kubelet。
  7. 从 worker-node1 中移除 taint "evict-ncp-pods:NoExecute"。确认引导和节点代理可以启动。
  8. 从 worker-node1 中移除 taint "evict-user-pods:NoExecute"。确认此节点中的所有 pod 都在运行。
  9. 对其他节点重复步骤 3-8。
  10. 恢复步骤 1 中 nsx-ncp-bootstrap 和 nsx-node-agent DaemonSets 的 tolerations 内容。