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

NSX-OVS は最新のカーネル バージョンではサポートされていないため、カーネルを最新バージョンにアップグレードする前に、NSX-OVS カーネル モジュールをアップストリーム OVS カーネル モジュールに切り替えることができます。カーネルのアップグレード後に NCP が最新のカーネルで動作しない場合は、ロールバック(NSX-OVS に切り替えてカーネルをダウングレード)を実行できます。
次の最初の手順では、カーネルをアップグレードするときに NSX-OVS カーネル モジュールをアップストリーム OVS カーネル モジュールに切り替える方法について説明します。2 番目の手順では、カーネルをダウングレードするときに NSX-OVS カーネル モジュールに切り替える方法について説明します。
どちらの手順にも、Kubernetes の概念である
taints
tolerations
が含まれます。これらの概念の詳細については、https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-tolerationを参照してください。

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

  1. daemonset.apps/nsx-ncp-bootstrap
    daemonset.apps/nsx-node-agent
    の両方の
    tolerations
    を変更します。次の行を見つけます:
    - effect: NoExecute operator: Exists
    これを次のように変更します:
    - effect: NoExecute key: evict-user-pods
  2. nsx-node-agent configmap を変更します。
    use_nsx_ovs_kernel_module
    False
    に変更します。
  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.ko
      vport-gre.ko
      vport-lisp.ko
      vport-stt.ko
      vport-vxlan.ko
      openvswitch.ko
      を削除します。
    2. /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
      ディレクトリに移動します。
    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-bootstrap
    daemonset.apps/nsx-node-agent
    の両方の
    tolerations
    を変更します。次の行を見つけます:
    - effect: NoExecute operator: Exists
    これを次のように変更します:
    - effect: NoExecute key: evict-user-pods
  2. nsx-node-agent configmap を変更します。
    use_nsx_ovs_kernel_module
    True
    に変更します。
  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
    をリカバリします。