VM向けのKubervirt DPDKデータプレーンサポートの導入
概要 クラウドネイティブのContrail® Networking™ は、Kubernetesの高性能VMおよびコンテナネットワーク向けに、vRouter DPDKデータプレーン(Kubevirt)の導入をサポートします。
Kubevirt の概要
Kubevirt は、仮想マシン ワークロード(VM)と Kubernetes クラスター内のコンテナ ワークロードの管理(スケジューリング)を可能にするオープン ソースの Kubernetes プロジェクトです。Kubevirtは、開発者が共通の共有環境内のアプリケーションコンテナとVMの両方に存在するアプリケーションを構築、変更、導入する統合開発プラットフォームを提供します。Kubevirt は、Kubernetes クラスターに次の追加機能を提供します。
- Kubevirt は、追加のタイプのポッド、カスタム リソース定義(CRD)を Kubernetes API サーバーに追加します。
- 新しいタイプのポッドをサポートするクラスター全体ロジック用の追加コントローラ
- 新しいタイプのポッドをサポートするノード固有ロジック用の追加デーモン
この新しい機能の結果、Kubevirt は VMI(VMI)オブジェクトを作成および管理 VirtualMachineInstance
します。VMIには、(VM)と呼ばれるワークロードコントローラーが VirtualMachine
含まれています。VM は VMI の永続的な状態を維持します。これにより、ユーザーはデータや状態を変更せずに、VMを次回に終了および開始できます。さらに、Kubevirt を Kubernetes クラスタ上に導入して、従来のコンテナ ワークロードと Kubevirt が管理する VM を管理できます。VM は、追加の権限を必要としない Kubernetes クラスタ機能にアクセスできます。
Kubevirt DPDK の実装
Kubevirt は、通常、高速パケット処理のためのユーザー スペース ネットワークをサポートしていません。ただし、クラウドネイティブのContrail Networkingでは、KubevirtがVMのインターフェイスタイプをサポート vhostuser
するための拡張機能を有効にします。これらのインターフェイスは、DPDK vRouter を使用してユーザー スペース ネットワーキングを実行し、DPDK vRouter が提供するパフォーマンスの向上とパケット処理へのアクセスをポッドに提供します。
DPDK vRouter アプリケーションのメリットを以下に示します。
- パケット処理はユーザー 空間で行われ、カーネル スペースをバイパスします。これにより、パケット処理効率が向上します。
- カーネル割り込みおよびコンテキスト スイッチは、パケットがカーネル スペースをバイパスするため発生しません。その結果、CPU のオーバーヘッドが少なくなり、データ スループットが向上します。
- DPDKは、ユーザー空間におけるvRouterの転送プレーンを強化し、パフォーマンスを向上させます。
- DPDK Lcoresは、ポーリングモードで実行されます。これにより、Lcores はパケットを受信した直後にパケットを受信して処理できます。
Kubevirtの導入
前提 条件
Kubevirt を導入するには、アクティブな Kubernetes クラスターとクライアントを kubectl
使用する機能が必要です。
クラウドネイティブのContrail Networking Kubevirt Forkの導入
現在の Kubevirt リリース(v0.48.0)は、インターフェイスを有効にする拡張機能を vhostuser
サポートしていません。ジュニパーは、この DPDK インターフェイスをサポートする Kubevirt フォークを維持しています。このKubervirt forkは、クラウドネイティブのContrail Networkingを実行する環境で使用するためのものです。フォークの変更は、Kubevirt リリース バージョン(v0.40.0)上でコミットされ、fork からバージョン(v.0.40.0-jnpr)としてタグ付け/リリースされます。
Kubevirt オペレーターと Kubevirt CR も fork リポジトリからリリースされます。Kubevirt のオペレータは、Kubevirt のコア コンポーネントのライフサイクルを管理します。Kubevirt オペレーターと CR がクラスター内の仮想化を可能にします。
以下のコマンドを使用して、Kubevirt fork、Kubevirt CR、Kubevirt の各オペレータを導入します。リリース バージョン(v0.40.0)とインストール ファイル パスに注意してください。
export RELEASE=v0.40.0-jnpr kubectl apply -f https://github.com/cijohnson/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml kubectl apply -f https://github.com/cijohnson/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml kubectl -n kubevirt wait kv kubevirt --for condition=Available
クラウドネイティブのContrail Networking Kubevirt fork。
コンテナとともに VM を起動する
Kubevirt を使用すると、Kubernetes で VM を起動および管理することは、ポッドの導入と同様です。を使用して VM オブジェクトを kubectl
作成できます。VM オブジェクトを作成すると、その VM はアクティブで、クラスターで実行されます。
コンテナとともに VM を起動するには、次の大まかな手順を使用します。
- を作成します。
VirtualNetwork
- VM を起動する
VM を起動する
以下 VirtualMachine
の仕様は、インターフェイスの量が異なるインスタンスの例 VirtualMachine
です。
- 単一
vhostuser
インターフェイスVM:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-single-virtio namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-single-virtio app: vm-single-virtio-app spec: nodeSelector: master: master terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=
- マルチ
vhostuser
インターフェイス:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-multi-virtio namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-multi-virtio app: vm-multi-virtio-app spec: nodeSelector: worker: worker terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} - name: vhost-user-vn-green vhostuser: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue - name: vhost-user-vn-green multus: networkName: vn-green volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=
- ブリッジ/
vhostuser
インターフェイスVM:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-virtio-veth namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-virtio-veth app: vm-virtio-veth-app spec: nodeSelector: master: master terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} - name: vhost-user-vn-green bridge: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue - name: vhost-user-vn-green multus: networkName: vn-green volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=
仮想ネットワークの作成
以下 net-attach-def
のオブジェクトは、仮想ネットワークの例です。
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: vn-blue namespace: contrail annotations: juniper.net/networks: '{ "ipamV4Subnet": "19.1.1.0/24" }' labels: vn: vn-blue-vn-green spec: config: '{ "cniVersion": "0.3.1", "name": "nad-blue", "type": "contrail-k8s-cni" }'
VM を起動する
以下 VirtualMachine
の仕様は、インターフェイスの量が異なるインスタンスの例 VirtualMachine
です。
- 単一
vhostuser
インターフェイスVM:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-single-virtio namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-single-virtio app: vm-single-virtio-app spec: nodeSelector: master: master terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=
- マルチ
vhostuser
インターフェイス:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-multi-virtio namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-multi-virtio app: vm-multi-virtio-app spec: nodeSelector: worker: worker terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} - name: vhost-user-vn-green vhostuser: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue - name: vhost-user-vn-green multus: networkName: vn-green volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=
- ブリッジ/
vhostuser
インターフェイスVM:apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata: name: vm-virtio-veth namespace: contrail spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-virtio-veth app: vm-virtio-veth-app spec: nodeSelector: master: master terminationGracePeriodSeconds: 30 domain: cpu: sockets: 1 cores: 8 threads: 2 #dedicatedCpuPlacement: true memory: hugepages: pageSize: "2Mi" resources: requests: memory: "512Mi" devices: disks: - name: containerdisk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default bridge: {} - name: vhost-user-vn-blue vhostuser: {} - name: vhost-user-vn-green bridge: {} useVirtioTransitional: true networks: - name: default pod: {} - name: vhost-user-vn-blue multus: networkName: vn-blue - name: vhost-user-vn-green multus: networkName: vn-green volumes: - name: containerdisk containerDisk: image: svl-artifactory.juniper.net/atom-docker/dpdk-pktgen/vmdisks/dpdk-pktgen-auto:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4=