NSX-OVS は最新のカーネル バージョンではサポートされていないため、カーネルを最新バージョンにアップグレードする前に、NSX-OVS カーネル モジュールをアップストリーム OVS カーネル モジュールに切り替えることができます。カーネルのアップグレード後に NCP が最新のカーネルで動作しない場合は、ロールバック(NSX-OVS に切り替えてカーネルをダウングレード)を実行できます。

次の最初の手順では、カーネルをアップグレードするときに NSX-OVS カーネル モジュールをアップストリーム OVS カーネル モジュールに切り替える方法について説明します。2 番目の手順では、カーネルをダウングレードするときに NSX-OVS カーネル モジュールに切り替える方法について説明します。

どちらの手順にも、Kubernetes の概念である taintstolerations が含まれます。これらの概念の詳細については、https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-tolerationを参照してください。

アップストリーム OVS カーネル モジュールへの切り替え

  1. daemonset.apps/nsx-ncp-bootstrapdaemonset.apps/nsx-node-agent の両方の tolerations を変更します。次の行を見つけます:
          - effect: NoExecute
            operator: Exists
    これを次のように変更します:
          - effect: NoExecute
            key: evict-user-pods
  2. nsx-node-agent configmap を変更します。use_nsx_ovs_kernel_moduleFalse に変更します。
  3. worker-node1 に "evict-user-pods:NoExecute" の Taint を付与し、このノードのすべてのユーザー ポッドを他のノードに退避させます。
    kubectl taint nodes worker-node1 evict-user-pods:NoExecute
  4. worker-node1 に "evict-ncp-pods:NoExecute" の Taint を付与し、このノードの nsx-node-agent および nsx-ncp-bootstrap ポッドを他のノードに退避させます。
    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 を Permissive モードに設定します。

  7. kubelet を再起動します。
  8. worker-node1 から "evict-ncp-pods:NoExecute" の taint を削除します。bootstrap と node-agent が起動できることを確認します。
  9. worker-node1 から "evict-user-pods:NoExecute" の taint を削除します。このノードのすべてのポッドが実行されていることを確認します。
  10. 他のノードに対して手順 3 ~ 9 を繰り返します。
  11. 手順 1 で nsx-ncp-bootstrap と nsx-node-agent DaemonSet の両方の tolerations をリカバリします。

NSX-OVS カーネル モジュールに切り替えます。

  1. daemonset.apps/nsx-ncp-bootstrapdaemonset.apps/nsx-node-agent の両方の tolerations を変更します。次の行を見つけます:
          - effect: NoExecute
            operator: Exists
    これを次のように変更します:
          - effect: NoExecute
            key: evict-user-pods
  2. nsx-node-agent configmap を変更します。use_nsx_ovs_kernel_moduleTrue に変更します。
  3. worker-node1 に "evict-user-pods:NoExecute" の Taint を付与し、このノードのすべてのユーザー ポッドを他のノードに退避させます。
    kubectl taint nodes worker-node1 evict-user-pods:NoExecute
  4. worker-node1 に "evict-ncp-pods:NoExecute" の Taint を付与し、このノードの nsx-node-agent および nsx-ncp-bootstrap ポッドを他のノードに退避させます。
    kubectl taint nodes worker-node1 evict-ncp-pods:NoExecute
  5. worker-node1 のカーネルをサポートされているバージョンにダウングレードし、再起動します。

    注:containerd と kubelet を実行できない場合は、worker-node1 で SELinux を Permissive モードに設定します。

  6. kubelet を再起動します。
  7. worker-node1 から "evict-ncp-pods:NoExecute" の taint を削除します。bootstrap と node-agent が起動できることを確認します。
  8. worker-node1 から "evict-user-pods:NoExecute" の taint を削除します。このノードのすべてのポッドが実行されていることを確認します。
  9. 他のノードに対して手順 3 ~ 8 を繰り返します。
  10. 手順 1 で nsx-ncp-bootstrap と nsx-node-agent DaemonSet の両方の tolerations をリカバリします。