因为最新内核版本不支持 NSX-OVS,所以您可以在将内核升级到最新版本之前,将 NSX-OVS 内核模块切换到上游 OVS 内核模块。如果在内核升级后 NCP 无法与最新的内核配合使用,您可以执行回滚(切换回 NSX-OVS 并对内核执行降级)。
下面第一个过程介绍了升级内核后如何将 NSX-OVS 内核模块切换到上游 OVS 内核模块。第二个过程介绍了对内核执行降级后如何切换回 NSX-OVS 内核模块。
这两个过程都涉及 Kubernetes 概念 taints 和 tolerations。有关这些概念的详细信息,请参见 https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration。
切换到上游 OVS 内核模块
- 同时修改 daemonset.apps/nsx-ncp-bootstrap 和 daemonset.apps/nsx-node-agent 的 tolerations 内容。将以下内容:
- effect: NoExecute operator: Exists
更改为:- effect: NoExecute key: evict-user-pods
- 修改 nsx-node-agent configmap。将 use_nsx_ovs_kernel_module 更改为
False
。 - 运行 Taint worker-node1 "evict-user-pods:NoExecute" 以将此节点中的所有用户 pod 驱逐到其他节点:
kubectl taint nodes worker-node1 evict-user-pods:NoExecute
- 运行 Taint worker-node1 "evict-ncp-pods:NoExecute" 以将此节点中的 nsx-node-agent 和 nsx-ncp-bootstrap pod 驱逐到其他节点:
kubectl taint nodes worker-node1 evict-ncp-pods:NoExecute
- 卸载 ovs-kernel 模块,并在 worker-node1 上还原上游 OVS 内核模块。
- 删除目录 /lib/modules/$(uname -r)/weak-updates/openvswitch 下的 kmod 文件 vport-geneve.ko、vport-gre.ko、vport-lisp.ko、vport-stt.ko、vport-vxlan.ko 和 openvswitch.ko。
- 如果目录 /lib/modules/$(uname -r)/nsx/usr-ovs-kmod-backup 中存在 vport-geneve.ko、vport-gre.ko、vport-lisp.ko、vport-stt.ko、vport-vxlan.ko、openvswitch.ko 文件,请将它们移动到目录 /lib/modules/$(uname -r)/weak-updates/openvswitch。
- 删除目录 /lib/modules/$(uname -r)/nsx。
- 将 worker-node1 的内核升级到最新版本,然后重新引导。
注意:如果 containerd 和 kubelet 无法运行,请在 worker-node1 上将 SELinux 设置为允许模式。
- 重新启动 kubelet。
- 从 worker-node1 中移除 taint "evict-ncp-pods:NoExecute"。确认引导和节点代理可以启动。
- 从 worker-node1 中移除 taint "evict-user-pods:NoExecute"。确认此节点中的所有 pod 都在运行。
- 对其他节点重复步骤 3-9。
- 恢复步骤 1 中 nsx-ncp-bootstrap 和 nsx-node-agent DaemonSets 的 tolerations 内容。
切换回 NSX-OVS 内核模块
- 同时修改 daemonset.apps/nsx-ncp-bootstrap 和 daemonset.apps/nsx-node-agent 的 tolerations 内容。将以下内容:
- effect: NoExecute operator: Exists
更改为:- effect: NoExecute key: evict-user-pods
- 修改 nsx-node-agent configmap。将 use_nsx_ovs_kernel_module 更改为
True
。 - 运行 Taint worker-node1 "evict-user-pods:NoExecute" 以将此节点中的所有用户 pod 驱逐到其他节点:
kubectl taint nodes worker-node1 evict-user-pods:NoExecute
- 运行 Taint worker-node1 "evict-ncp-pods:NoExecute" 以将此节点中的 nsx-node-agent 和 nsx-ncp-bootstrap pod 驱逐到其他节点:
kubectl taint nodes worker-node1 evict-ncp-pods:NoExecute
- 将 worker-node1 的内核降级到受支持的版本,然后重新引导。
注意:如果 containerd 和 kubelet 无法运行,请在 worker-node1 上将 SELinux 设置为允许模式。
- 重新启动 kubelet。
- 从 worker-node1 中移除 taint "evict-ncp-pods:NoExecute"。确认引导和节点代理可以启动。
- 从 worker-node1 中移除 taint "evict-user-pods:NoExecute"。确认此节点中的所有 pod 都在运行。
- 对其他节点重复步骤 3-8。
- 恢复步骤 1 中 nsx-ncp-bootstrap 和 nsx-node-agent DaemonSets 的 tolerations 内容。