Update documentation for Kubevirt
Add Usage Examples sections. Create KubeVirt Architecture section. Fix minor editorial issues. Fix grammar and formatting issues. Story: 2010931 Task: 50286 Change-Id: I6118d0af848d07f3764eeae5ea8467864c65fceb Signed-off-by: Elisamara Aoki Goncalves <elisamaraaoki.goncalves@windriver.com>
This commit is contained in:
parent
8dd6c00569
commit
1f91cd1ee0
@ -445,7 +445,7 @@
|
|||||||
.. |applying-a-custom-branding-tarball-to-running-systems| replace:: :ref:`Apply a Custom Horizon Branding Tarball to Running Systems <applying-a-custom-branding-tarball-to-running-systems>`
|
.. |applying-a-custom-branding-tarball-to-running-systems| replace:: :ref:`Apply a Custom Horizon Branding Tarball to Running Systems <applying-a-custom-branding-tarball-to-running-systems>`
|
||||||
.. |release-notes| replace:: :ref:`R10.0 Release Notes <release-notes>`
|
.. |release-notes| replace:: :ref:`R10.0 Release Notes <release-notes>`
|
||||||
.. |create-an-ubuntu-vm-fafb82ec424b| replace:: :ref:`Create an Ubuntu VM <create-an-ubuntu-vm-fafb82ec424b>`
|
.. |create-an-ubuntu-vm-fafb82ec424b| replace:: :ref:`Create an Ubuntu VM <create-an-ubuntu-vm-fafb82ec424b>`
|
||||||
.. |removal-97cc897941bc| replace:: :ref:`Removal <removal-97cc897941bc>`
|
.. |kubevirt-removal-97cc897941bc| replace:: :ref:`Removal <kubevirt-removal-97cc897941bc>`
|
||||||
.. |hello-world-kubevirt-vm-05503659173c| replace:: :ref:`Hello World KubeVirt VM <hello-world-kubevirt-vm-05503659173c>`
|
.. |hello-world-kubevirt-vm-05503659173c| replace:: :ref:`Hello World KubeVirt VM <hello-world-kubevirt-vm-05503659173c>`
|
||||||
.. |index-kubevirt-f1bfd2a21152| replace:: :ref:`KubeVirt <index-kubevirt-f1bfd2a21152>`
|
.. |index-kubevirt-f1bfd2a21152| replace:: :ref:`KubeVirt <index-kubevirt-f1bfd2a21152>`
|
||||||
.. |set-up-cdi-proxy-ad165d884417| replace:: :ref:`Set up CDI Proxy <set-up-cdi-proxy-ad165d884417>`
|
.. |set-up-cdi-proxy-ad165d884417| replace:: :ref:`Set up CDI Proxy <set-up-cdi-proxy-ad165d884417>`
|
||||||
|
@ -0,0 +1,102 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _configuration-as-filesystem-0a5023c8386e:
|
||||||
|
|
||||||
|
===========================
|
||||||
|
Configuration as Filesystem
|
||||||
|
===========================
|
||||||
|
|
||||||
|
By using filesystem, ``configMaps`` are shared through ``virtiofs``. In
|
||||||
|
contrast with using disks for sharing ``configMaps``, filesystem allows you to
|
||||||
|
dynamically propagate changes on ``configMaps`` to |VMIs| (i.e. the VM does not
|
||||||
|
need to be rebooted).
|
||||||
|
|
||||||
|
.. rubric:: Limitation
|
||||||
|
|
||||||
|
Currently, |VMIs| cannot be live migrated since ``virtiofs`` does not support
|
||||||
|
live migration.
|
||||||
|
|
||||||
|
Example of ``configMap``:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: app-config
|
||||||
|
data:
|
||||||
|
DATABASE: staging
|
||||||
|
USERNAME: admin
|
||||||
|
PASSWORD: secret
|
||||||
|
|
||||||
|
Example of VM using ``configMap`` as a filesystem:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-fedora
|
||||||
|
name: vmi-fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
devices:
|
||||||
|
filesystems:
|
||||||
|
- name: config-fs
|
||||||
|
virtiofs: {}
|
||||||
|
disks:
|
||||||
|
- disk:
|
||||||
|
bus: virtio
|
||||||
|
name: containerdisk
|
||||||
|
machine:
|
||||||
|
type: ""
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
terminationGracePeriodSeconds: 0
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: quay.io/containerdisks/fedora:latest
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
expire: false
|
||||||
|
password: fedora
|
||||||
|
user: fedora
|
||||||
|
bootcmd:
|
||||||
|
# mount the ConfigMap
|
||||||
|
- "sudo mkdir /mnt/app-config"
|
||||||
|
- "sudo mount -t virtiofs config-fs /mnt/app-config"
|
||||||
|
name: cloudinitdisk
|
||||||
|
- configMap:
|
||||||
|
name: app-config
|
||||||
|
name: config-fs
|
||||||
|
|
||||||
|
To login and verify the VM run:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
[fedora@vmi-fedora ~]$ df -h
|
||||||
|
Filesystem Size Used Avail Use% Mounted on
|
||||||
|
/dev/vda5 4.0G 461M 3.1G 13% /
|
||||||
|
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||||
|
tmpfs 450M 0 450M 0% /dev/shm
|
||||||
|
tmpfs 180M 720K 179M 1% /run
|
||||||
|
tmpfs 450M 0 450M 0% /tmp
|
||||||
|
/dev/vda2 966M 61M 840M 7% /boot
|
||||||
|
/dev/vda3 100M 12M 89M 12% /boot/efi
|
||||||
|
/dev/vda5 4.0G 461M 3.1G 13% /home
|
||||||
|
config-fs 9.8G 910M 8.4G 10% /mnt/app-config
|
||||||
|
tmpfs 90M 4.0K 90M 1% /run/user/1000
|
||||||
|
[fedora@vmi-fedora ~]$ ls -lrth /mnt/app-config
|
||||||
|
total 0
|
||||||
|
lrwxrwxrwx. 1 root 107 15 Jan 15 16:20 USERNAME -> ..data/USERNAME
|
||||||
|
lrwxrwxrwx. 1 root 107 15 Jan 15 16:20 PASSWORD -> ..data/PASSWORD
|
||||||
|
lrwxrwxrwx. 1 root 107 15 Jan 15 16:20 DATABASE -> ..data/DATABASE
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
doc/source/kube-virt/figures/kubevirt-architecture.png
Normal file
BIN
doc/source/kube-virt/figures/kubevirt-architecture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
BIN
doc/source/kube-virt/figures/kubrvirt-simplified-diagram.png
Normal file
BIN
doc/source/kube-virt/figures/kubrvirt-simplified-diagram.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
85
doc/source/kube-virt/host-device-assignment-a6feb2f0c3bc.rst
Normal file
85
doc/source/kube-virt/host-device-assignment-a6feb2f0c3bc.rst
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _host-device-assignment-a6feb2f0c3bc:
|
||||||
|
|
||||||
|
======================
|
||||||
|
Host Device Assignment
|
||||||
|
======================
|
||||||
|
|
||||||
|
KubeVirt provides a mechanism for assigning host devices to a virtual machine.
|
||||||
|
This mechanism is generic and allows various types of |PCI| devices, such as
|
||||||
|
accelerators (including GPUs) or any other devices attached to a |PCI| bus,
|
||||||
|
to be assigned. It also allows Linux Mediated devices, such as pre-configured
|
||||||
|
virtual GPUs to be assigned using the same mechanism.
|
||||||
|
|
||||||
|
|
||||||
|
Preparation of Mediated Devices such as vGPU
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
In general, configuration of Mediated devices (mdevs), such as |vGPUs|, should
|
||||||
|
be done according to vendor directions. KubeVirt can now facilitate the
|
||||||
|
creation of the Mediated devices/|vGPUs| on the cluster nodes. This assumes
|
||||||
|
that the required vendor driver is already installed on the nodes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
List Permitted Devices
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Administrators can control which host devices are exposed and permitted to be
|
||||||
|
used in the cluster. Permitted host devices in the cluster will need to be
|
||||||
|
listed in KubeVirt Custom Resource (CR) by its vendor:product selector for
|
||||||
|
|PCI| devices or Mediated device names. See the example yaml segment below,
|
||||||
|
that would be added to the KubeVirt CR with ``kubectl edit kubevirt -n
|
||||||
|
kubevirt``.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
permittedHostDevices:
|
||||||
|
pciHostDevices:
|
||||||
|
- pciVendorSelector: "10DE:1EB8"
|
||||||
|
resourceName: "nvidia.com/TU104GL_Tesla_T4"
|
||||||
|
externalResourceProvider: true
|
||||||
|
- pciVendorSelector: "8086:6F54"
|
||||||
|
resourceName: "intel.com/qat"
|
||||||
|
mediatedDevices:
|
||||||
|
- mdevNameSelector: "GRID T4-1Q"
|
||||||
|
resourceName: "nvidia.com/GRID_T4-1Q"
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
``pciVendorSelector`` is a |PCI| vendor ID and product ID tuple in the form
|
||||||
|
``vendor_id:product_id``. This tuple can identify specific types of devices
|
||||||
|
on a host. For example, the identifier ``10de:1eb8``, shown above, can be
|
||||||
|
found using ``lspci``.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ lspci -nnv|grep -i nvidia
|
||||||
|
65:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8] (rev a1)
|
||||||
|
|
||||||
|
|
||||||
|
Start VM Using vGPU
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Host devices can be assigned to VMs via the ``gpus`` and ``hostDevices``
|
||||||
|
fields. The ``deviceNames`` can reference both |PCI| and Mediated device
|
||||||
|
resource names.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
devices:
|
||||||
|
gpus:
|
||||||
|
- deviceName: nvidia.com/TU104GL_Tesla_T4
|
||||||
|
name: gpu1
|
||||||
|
- deviceName: nvidia.com/GRID_T4-1Q
|
||||||
|
name: gpu2
|
||||||
|
hostDevices:
|
||||||
|
- deviceName: intel.com/qat
|
||||||
|
NAME: QUICKACCESS1
|
@ -10,8 +10,9 @@ KubeVirt
|
|||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
introduction-bb3a04279bf5
|
introduction-bb3a04279bf5
|
||||||
|
kubevirt-architecture-c92c8908e775
|
||||||
installation-66477d7646db
|
installation-66477d7646db
|
||||||
removal-97cc897941bc
|
kubevirt-removal-97cc897941bc
|
||||||
|
|
||||||
Usage Examples
|
Usage Examples
|
||||||
==============
|
==============
|
||||||
@ -21,6 +22,20 @@ Usage Examples
|
|||||||
|
|
||||||
hello-world-kubevirt-vm-05503659173c
|
hello-world-kubevirt-vm-05503659173c
|
||||||
set-up-cdi-proxy-ad165d884417
|
set-up-cdi-proxy-ad165d884417
|
||||||
|
virtual-machine-dd561f6db3fd
|
||||||
|
use-shared-resource-cpu-ad295227aa0c
|
||||||
|
live-migration-support-for-vms-bea635bacc50
|
||||||
|
interface-and-networks-7cadb7bdb80b
|
||||||
|
startup-scripts-6402154a6f37
|
||||||
|
persistent-storage-for-vms-8ddc8fa611aa
|
||||||
|
host-device-assignment-a6feb2f0c3bc
|
||||||
|
vm-snapshot-and-restore-21158b60cd56
|
||||||
|
virtualmachineinstancereplicaset-8518d55de52b
|
||||||
|
static-ip-assignment-via-cloudinit-configuration-d053375e78fa
|
||||||
|
configuration-as-filesystem-0a5023c8386e
|
||||||
|
vm-using-secret-as-startup-configuration-4a8255e26b1f
|
||||||
|
vm-using-service-account-as-filesystem-5fd4deb7339a
|
||||||
|
node-assignment-using-nodeselector-affinity-and-antiminusaffi-06ad222ceb13
|
||||||
create-an-ubuntu-vm-fafb82ec424b
|
create-an-ubuntu-vm-fafb82ec424b
|
||||||
set-up-remote-management-of-vms-a082461d660e
|
set-up-remote-management-of-vms-a082461d660e
|
||||||
create-a-windows-vm-82957181df02
|
create-a-windows-vm-82957181df02
|
||||||
|
@ -1,69 +1,161 @@
|
|||||||
.. _installation-66477d7646db:
|
.. _installation-66477d7646db:
|
||||||
|
|
||||||
============
|
=====================
|
||||||
Installation
|
KubeVirt Installation
|
||||||
============
|
=====================
|
||||||
|
|
||||||
|
.. rubric:: |prereq|
|
||||||
|
|
||||||
|
- |prod| is up and running.
|
||||||
|
|
||||||
|
- System is Alarm free.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ fm alarm-list
|
||||||
|
|
||||||
.. rubric:: |proc|
|
.. rubric:: |proc|
|
||||||
|
|
||||||
Complete the following steps to install KubeVirt.
|
Complete the following steps to install KubeVirt.
|
||||||
|
|
||||||
#. Upload the KubeVirt system application tarball and check the KubeVirt
|
#. Upload and apply the KubeVirt package (Helm).
|
||||||
application status:
|
|
||||||
|
|
||||||
.. only:: starlingx
|
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
~(keystone_admin)$ system application-upload /usr/local/share/applications/helm/kubevirt-app-<version>.tgz
|
# system application-upload /usr/local/share/applications/helm/kubevirt-app-1.0-17.tgz
|
||||||
|
# system application-apply kubevirt-app
|
||||||
|
# system application-show kubevirt-app
|
||||||
|
# system application-list
|
||||||
|
|
||||||
~(keystone_admin)$ system application-list
|
#. Check all the objects are up and running.
|
||||||
|
|
||||||
.. only:: partner
|
|
||||||
|
|
||||||
.. include:: /_includes/installation-66477d7646db.rest
|
|
||||||
:start-after: kubevirt-app-version
|
|
||||||
:end-before: kubevirt-app-version
|
|
||||||
|
|
||||||
#. Apply the KubeVirt system application and check the KubeVirt and |CDI|
|
|
||||||
status:
|
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
~(keystone_admin)$ system application-apply kubevirt-app
|
# kubectl get all -n cdi
|
||||||
|
# kubectl get all -n kubevirt
|
||||||
|
|
||||||
Wait for kubevirt-app status to complete.
|
.. note::
|
||||||
|
|
||||||
.. code-block:: bash
|
When installing the containerized KubeVirt application, the virtctl
|
||||||
|
client is installed on the host. You can test the client by running
|
||||||
|
virtctl in an SSH / Local Console shell of the controller.
|
||||||
|
|
||||||
$ watch -n 5 system application-list
|
#. Optionally, Install noVNC in order to access a VM's graphical console thru a
|
||||||
|
browser.
|
||||||
|
|
||||||
# Wait for all pods in kubevirt namespace to be Running
|
.. note::
|
||||||
$ watch -n 5 kubectl get pods -n kubevirt
|
|
||||||
|
|
||||||
# Wait for all pods in cdi namespace to be Running
|
noVNC is used to access a VM's graphical console in a browser, where
|
||||||
$ watch -n 5 kubectl get pods -n cdi
|
virtctl provides access to the VM's serial console.
|
||||||
|
|
||||||
#. Setup 'virtctl' client executable to be accessible from sysadmin's PATH
|
Create and apply ``vnc-install.yaml``.
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: yaml
|
||||||
|
|
||||||
# Create /home/sysadmin/bin directory, if it doesn't exist already
|
apiVersion: v1
|
||||||
$ mkdir -p /home/sysadmin/bin
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: virtvnc
|
||||||
|
namespace: kubevirt
|
||||||
|
---
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: virtvnc
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: virtvnc
|
||||||
|
namespace: kubevirt
|
||||||
|
roleRef:
|
||||||
|
kind: ClusterRole
|
||||||
|
name: virtvnc
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
---
|
||||||
|
kind: ClusterRole
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: virtvnc
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- subresources.kubevirt.io
|
||||||
|
resources:
|
||||||
|
- virtualmachineinstances/console
|
||||||
|
- virtualmachineinstances/vnc
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- apiGroups:
|
||||||
|
- kubevirt.io
|
||||||
|
resources:
|
||||||
|
- virtualmachines
|
||||||
|
- virtualmachineinstances
|
||||||
|
- virtualmachineinstancepresets
|
||||||
|
- virtualmachineinstancereplicasets
|
||||||
|
- virtualmachineinstancemigrations
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- watch
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: virtvnc
|
||||||
|
name: virtvnc
|
||||||
|
namespace: kubevirt
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 8001
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 8001
|
||||||
|
nodePort: 31002
|
||||||
|
selector:
|
||||||
|
app: virtvnc
|
||||||
|
type: NodePort
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: virtvnc
|
||||||
|
namespace: kubevirt
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: virtvnc
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: virtvnc
|
||||||
|
spec:
|
||||||
|
serviceAccountName: virtvnc
|
||||||
|
nodeSelector:
|
||||||
|
node-role.kubernetes.io/master: ''
|
||||||
|
tolerations:
|
||||||
|
- key: "node-role.kubernetes.io/master"
|
||||||
|
operator: "Equal"
|
||||||
|
value: ""
|
||||||
|
effect: "NoSchedule"
|
||||||
|
containers:
|
||||||
|
- name: virtvnc
|
||||||
|
image: quay.io/samblade/virtvnc:latest
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
port: 8001
|
||||||
|
path: /
|
||||||
|
scheme: HTTP
|
||||||
|
failureThreshold: 30
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 5
|
||||||
|
|
||||||
# Create symbolic link in /home/sysadmin/bin to virtctl client executable installed on host in step 2)
|
|
||||||
$ cd /home/sysadmin/bin
|
|
||||||
$ ln -s /var/opt/kubevirt/virtctl-v0.53.1-linux-amd64 virtctl
|
|
||||||
|
|
||||||
# Logout and log back in to ensure that /home/sysadmin/bin gets added to your PATH variable.
|
.. code-block:: none
|
||||||
$ exit
|
|
||||||
|
|
||||||
login: sysadmin
|
kubectl apply -f vnc-install.yaml
|
||||||
password:
|
|
||||||
|
|
||||||
$ which virtctl
|
|
||||||
/home/sysadmin/bin/virtctl
|
|
||||||
|
|
||||||
|
To access the VNC: http://<OAM FLOATING IP>:31002
|
||||||
|
|
||||||
.. rubric:: |result|
|
.. rubric:: |result|
|
||||||
|
|
||||||
|
321
doc/source/kube-virt/interface-and-networks-7cadb7bdb80b.rst
Normal file
321
doc/source/kube-virt/interface-and-networks-7cadb7bdb80b.rst
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _interface-and-networks-7cadb7bdb80b:
|
||||||
|
|
||||||
|
======================
|
||||||
|
Interface and Networks
|
||||||
|
======================
|
||||||
|
|
||||||
|
Connecting a |VM| to a network consists of two parts. First, networks are
|
||||||
|
specified in ``spec.networks``. Then, interfaces backed by the networks are
|
||||||
|
added to the VM by specifying them in ``spec.domain.devices.interfaces``.
|
||||||
|
|
||||||
|
Each interface must have a corresponding network with the same name.
|
||||||
|
|
||||||
|
An interface defines a virtual network interface of a virtual machine (also
|
||||||
|
called a frontend). A network specifies the backend of an interface and
|
||||||
|
declares which logical or physical device it is connected to (also called as
|
||||||
|
backend).
|
||||||
|
|
||||||
|
|
||||||
|
MacVTap
|
||||||
|
-------
|
||||||
|
|
||||||
|
In MacVTap mode, virtual machines are directly exposed to the Kubernetes nodes
|
||||||
|
L2 network. This is achieved by 'extending' an existing network interface with
|
||||||
|
a virtual device that has its own MAC address.
|
||||||
|
|
||||||
|
MacVTap interfaces are feature gated; to enable the feature, follow
|
||||||
|
instructions, in order to activate the MacVTap feature gate (case sensitive).
|
||||||
|
|
||||||
|
|
||||||
|
How to Activate a Feature Gate
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cat << END > enable-feature-gate.yaml
|
||||||
|
---
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: KubeVirt
|
||||||
|
metadata:
|
||||||
|
name: kubevirt
|
||||||
|
namespace: kubevirt
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
developerConfiguration:
|
||||||
|
featureGates:
|
||||||
|
- LiveMigration
|
||||||
|
- Macvtap
|
||||||
|
END
|
||||||
|
|
||||||
|
kubectl apply -f enable-feature-gate.yaml
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Make sure to add all existing feature gates in overrides file.
|
||||||
|
|
||||||
|
Alternatively, the existing kubevirt custom resources can be altered:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl edit kubevirt kubevirt -n kubevirt
|
||||||
|
...
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
developerConfiguration:
|
||||||
|
featureGates:
|
||||||
|
- DataVolumes
|
||||||
|
- LiveMigration
|
||||||
|
- Macvtap
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The names of the feature gates are case sensitive.
|
||||||
|
|
||||||
|
Below is the usage example of MacVTap interface used by |VM|:
|
||||||
|
|
||||||
|
Create network attachment for the MacVTap network:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kind: NetworkAttachmentDefinition
|
||||||
|
apiVersion: k8s.cni.cncf.io/v1
|
||||||
|
metadata:
|
||||||
|
name: macvtapnetwork
|
||||||
|
annotations:
|
||||||
|
k8s.v1.cni.cncf.io/resourceName: macvtap.network.kubevirt.io/dataplane1
|
||||||
|
spec:
|
||||||
|
config: '{
|
||||||
|
"cniVersion": "0.3.1",
|
||||||
|
"name": "macvtapnetwork",
|
||||||
|
"type": "macvtap",
|
||||||
|
"mtu": 1500
|
||||||
|
}'
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
By running this yaml, the system will create 10
|
||||||
|
``macvtap.network.kubevirt.io/dataplane1`` network attachments or
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
Now you can create the |VM| using MacVTap network, for example:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1alpha3
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-host-network
|
||||||
|
name: vmi-host-network
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: hostnetwork
|
||||||
|
macvtap: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: hostnetwork
|
||||||
|
multus:
|
||||||
|
networkName: macvtapnetwork
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
- name: cloudinitdisk
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
|
||||||
|
|
||||||
|
Multus
|
||||||
|
------
|
||||||
|
|
||||||
|
It is also possible to connect VMIs to secondary networks using Multus. This
|
||||||
|
assumes that multus is installed across your cluster and a corresponding
|
||||||
|
``NetworkAttachmentDefinition`` |CRD| was created.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
First create the respective network attachment, for example if you want to
|
||||||
|
use MacVTap or |SRIOV| for a secondary interface.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1alpha3
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-host-network
|
||||||
|
name: vmi-host-network-2
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 2
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
- name: hostnetwork
|
||||||
|
macvtap: {}
|
||||||
|
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
- name: hostnetwork
|
||||||
|
multus:
|
||||||
|
networkName: macvtapnetwork
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
- name: cloudinitdisk
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
|
||||||
|
In the example manifest above, the |VM| uses the first interface as default and
|
||||||
|
second interface is MacVTap which is mapped using multus.
|
||||||
|
|
||||||
|
SRIOV
|
||||||
|
-----
|
||||||
|
|
||||||
|
In |SRIOV| mode, virtual machines are directly exposed to an |SRIOV| |PCI|
|
||||||
|
device, usually allocated by Intel |SRIOV| device plugin. The device is passed
|
||||||
|
through into the guest operating system as a host device, using the |VFIO|
|
||||||
|
userspace interface, to maintain high networking performance.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In |prod| |SRIOV| device plugin is part of the default platform
|
||||||
|
functionality.
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
KubeVirt relies on |VFIO| userspace driver to pass |PCI| devices into the
|
||||||
|
|VMI| guest. As a result, when configuring |SRIOV|, define a pool of VF
|
||||||
|
resources that uses driver: vfio.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Make sure an |SRIOV| interface is configured on a ``DATANETWORK``
|
||||||
|
(``sriovnet0`` for example below) on the |prod| host. For more details see
|
||||||
|
:ref:`provisioning-sr-iov-interfaces-using-the-cli`.
|
||||||
|
|
||||||
|
#. Create the Network attachment.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: "k8s.cni.cncf.io/v1"
|
||||||
|
kind: NetworkAttachmentDefinition
|
||||||
|
metadata:
|
||||||
|
name: sriov-net1
|
||||||
|
annotations:
|
||||||
|
k8s.v1.cni.cncf.io/resourceName: intel.com/pci_sriov_net_sriovnet0
|
||||||
|
spec:
|
||||||
|
config: '{
|
||||||
|
"type": "sriov",
|
||||||
|
"vlan": 5,
|
||||||
|
"cniVersion": "0.3.1",
|
||||||
|
"name": "sriov-net1"
|
||||||
|
}'
|
||||||
|
|
||||||
|
#. Launch the VM.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1alpha3
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-sriov-network
|
||||||
|
name: vmi-sriov-network
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- masquerade: {}
|
||||||
|
name: default
|
||||||
|
- name: sriov-net1
|
||||||
|
sriov: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
- multus:
|
||||||
|
networkName: sriov-net1
|
||||||
|
name: sriov-net1
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
- name: cloudinitdisk
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
.. _introduction-bb3a04279bf5:
|
.. _introduction-bb3a04279bf5:
|
||||||
|
|
||||||
============
|
=====================
|
||||||
Introduction
|
KubeVirt Introduction
|
||||||
============
|
=====================
|
||||||
|
|
||||||
The KubeVirt system application in StarlingX includes: KubeVirt, Containerized
|
The KubeVirt system application in StarlingX includes: KubeVirt, Containerized
|
||||||
Data Importer (|CDI|), and the Virtctl client tool.
|
Data Importer (|CDI|), and the Virtctl client tool.
|
||||||
@ -26,4 +26,3 @@ migrating |VMs|, canceling live migrations and uploading |VM| disk images.
|
|||||||
|
|
||||||
See https://kubevirt.io/user-guide for more details.
|
See https://kubevirt.io/user-guide for more details.
|
||||||
|
|
||||||
|
|
||||||
|
124
doc/source/kube-virt/kubevirt-architecture-c92c8908e775.rst
Normal file
124
doc/source/kube-virt/kubevirt-architecture-c92c8908e775.rst
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
.. _kubevirt-architecture-c92c8908e775:
|
||||||
|
|
||||||
|
=====================
|
||||||
|
KubeVirt Architecture
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The following diagram describes the KubeVirt architecture:
|
||||||
|
|
||||||
|
.. figure:: figures/kubevirt-architecture.png
|
||||||
|
:width: 800
|
||||||
|
|
||||||
|
.. rubric:: ``virt-api-server``
|
||||||
|
|
||||||
|
HTTP API server serves as the entry point for all virtualization related flows.
|
||||||
|
|
||||||
|
The API server updates the virtualization related custom resource definition
|
||||||
|
(see below).
|
||||||
|
|
||||||
|
As the main entry point to KubeVirt it is responsible for defaulting and
|
||||||
|
validation of the provided VMI |CRDs|.
|
||||||
|
|
||||||
|
.. rubric:: VMI (CRD)
|
||||||
|
|
||||||
|
|VMI| definitions are kept as custom resources inside the Kubernetes API
|
||||||
|
server.
|
||||||
|
|
||||||
|
The |VMI| definition defines all properties of the |VM| itself, for example:
|
||||||
|
|
||||||
|
- Machine type
|
||||||
|
|
||||||
|
- CPU type
|
||||||
|
|
||||||
|
- Amount of RAM and |vCPUs|
|
||||||
|
|
||||||
|
- Number and type of |NICs|
|
||||||
|
|
||||||
|
|
||||||
|
.. rubric:: ``virt-controller``
|
||||||
|
|
||||||
|
The ``virt-controller`` has all the cluster wide virtualization functionality
|
||||||
|
and it is responsible for monitoring the |VMI| (|CRs|) and managing the
|
||||||
|
associated pods. Currently, the controller ensure the creation and management
|
||||||
|
of the life-cycle of the pods associated with the |VMI| objects.
|
||||||
|
|
||||||
|
A |VMI| object will always be associated with a pod during its life-time.
|
||||||
|
However, migration of a |VMI| the pod instance might change over time.
|
||||||
|
|
||||||
|
|
||||||
|
.. rubric:: ``virt-launcher``
|
||||||
|
|
||||||
|
For every |VMI| object one pod is created. This pod's primary container runs
|
||||||
|
the ``virt-launcher`` KubeVirt component.
|
||||||
|
|
||||||
|
Kubernetes or kubelet is not running the |VMIs|. Instead a daemon on every host
|
||||||
|
in the cluster launches a |VMI| process for every pod which is associated with
|
||||||
|
a |VMI| object whenever it is scheduled on a host.
|
||||||
|
|
||||||
|
The main purpose of the ``virt-launcher`` pod is to provide ``cgroups`` and
|
||||||
|
``namespaces``, used to host the |VMI| process.
|
||||||
|
|
||||||
|
``virt-handler`` signals ``virt-launcher`` to start a |VMI| by passing the
|
||||||
|
|VMI|'s |CRD| object to ``virt-launcher``. ``virt-launcher`` uses a local
|
||||||
|
``libvirtd`` instance within its container to start the |VMI|. The
|
||||||
|
``virt-launcher`` monitors the |VMI| process and terminates once the |VMI| has
|
||||||
|
exited.
|
||||||
|
|
||||||
|
If the Kubernetes runtime attempts to shutdown the ``virt-launcher`` pod before
|
||||||
|
|VMI| has exited, ``virt-launcher`` forwards signals from Kubernetes to the
|
||||||
|
|VMI| process and attempts to hold off the termination of the pod until the
|
||||||
|
|VMI| has shutdown successfully.
|
||||||
|
|
||||||
|
|
||||||
|
.. rubric:: ``virt-handler``
|
||||||
|
|
||||||
|
Every host needs a single instance of ``virt-handler``. It can be delivered as
|
||||||
|
a DaemonSet.
|
||||||
|
|
||||||
|
Like the virt-controller, the ``virt-handler`` is also reactive and watches
|
||||||
|
for changes of the |VMI| object, once detected it will perform all necessary
|
||||||
|
operations to change a |VMI| to meet the required state.
|
||||||
|
|
||||||
|
This behavior is similar to the choreography between the Kubernetes |VMI|
|
||||||
|
server and the kubelet.
|
||||||
|
|
||||||
|
The functions of the ``virt-handler`` are:
|
||||||
|
|
||||||
|
- Keeps a cluster-level |VMI| specification in sync with a corresponding
|
||||||
|
``libvirt`` domain.
|
||||||
|
|
||||||
|
- Reports domain state and spec changes to the cluster.
|
||||||
|
|
||||||
|
- Invokes node-centric plugins which can fulfill networking and storage
|
||||||
|
requirements defined in |VMI| specs.
|
||||||
|
|
||||||
|
.. rubric:: ``Libvirtd``
|
||||||
|
|
||||||
|
An instance of ``libvirtd`` is present in every |VMI| pod. ``virt-launcher``
|
||||||
|
uses ``libvirtd`` to manage the life-cycle of the |VMI| process.
|
||||||
|
|
||||||
|
Additional components from |prod| Kubernetes are:
|
||||||
|
|
||||||
|
- Storage
|
||||||
|
|
||||||
|
- Networking
|
||||||
|
|
||||||
|
- |RBAC|
|
||||||
|
|
||||||
|
.. rubric:: Simplified Diagram
|
||||||
|
|
||||||
|
.. figure:: figures/kubrvirt-simplified-diagram.png
|
||||||
|
:width: 800
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
Containerized Data Importer
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
The |CDI| project provides facilities for enabling |PVCs| to be used as disks
|
||||||
|
for KubeVirt |VMs| by way of DataVolumes. The three main |CDI| use cases are:
|
||||||
|
|
||||||
|
- Import a disk image from a web server or container registry to a DataVolume.
|
||||||
|
|
||||||
|
- Clone an existing |PVC| to a DataVolume.
|
||||||
|
|
||||||
|
- Upload a local disk image to a DataVolume.
|
@ -1,8 +1,8 @@
|
|||||||
.. _removal-97cc897941bc:
|
.. _kubevirt-removal-97cc897941bc:
|
||||||
|
|
||||||
=======
|
================
|
||||||
Removal
|
KubeVirt Removal
|
||||||
=======
|
================
|
||||||
|
|
||||||
.. rubric:: |proc|
|
.. rubric:: |proc|
|
||||||
|
|
@ -0,0 +1,156 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _live-migration-support-for-vms-bea635bacc50:
|
||||||
|
|
||||||
|
==============================
|
||||||
|
Live Migration Support for VMs
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Live migration is a process during which a running |VMI| moves to another
|
||||||
|
compute node while the guest workload continues to run and remain accessible.
|
||||||
|
|
||||||
|
|
||||||
|
Enable the Live Migration Support
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
Live migration is enabled by default in recent versions of KubeVirt. Versions
|
||||||
|
prior to v0.56 must be enabled in the feature gates. The feature gates field in
|
||||||
|
the KubeVirt Custom Resource must be expanded by adding the live migration to
|
||||||
|
it.
|
||||||
|
|
||||||
|
Limitation for live migrations:
|
||||||
|
|
||||||
|
- |VMs| using a |PVC| must have a shared |RWX| access mode to be live
|
||||||
|
migrated.
|
||||||
|
|
||||||
|
- Live migration is not allowed with a pod network binding of bridge
|
||||||
|
interface type ().
|
||||||
|
|
||||||
|
- Live migration requires ports 49152, 49153 to be available in the
|
||||||
|
``virt-launcher`` pod. If these ports are explicitly specified in
|
||||||
|
a masquarade interface, live migration will not function.
|
||||||
|
|
||||||
|
|
||||||
|
Initiate Live Migration
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Live migration is initiated by posting a |VMIM| object to the cluster. The
|
||||||
|
example below starts a migration process for a virtual machine instance
|
||||||
|
``vmi-fedora``.
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
cat <<EOF> migration.yaml
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstanceMigration
|
||||||
|
metadata:
|
||||||
|
name: migration-job
|
||||||
|
spec:
|
||||||
|
vmiName: vmi-fedora
|
||||||
|
EOF
|
||||||
|
|
||||||
|
kubectl apply -f migration.yaml
|
||||||
|
|
||||||
|
Use virtctl to initiate Live Migration
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
Live migration can also be initiated using ``virtctl``.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtctl migrate vmi-fedora
|
||||||
|
|
||||||
|
|
||||||
|
Live Migration for SRIOV based VMs
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
It is possible to live migrate |SRIOV| based |VMs|, but there are some
|
||||||
|
limitations:
|
||||||
|
|
||||||
|
- Specify the MAC address statically and on host the name of the |SRIOV|
|
||||||
|
interface should be same on source and target host.
|
||||||
|
|
||||||
|
- Specify the Static IP address.
|
||||||
|
|
||||||
|
Below is an example manifest for |SRIOV| |VM| using a static MAC address:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-sriov-network
|
||||||
|
name: vmi-sriov-test-vm
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 4
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- macAddress: "02:00:00:00:00:01"
|
||||||
|
name: sriov-net1
|
||||||
|
sriov: {}
|
||||||
|
rng: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- multus:
|
||||||
|
networkName: sriov-net1
|
||||||
|
name: sriov-net1
|
||||||
|
volumes:
|
||||||
|
- containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
name: containerdisk
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
networkData: |
|
||||||
|
ethernets:
|
||||||
|
sriov-net1:
|
||||||
|
addresses:
|
||||||
|
- 10.10.10.12/24
|
||||||
|
gateway: 10.10.10.1
|
||||||
|
match:
|
||||||
|
macAddress: "02:00:00:00:00:01"
|
||||||
|
nameservers:
|
||||||
|
addresses:
|
||||||
|
- 10.96.0.10
|
||||||
|
search:
|
||||||
|
- default.svc.cluster.local
|
||||||
|
- svc.cluster.local
|
||||||
|
- cluster.local
|
||||||
|
set-name: sriov-link-enabled
|
||||||
|
version: 2
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
name: cloudinitdisk
|
||||||
|
|
||||||
|
|
||||||
|
Below is an example manifest to initiate the live migration:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstanceMigration
|
||||||
|
metadata:
|
||||||
|
name: migration-job-1
|
||||||
|
spec:
|
||||||
|
vmiName: vmi-sriov-test-vm
|
||||||
|
|
||||||
|
|
@ -0,0 +1,183 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _node-assignment-using-nodeselector-affinity-and-antiminusaffi-06ad222ceb13:
|
||||||
|
|
||||||
|
=======================================================================================
|
||||||
|
Node Assignment Using NodeSelector, Affinity and Anti-Affinity, Taints, and Tolerations
|
||||||
|
=======================================================================================
|
||||||
|
|
||||||
|
Setting ``spec.nodeSelector`` requirements, constrains the scheduler to only
|
||||||
|
schedule VMs on nodes, which contain the specified labels. In the following
|
||||||
|
example the |VMI| contains the label ``app: kload`` (in this case on
|
||||||
|
controller-1).
|
||||||
|
|
||||||
|
Example of a VM manifest using ``nodeSelector``:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
name: testvmi-nocloud
|
||||||
|
spec:
|
||||||
|
nodeSelector:
|
||||||
|
app: kload
|
||||||
|
terminationGracePeriodSeconds: 30
|
||||||
|
domain:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: emptydisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- disk:
|
||||||
|
bus: virtio
|
||||||
|
name: cloudinitdisk
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: kubevirt/fedora-cloud-container-disk-demo:latest
|
||||||
|
- name: emptydisk
|
||||||
|
emptyDisk:
|
||||||
|
capacity: "2Gi"
|
||||||
|
- name: cloudinitdisk
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
password: fedora
|
||||||
|
chpasswd: { expire: False }
|
||||||
|
|
||||||
|
|
||||||
|
The ``spec.affinity`` field allows specifying hard- and soft-affinity for
|
||||||
|
|VMs|. It is possible to write matching rules against workloads (|VMs| and
|
||||||
|
pods) and Nodes. Since |VMs| are a workload type based on pods, Pod-affinity
|
||||||
|
affects |VMs| as well.
|
||||||
|
|
||||||
|
Pod affinity allows you to specify which POD/VM should be scheduled together
|
||||||
|
(on the same node or in the same topology, like a zone).
|
||||||
|
|
||||||
|
Where ``requiredDuringSchedulingIgnoredDuringExecution`` means that the
|
||||||
|
scheduler must place the pod/VM on a node that matches the affinity rules
|
||||||
|
during scheduling, but once the pod is running, the rule is ignored if other
|
||||||
|
changes happen (e.g., pods with the same label are removed).
|
||||||
|
|
||||||
|
The rule here says that the pod must be scheduled on a node that has other
|
||||||
|
POD/VM with the following characteristics: Label Selector: It looks for POD/VM
|
||||||
|
with the label security and the value ``S1``. This is defined in the
|
||||||
|
``matchExpressions`` part of the configuration.
|
||||||
|
|
||||||
|
``TopologyKey: failure-domain.beta.kubernetes.io/zone`` means that the pods
|
||||||
|
with the security: ``S1`` label should be in the same zone as the POD/VM being
|
||||||
|
scheduled. Essentially, the pod should be scheduled in the same failure domain
|
||||||
|
(zone) as other pods with the security: ``S1`` label.
|
||||||
|
|
||||||
|
Pod anti-affinity specifies that certain pods should not be scheduled together
|
||||||
|
(on the same node or topology).
|
||||||
|
|
||||||
|
Where ``preferredDuringSchedulingIgnoredDuringExecution`` is a "soft" rule
|
||||||
|
where the scheduler prefers to place the pod according to the anti-affinity
|
||||||
|
rule, but it is not required. If the rule cannot be met, the POD/VM will still
|
||||||
|
be scheduled, but it will try to follow the rule when possible.
|
||||||
|
|
||||||
|
The rule here says that the scheduler prefers to place the POD/VM on a node
|
||||||
|
that avoids other pods with the following characteristics: Label Selector:
|
||||||
|
POD/VM with the label security and value ``S2``.
|
||||||
|
|
||||||
|
``TopologyKey: kubernetes.io/hostname`` means that the anti-affinity applies to
|
||||||
|
the hostname (i.e., the pod should prefer not to be placed on the same node as
|
||||||
|
POD/VM with the security: ``S2`` label).
|
||||||
|
|
||||||
|
``Weight``: The weight of 100 indicates the strength of the preference. A
|
||||||
|
higher weight means the scheduler will try harder to respect the rule, but it
|
||||||
|
is still not guaranteed.
|
||||||
|
|
||||||
|
Example of a |VM| manifest using affinity and anti-affinity:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
spec:
|
||||||
|
nodeSelector:
|
||||||
|
cpu: slow
|
||||||
|
storage: fast
|
||||||
|
domain:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 64M
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: mypvcdisk
|
||||||
|
lun: {}
|
||||||
|
affinity:
|
||||||
|
podAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- labelSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: security
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- S1
|
||||||
|
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||||
|
podAntiAffinity:
|
||||||
|
preferredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- weight: 100
|
||||||
|
podAffinityTerm:
|
||||||
|
labelSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: security
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- S2
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
volumes:
|
||||||
|
- name: mypvcdisk
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: mypvc
|
||||||
|
|
||||||
|
Affinity as described above, is a property of |VMs| that attracts them to a set
|
||||||
|
of nodes (either as a preference or a hard requirement). Taints are the
|
||||||
|
opposite - they allow a node to repel a set of |VMs|.
|
||||||
|
|
||||||
|
Taints and tolerations work together to ensure that |VMs| are not scheduled
|
||||||
|
onto inappropriate nodes. One or more taints are applied to a node; this
|
||||||
|
ensures that the node should not accept any |VMs| that do not tolerate the
|
||||||
|
taints. Tolerations are applied to |VMs|, and allow (but do not require) the
|
||||||
|
|VMs| to schedule onto nodes with matching taints.
|
||||||
|
|
||||||
|
Example of |VM| manifest using taint and tolerance.
|
||||||
|
|
||||||
|
You add a taint to a node using ``kubectl taint``. For example, ``kubectl taint
|
||||||
|
nodes node1 key=value:NoSchedule``.
|
||||||
|
|
||||||
|
Below is an example of adding a toleration of this taint to a VM:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
name: testvmi-ephemeral
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
spec:
|
||||||
|
nodeSelector:
|
||||||
|
cpu: slow
|
||||||
|
storage: fast
|
||||||
|
domain:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 64M
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: mypvcdisk
|
||||||
|
lun: {}
|
||||||
|
tolerations:
|
||||||
|
- key: "key"
|
||||||
|
operator: "Equal"
|
||||||
|
value: "value"
|
||||||
|
effect: "NoSchedule"
|
@ -0,0 +1,89 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _persistent-storage-for-vms-8ddc8fa611aa:
|
||||||
|
|
||||||
|
==========================
|
||||||
|
Persistent Storage for VMs
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Allows connecting a ``PersistentVolumeClaim`` to a |VM| disk.
|
||||||
|
|
||||||
|
Use a ``PersistentVolumeClaim`` when the ``VirtualMachineInstance`` disk needs
|
||||||
|
to persist after the |VM| terminates. This allows for the |VM|'s data to remain
|
||||||
|
persistent between restarts.
|
||||||
|
|
||||||
|
A ``PersistentVolume`` can be in ``filesystem`` or ``block`` mode.
|
||||||
|
|
||||||
|
Below is a simple example which attaches a ``PersistentVolumeClaim`` as a disk
|
||||||
|
to a VM:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
name: testvmi-pvc
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 64M
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: mypvcdisk
|
||||||
|
lun: {}
|
||||||
|
volumes:
|
||||||
|
- name: mypvcdisk
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: mypvc
|
||||||
|
|
||||||
|
|
||||||
|
Upload VM Image to CDI
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
You can upload/import a VM image to |CDI|, creating a |PVC| on system, so you
|
||||||
|
can use the |PVC| to boot or create the |VM|.
|
||||||
|
|
||||||
|
#. Get the upload proxy Server IP.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl -n cdi get svc |grep cdi-uploadproxy
|
||||||
|
cdi-uploadproxy ClusterIP 10.111.132.43 <none> 443/TCP 85m
|
||||||
|
|
||||||
|
#. Use ``virtctl`` client upload the image to |CDI|.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtctl image-upload --pvc-name=cirros-vm-disk-test-2 --pvc-size=500Mi --image-path=/home/sysadmin/kubevirt-valid/cirros-0.5.1-x86_64-disk.img --uploadproxy-url=https://<uploadproxy-svc-ip> --insecure
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Now you can use ``pvc cirros-vm-disk-test-2`` in |VM| specs.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
name: testvmi-pvc-1
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 64M
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: mypvcdisk
|
||||||
|
lun: {}
|
||||||
|
volumes:
|
||||||
|
- name: mypvcdisk
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: cirros-vm-disk-test-2
|
||||||
|
|
||||||
|
If you want to upload an image located outside the cluster, the cluster
|
||||||
|
admin should expose the |CDI| upload proxy to the outside, for example with
|
||||||
|
NodePort.
|
||||||
|
|
||||||
|
For more details see :ref:`set-up-cdi-proxy-ad165d884417`.
|
93
doc/source/kube-virt/startup-scripts-6402154a6f37.rst
Normal file
93
doc/source/kube-virt/startup-scripts-6402154a6f37.rst
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _startup-scripts-6402154a6f37:
|
||||||
|
|
||||||
|
===============
|
||||||
|
Startup Scripts
|
||||||
|
===============
|
||||||
|
|
||||||
|
KubeVirt supports the ability to assign a startup script to a |VMI| instance
|
||||||
|
which is executed automatically when the |VM| initializes.
|
||||||
|
|
||||||
|
These scripts are commonly used to automate injection of users and |SSH| keys
|
||||||
|
into |VMs| in order to provide remote access to the machine. For example, a
|
||||||
|
startup script can be used to inject credentials into a |VM| that allows an
|
||||||
|
Ansible job running on a remote host to access and provision the |VM|.
|
||||||
|
|
||||||
|
Startup scripts are not limited to any specific use case though. They can be
|
||||||
|
used to run any arbitrary script in a |VM| on boot.
|
||||||
|
|
||||||
|
Example of use:
|
||||||
|
|
||||||
|
Assign static IP using ``cloudInitNoCloud``.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-sriov-network
|
||||||
|
name: vmi-sriov-network
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 4
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- masquerade: {}
|
||||||
|
name: default
|
||||||
|
- macAddress: "02:00:00:00:00:01"
|
||||||
|
name: sriov-net1
|
||||||
|
sriov: {}
|
||||||
|
rng: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
- multus:
|
||||||
|
networkName: sriov-net1
|
||||||
|
name: sriov-net1
|
||||||
|
volumes:
|
||||||
|
- containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
name: containerdisk
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
networkData: |
|
||||||
|
ethernets:
|
||||||
|
sriov-net1:
|
||||||
|
addresses:
|
||||||
|
- 10.10.10.14/24
|
||||||
|
gateway: 10.10.10.1
|
||||||
|
match:
|
||||||
|
macAddress: "02:00:00:00:00:01"
|
||||||
|
nameservers:
|
||||||
|
addresses:
|
||||||
|
- 10.96.0.10
|
||||||
|
search:
|
||||||
|
- default.svc.cluster.local
|
||||||
|
- svc.cluster.local
|
||||||
|
set-name: sriov-link-enabled
|
||||||
|
version: 2
|
||||||
|
# userData: '#!/bin/bash echo "fedora" | passwd fedora --stdin'
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
name: cloudinitdisk
|
@ -0,0 +1,121 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _static-ip-assignment-via-cloudinit-configuration-d053375e78fa:
|
||||||
|
|
||||||
|
================================================
|
||||||
|
Static IP Assignment via Cloudinit Configuration
|
||||||
|
================================================
|
||||||
|
|
||||||
|
KubeVirt supports cloud-init's NoCloud and ConfigDrive datasources, which
|
||||||
|
involve injecting startup scripts into a |VM| instance using of an ephemeral
|
||||||
|
disk. |VMs| with the cloud-init package installed detect the ephemeral disk and
|
||||||
|
execute custom userdata scripts at boot.
|
||||||
|
|
||||||
|
In the example below, the |VM| is using NoCloud for assigning the static IP and
|
||||||
|
MAC address on |SRIOV| interface.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cat <<EOF>cloud-NoCloud-test.yaml
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-sriov-network
|
||||||
|
name: vmi-sriov-test-vm-1
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 4
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containerdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitdisk
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- masquerade: {}
|
||||||
|
name: default
|
||||||
|
- macAddress: "02:00:00:00:00:03"
|
||||||
|
name: sriov-net1
|
||||||
|
sriov: {}
|
||||||
|
rng: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
- multus:
|
||||||
|
networkName: sriov-net1
|
||||||
|
name: sriov-net1
|
||||||
|
volumes:
|
||||||
|
- containerDisk:
|
||||||
|
image: docker.io/kubevirt/fedora-cloud-container-disk-demo:devel
|
||||||
|
name: containerdisk
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
networkData: |
|
||||||
|
ethernets:
|
||||||
|
sriov-net1:
|
||||||
|
addresses:
|
||||||
|
- 10.10.10.42/24
|
||||||
|
gateway: 10.10.10.1
|
||||||
|
match:
|
||||||
|
macAddress: "02:00:00:00:00:03"
|
||||||
|
nameservers:
|
||||||
|
addresses:
|
||||||
|
- 10.96.0.10
|
||||||
|
search:
|
||||||
|
- default.svc.cluster.local
|
||||||
|
- svc.cluster.local
|
||||||
|
- cluster.local
|
||||||
|
set-name: sriov-link-enabled
|
||||||
|
version: 2
|
||||||
|
userData: |-
|
||||||
|
#!/bin/bash
|
||||||
|
echo "fedora" |passwd fedora --stdin
|
||||||
|
name: cloudinitdisk
|
||||||
|
EOF
|
||||||
|
|
||||||
|
kubectl apply -f cloud-NoCloud-test.yaml
|
||||||
|
|
||||||
|
|
||||||
|
[sysadmin@controller-0 kubevirt-GA-testing(keystone_admin)]$ kubectl get vmi
|
||||||
|
NAME AGE PHASE IP NODENAME READY
|
||||||
|
vmi-sriov-test-vm-1 3h17m Running 172.16.166.152 controller-1 True
|
||||||
|
|
||||||
|
[sysadmin@controller-0 kubevirt-GA-testing(keystone_admin)]$ virtctl console vmi-sriov-test-vm-1
|
||||||
|
Successfully connected to vmi-sriov-test-vm-1 console. The escape sequence is ^]vmi-sriov-test-vm-1 login: fedora
|
||||||
|
Password:
|
||||||
|
[fedora@vmi-sriov-test-vm-1 ~]$ ip a
|
||||||
|
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
||||||
|
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||||
|
inet 127.0.0.1/8 scope host lo
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
inet6 ::1/128 scope host
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||||
|
link/ether 52:54:00:90:b4:d7 brd ff:ff:ff:ff:ff:ff
|
||||||
|
altname enp1s0
|
||||||
|
inet 10.0.2.2/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0
|
||||||
|
valid_lft 86301690sec preferred_lft 86301690sec
|
||||||
|
inet6 fe80::5054:ff:fe90:b4d7/64 scope link
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
|
||||||
|
link/ether 02:00:00:00:00:03 brd ff:ff:ff:ff:ff:ff
|
||||||
|
altname enp8s0
|
||||||
|
inet 10.10.10.42/24 brd 10.10.10.10.255 scope global noprefixroute eth1
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
inet6 fe80::ff:fe00:3/64 scope link
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
[fedora@vmi-sriov-test-vm-1 ~]$
|
339
doc/source/kube-virt/use-shared-resource-cpu-ad295227aa0c.rst
Normal file
339
doc/source/kube-virt/use-shared-resource-cpu-ad295227aa0c.rst
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
.. _use-shared-resource-cpu-ad295227aa0c:
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Use Shared Resource (CPU)
|
||||||
|
=========================
|
||||||
|
|
||||||
|
In |prod| the shared CPUs are allocated under Application pool. All unused CPUs
|
||||||
|
are by default allocated under Application CPU pool.
|
||||||
|
|
||||||
|
Use the manifest example below for the shared CPU:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
:emphasize-lines: 15,16
|
||||||
|
|
||||||
|
cat <<EOF> sample-vm-diff-huge-pages-size.yaml
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: ubuntu-bionic-1g
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "10Gi"
|
||||||
|
memory:
|
||||||
|
hugepages:
|
||||||
|
pageSize: "1Gi"
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
||||||
|
EOF
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
In VM manifest, the CPUs, which are not defined as dedicated, will be
|
||||||
|
allocated from the Application (Shared) Pool.
|
||||||
|
|
||||||
|
--------------------------
|
||||||
|
Assign Dedicated Resources
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Dedicated CPU Resources
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Certain workloads requiring predictable latency and enhanced performance during
|
||||||
|
execution would benefit from obtaining dedicated CPU resources. KubeVirt,
|
||||||
|
relying on the Kubernetes CPU manager, is able to pin guest's vCPUs to the
|
||||||
|
host's pCPUs.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Enable CPU Manager on |prod| host before using dedicated CPU resources.
|
||||||
|
|
||||||
|
Kubernetes does not provide CPU Manager detection, so you need to add
|
||||||
|
CpuManager feature gate manually to KubeVirt CR:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: KubeVirt
|
||||||
|
metadata:
|
||||||
|
name: kubevirt
|
||||||
|
namespace: kubevirt
|
||||||
|
spec:
|
||||||
|
configuration:
|
||||||
|
developerConfiguration:
|
||||||
|
featureGates:
|
||||||
|
- LiveMigration
|
||||||
|
- Macvtap
|
||||||
|
- Snapshot
|
||||||
|
- CPUManager
|
||||||
|
|
||||||
|
Then, check the label:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
~(keystone_admin)]$ kubectl describe node | grep cpumanager cpumanager=true
|
||||||
|
|
||||||
|
|
||||||
|
Request Dedicated CPU Resources from Application CPU Pool
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Setting ``spec.domain.cpu.dedicatedCpuPlacement`` to true in a VMI spec will
|
||||||
|
indicate the desire to allocate dedicated CPU resource to the VMI.
|
||||||
|
|
||||||
|
Kubevirt will verify that all the necessary conditions are met, for the
|
||||||
|
Kubernetes CPU manager to pin the ``virt-launcher`` container to dedicated host
|
||||||
|
CPUs. Once, ``virt-launcher`` is running, the VMI's vCPUs will be pinned to the
|
||||||
|
pCPUS that has been dedicated for the ``virt-launcher`` container.
|
||||||
|
|
||||||
|
Expressing the desired amount of VMI's vCPUs can be done by either setting the
|
||||||
|
guest topology in ``spec.domain.cpu`` (sockets, cores, threads) or
|
||||||
|
``spec.domain.resources.[requests/limits].cpu`` to a whole number integer
|
||||||
|
``([1-9]+)`` indicating the number of vCPUs requested for the VMI. Number of
|
||||||
|
vCPUs is counted as sockets * cores * threads or if ``spec.domain.cpu`` is
|
||||||
|
empty then it takes value from ``spec.domain.resources.requests.cpu`` or
|
||||||
|
``spec.domain.resources.limits.cpu``.
|
||||||
|
|
||||||
|
Example of sample manifest file:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
:emphasize-lines: 14,15,16,17,18
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: ubuntu-bionic-dedicated-cpu
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 2
|
||||||
|
sockets: 1
|
||||||
|
threads: 1
|
||||||
|
dedicatedCpuPlacement: true
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 2048M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
||||||
|
|
||||||
|
Isolated CPU Resources
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
|prod| supports running the most critical low-latency applications on host CPUs
|
||||||
|
which are completely isolated from the host process scheduler. This allows you
|
||||||
|
to customize Kubernetes CPU management when the policy is set to static so that
|
||||||
|
low-latency applications run with optimal efficiency.
|
||||||
|
|
||||||
|
|
||||||
|
Request Isolated CPU Resources
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Make sure |prod| host is configured with isolated CPU cores.
|
||||||
|
|
||||||
|
Refer to documentation for isolated CPU
|
||||||
|
:ref:`isolating-cpu-cores-to-enhance-application-performance`.
|
||||||
|
|
||||||
|
By specifying the ``windriver.com/isolcpus: x`` in VM specs , allocates the
|
||||||
|
CPUs from application isolated core pools.
|
||||||
|
|
||||||
|
Below is the example manifest requesting the isolated cores.
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
:emphasize-lines: 31,32,33,34,35,36
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: ubuntu-bionic-isol-cores
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
sockets: 1
|
||||||
|
cores: 4
|
||||||
|
threads: 1
|
||||||
|
dedicatedCpuPlacement: true
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 4Gi
|
||||||
|
windriver.com/isolcpus: 4
|
||||||
|
limits:
|
||||||
|
memory: 4Gi
|
||||||
|
windriver.com/isolcpus: 4
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
||||||
|
|
||||||
|
|
||||||
|
Huge Pages
|
||||||
|
----------
|
||||||
|
|
||||||
|
Huge pages, in the context of Kubevirt VM, refers to a Linux kernel feature
|
||||||
|
that allows for the efficient use of large pages, also known as large memory
|
||||||
|
pages. Huge pages can be leveraged to enhance the performance of
|
||||||
|
memory-intensive applications, especially those with large datasets.
|
||||||
|
|
||||||
|
Request Huge Pages
|
||||||
|
------------------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Make sure |prod| host is pre-configured with huge pages.
|
||||||
|
|
||||||
|
For more details on huge pages configuration, refer to
|
||||||
|
:ref:`allocating-host-memory-using-the-cli`.
|
||||||
|
|
||||||
|
You can request the memory in form of huge pages by specifying the
|
||||||
|
``spec.domain.memory.hugePages.pageSize``.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: ubuntu-bionic-1g
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "10Gi"
|
||||||
|
memory:
|
||||||
|
hugepages:
|
||||||
|
pageSize: "1Gi"
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
342
doc/source/kube-virt/virtual-machine-dd561f6db3fd.rst
Normal file
342
doc/source/kube-virt/virtual-machine-dd561f6db3fd.rst
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
.. _virtual-machine-dd561f6db3fd:
|
||||||
|
|
||||||
|
===============
|
||||||
|
Virtual Machine
|
||||||
|
===============
|
||||||
|
|
||||||
|
Every |VMI| object represents a single running virtual machine instance.
|
||||||
|
|
||||||
|
While |VM| represents the abstraction of virtual machine instances.
|
||||||
|
|
||||||
|
.. contents:: |minitoc|
|
||||||
|
:local:
|
||||||
|
:depth: 2
|
||||||
|
|
||||||
|
---------------------------------
|
||||||
|
Create Virtual Machines Manifests
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
The ``virtctl`` sub command ``create vm`` allows easy creation of
|
||||||
|
VirtualMachine manifests from the command line. It leverages instance types and
|
||||||
|
preferences and provides several flags to control details of the created |VM|.
|
||||||
|
|
||||||
|
For example there are flags to specify the name or run strategy of a |VM| or
|
||||||
|
flags to add volumes to a |VM|. Instance types and preferences can either be
|
||||||
|
specified directly or it is possible to let KubeVirt infer those from the
|
||||||
|
volume used to boot the |VM|.
|
||||||
|
|
||||||
|
For a full set of flags and their description use the following command:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtctl create vm -h
|
||||||
|
|
||||||
|
|
||||||
|
Create Virtual Machines on a Cluster
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
The output of ``virtctl create vm`` can be piped into ``kubectl`` to directly
|
||||||
|
create a |VM| on a cluster.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# Create a VM with name my-vm on the cluster
|
||||||
|
virtctl create vm --name my-vm | kubectl create -f -
|
||||||
|
virtualmachine.kubevirt.io/my-vm created
|
||||||
|
|
||||||
|
Specify Cloud-init User Data
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
To pass ``cloud-init`` user data to ``virtctl`` it needs to be encoded into a
|
||||||
|
``base64`` string.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# Put your cloud-init user data into a file.
|
||||||
|
# This will add an authorized key to the default user.
|
||||||
|
# To get the default username read the documentation for the cloud image
|
||||||
|
$ cat cloud-init.txt
|
||||||
|
#cloud-config
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- ssh-rsa AAAA...
|
||||||
|
|
||||||
|
# Base64 encode the contents of the file without line wraps and store it in a variable
|
||||||
|
$ CLOUD_INIT_USERDATA=$(base64 -w 0 cloud-init.txt)
|
||||||
|
|
||||||
|
# Show the contents of the variable
|
||||||
|
$ echo $CLOUD_INIT_USERDATA I2Nsb3VkLWNvbmZpZwpzc2hfYXV0aG9yaXplZF9rZXlzOgogIC0gc3NoLXJzYSBBQUFBLi4uCg==
|
||||||
|
|
||||||
|
You can now use this variable as an argument to the ``--cloud-init-user-data``
|
||||||
|
flag:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtctl create vm --cloud-init-user-data $CLOUD_INIT_USERDATA
|
||||||
|
|
||||||
|
|
||||||
|
Create VM Directly from Manifest
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
You can create the |VM| or virtual machine instances directly from manifest.
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: sample-test-vm
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
||||||
|
|
||||||
|
|
||||||
|
----------
|
||||||
|
Access VMs
|
||||||
|
----------
|
||||||
|
|
||||||
|
Once a |VM| is started, you are able to connect to the consoles it exposes.
|
||||||
|
Usually there are two types of consoles:
|
||||||
|
|
||||||
|
- Serial Console
|
||||||
|
|
||||||
|
The serial console of a virtual machine can be accessed by using
|
||||||
|
the console command:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtctl console testvm
|
||||||
|
|
||||||
|
- Graphical Console (VNC)
|
||||||
|
|
||||||
|
If NoVnc is installed on Cluster and exposed over NodePort, you can access
|
||||||
|
virtual machines with ``http://<cluster IP>:port``.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Refer the section :ref:`Install NoVNC <installation-66477d7646db>` for
|
||||||
|
more details.
|
||||||
|
|
||||||
|
|
||||||
|
---------
|
||||||
|
Lifecycle
|
||||||
|
---------
|
||||||
|
|
||||||
|
Every |VMI| represents a single virtual machine instance. In general, the
|
||||||
|
management of |VMIs| is kept similar to how Pods are managed. Every |VM| that
|
||||||
|
is defined in the cluster is expected to be running, just like pods. Deleting a
|
||||||
|
|VMI| is equivalent to shutting it down, this is also equivalent to how pods
|
||||||
|
behave.
|
||||||
|
|
||||||
|
Launch a Virtual Machine
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
To start a |VMI|, you need to create a |VMI| object using ``kubectl``:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl create -f vmi.yaml
|
||||||
|
|
||||||
|
Example of ``vmi.yaml``:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachine
|
||||||
|
metadata:
|
||||||
|
name: sample-test-vm
|
||||||
|
spec:
|
||||||
|
running: true
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
kubevirt.io/size: small
|
||||||
|
kubevirt.io/domain: ubuntu-bionic
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
cpu:
|
||||||
|
cores: 1
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- name: containervolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
- name: cloudinitvolume
|
||||||
|
disk:
|
||||||
|
bus: virtio
|
||||||
|
interfaces:
|
||||||
|
- name: default
|
||||||
|
masquerade: {}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
networks:
|
||||||
|
- name: default
|
||||||
|
pod: {}
|
||||||
|
volumes:
|
||||||
|
- name: containervolume
|
||||||
|
containerDisk:
|
||||||
|
image: tedezed/ubuntu-container-disk:20.0
|
||||||
|
- name: cloudinitvolume
|
||||||
|
cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
list: |
|
||||||
|
ubuntu:ubuntu
|
||||||
|
root:root
|
||||||
|
expire: False
|
||||||
|
|
||||||
|
|
||||||
|
List the VM
|
||||||
|
-----------
|
||||||
|
|
||||||
|
|VMIs| can be listed by querying for |VMI| objects:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl get vmis
|
||||||
|
|
||||||
|
|
||||||
|
Retrieve a VMI Definition
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
A single |VMI| definition can be retrieved by getting the specific |VMI|
|
||||||
|
object.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl get vmis testvmi
|
||||||
|
|
||||||
|
|
||||||
|
Remove a VMI
|
||||||
|
------------
|
||||||
|
|
||||||
|
To stop the |VMI|, you need to delete the corresponding |VMI| object using
|
||||||
|
kubectl.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ kubectl delete -f vmi.yaml
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ kubectl delete vmis testvmi
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Stopping a |VMI| implies that it will be deleted from the cluster. You will
|
||||||
|
not be able to start this |VMI| object again.
|
||||||
|
|
||||||
|
|
||||||
|
Start and Stop a VM
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
|VMs|, in contrast to |VMIs|, have a running state. Thus, on a |VM| you can
|
||||||
|
define if it should be running, or not. |VMIs| are always running and consuming
|
||||||
|
resources, if they are defined in the cluster
|
||||||
|
|
||||||
|
``virtctl`` is used to start a |VM|:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl start my-vm
|
||||||
|
|
||||||
|
And to stop a |VM|:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl stop my-vm
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
If you run the force stop to the |VM|, it may result in data
|
||||||
|
inconsistencies, or there may be data loss.
|
||||||
|
|
||||||
|
|
||||||
|
Pause and Unpause a VM
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Pausing in this context refers to ``libvirt``'s :command:`virDomainSuspend`
|
||||||
|
command. The process is frozen without further access to CPU resources and
|
||||||
|
I/O but the memory used by the domain at the hypervisor level will stay
|
||||||
|
allocated.
|
||||||
|
|
||||||
|
To pause a |VM|, you need the ``virtctl`` command line tool. The pause command
|
||||||
|
works on either |VMs| or |VMIs|:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl pause vm testvm
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl pause vmi testvm
|
||||||
|
|
||||||
|
Paused |VMIs| have a Paused condition in their status:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ kubectl get vmi testvm -o=jsonpath='{.status.conditions[?(@.type=="Paused")].message}'
|
||||||
|
|
||||||
|
VMI was paused by user
|
||||||
|
|
||||||
|
Unpausing works similar to pausing:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl unpause vm testvm
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
$ virtctl unpause vmi testvm
|
@ -0,0 +1,102 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _virtualmachineinstancereplicaset-8518d55de52b:
|
||||||
|
|
||||||
|
====================================
|
||||||
|
Virtual Machine Instance Replica Set
|
||||||
|
====================================
|
||||||
|
|
||||||
|
A |VMIRS| tries to ensure that a specified number of |VMI| replicas are
|
||||||
|
running at any time. Meaning, a |VMIRS| makes sure that a |VMI| or a
|
||||||
|
homogeneous set of |VMIs| is always up and ready.
|
||||||
|
|
||||||
|
|
||||||
|
Use VMIRS
|
||||||
|
---------
|
||||||
|
|
||||||
|
The |VMIRS| allows you to specify a |VMI| Template in ``spec.template``. It
|
||||||
|
consists of ``ObjectMetadata`` in ``spec.template.metadata``, and a |VMI| spec
|
||||||
|
in ``spec.template.spec``. The specification of the |VM| is equal to the
|
||||||
|
specification of the |VM| in the |VMI| workload.
|
||||||
|
|
||||||
|
``spec.replicas`` can be used to specify how many replicas are wanted. If
|
||||||
|
unspecified, the default value is 1. This value can be updated anytime. The
|
||||||
|
controller reacts to the changes.
|
||||||
|
|
||||||
|
Example manifest for ``replicaset``:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstanceReplicaSet
|
||||||
|
metadata:
|
||||||
|
name: testreplicaset
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
myvmi: myvmi
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: test
|
||||||
|
labels:
|
||||||
|
myvmi: myvmi
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
devices:
|
||||||
|
disks:
|
||||||
|
- disk:
|
||||||
|
name: containerdisk
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 64M
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: kubevirt/cirros-container-disk-demo:latest
|
||||||
|
|
||||||
|
|
||||||
|
Configure Horizontal VM Autoscaler
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
[sysadmin@controller-0 ravi-test(keystone_admin)]$ cat hpa.yaml
|
||||||
|
---
|
||||||
|
apiVersion: autoscaling/v1
|
||||||
|
kind: HorizontalPodAutoscaler
|
||||||
|
metadata:
|
||||||
|
name: test-hpa
|
||||||
|
spec:
|
||||||
|
scaleTargetRef:
|
||||||
|
kind: VirtualMachineInstanceReplicaSet
|
||||||
|
name: testreplicaset
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
minReplicas: 3
|
||||||
|
maxReplicas: 5
|
||||||
|
targetCPUUtilizationPercentage: 50
|
||||||
|
---
|
||||||
|
|
||||||
|
Verify :
|
||||||
|
[sysadmin@controller-0 (keystone_admin)]$ kubectl describe horizontalpodautoscaler.autoscaling
|
||||||
|
Name: test-hpa
|
||||||
|
Namespace: default
|
||||||
|
Labels: <none>
|
||||||
|
Annotations: autoscaling.alpha.kubernetes.io/conditions:
|
||||||
|
[{"type":"AbleToScale","status":"True","lastTransitionTime":"2023-11-30T18:17:34Z","reason":"ScaleDownStabilized","message":"recent recomm...
|
||||||
|
autoscaling.alpha.kubernetes.io/current-metrics:
|
||||||
|
[\{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":1,"currentAverageValue":"2m"}}]
|
||||||
|
CreationTimestamp: Thu, 30 Nov 2023 19:17:19 +0100
|
||||||
|
Reference: VirtualMachineInstanceReplicaSet/testreplicaset
|
||||||
|
Target CPU utilization: 50%
|
||||||
|
Current CPU utilization: 1%
|
||||||
|
Min replicas: 3
|
||||||
|
Max replicas: 5
|
||||||
|
VirtualMachineInstanceReplicaSet pods: 3 current / 3 desired
|
||||||
|
Events: <none>
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Based on CPU usage in above example the autoscaler will scale up and down
|
||||||
|
the ``replicaset``.
|
129
doc/source/kube-virt/vm-snapshot-and-restore-21158b60cd56.rst
Normal file
129
doc/source/kube-virt/vm-snapshot-and-restore-21158b60cd56.rst
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _vm-snapshot-and-restore-21158b60cd56:
|
||||||
|
|
||||||
|
=======================
|
||||||
|
VM Snapshot and Restore
|
||||||
|
=======================
|
||||||
|
|
||||||
|
|VM| snapshot allows you to snapshot the running |VM| with existing
|
||||||
|
configuration and restore back to configuration point.
|
||||||
|
|
||||||
|
|
||||||
|
Snapshot a VM
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Snapshotting a |VM| is supported for online and offline |VMs|.
|
||||||
|
|
||||||
|
When snapshotting a running |VM| the controller will check for the qemu guest
|
||||||
|
agent in the |VM|. If the agent exists it will freeze the |VM| filesystems
|
||||||
|
before taking the snapshot and unfreeze after the snapshot. It is recommended
|
||||||
|
to take online snapshots with the guest agent for a better snapshot, if not
|
||||||
|
present, a best effort snapshot will be taken.
|
||||||
|
|
||||||
|
.. rubric:: |proc|
|
||||||
|
|
||||||
|
To enable snapshot functionality system does require snapshot |CRD| and
|
||||||
|
snapshot controller to be created on system. Follow the steps below:
|
||||||
|
|
||||||
|
#. Run to install snapshot |CRD| and snapshot controller on Kubernets:
|
||||||
|
|
||||||
|
- ``kubectl apply -f`` https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
|
||||||
|
|
||||||
|
- ``kubectl apply -f`` https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
|
||||||
|
|
||||||
|
- ``kubectl apply -f`` https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
|
||||||
|
|
||||||
|
- ``kubectl apply -f`` https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
|
||||||
|
|
||||||
|
- ``kubectl apply -f`` https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
|
||||||
|
|
||||||
|
|
||||||
|
#. Create ``VolumeSnapshotClass`` for ``cephfs`` and ``rbd``:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cat <<EOF>cephfs-storageclass.yaml
|
||||||
|
—
|
||||||
|
apiVersion: snapshot.storage.k8s.io/v1
|
||||||
|
kind: VolumeSnapshotClass
|
||||||
|
metadata:
|
||||||
|
name: csi-cephfsplugin-snapclass
|
||||||
|
driver: cephfs.csi.ceph.com
|
||||||
|
parameters:
|
||||||
|
clusterID: 60ee9439-6204-4b11-9b02-3f2c2f0a4344
|
||||||
|
csi.storage.k8s.io/snapshotter-secret-name: ceph-pool-kube-cephfs-data
|
||||||
|
csi.storage.k8s.io/snapshotter-secret-namespace: default
|
||||||
|
deletionPolicy: Delete
|
||||||
|
EOF
|
||||||
|
cat <<EOF>rbd-storageclass.yaml
|
||||||
|
—
|
||||||
|
apiVersion: snapshot.storage.k8s.io/v1
|
||||||
|
kind: VolumeSnapshotClass
|
||||||
|
metadata:
|
||||||
|
name: csi-rbdplugin-snapclass
|
||||||
|
driver: rbd.csi.ceph.com
|
||||||
|
parameters:
|
||||||
|
clusterID: 60ee9439-6204-4b11-9b02-3f2c2f0a4344
|
||||||
|
csi.storage.k8s.io/snapshotter-secret-name: ceph-pool-kube-rbd
|
||||||
|
csi.storage.k8s.io/snapshotter-secret-namespace: default
|
||||||
|
deletionPolicy: Delete
|
||||||
|
EOF
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Get the cluster ID from: ``kubectl describe sc cephfs, rbd``.
|
||||||
|
|
||||||
|
#. Create snapshot manifest of running |VM| using the example yaml below:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
cat<<EOF>cirros-snapshot.yaml
|
||||||
|
apiVersion: snapshot.kubevirt.io/v1alpha1
|
||||||
|
kind: VirtualMachineSnapshot
|
||||||
|
metadata:
|
||||||
|
name: snap-cirros
|
||||||
|
spec:
|
||||||
|
source:
|
||||||
|
apiGroup: kubevirt.io
|
||||||
|
kind: VirtualMachine
|
||||||
|
name: pvc-test-vm
|
||||||
|
failureDeadline: 3m
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#. Apply the snapshot manifest and verify if the snapshot is successfully
|
||||||
|
created.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
kubectl apply -f cirros-snapshot.yaml
|
||||||
|
[sysadmin@controller-0 kubevirt-GA-testing(keystone_admin)]$ kubectl get VirtualMachineSnapshot
|
||||||
|
NAME SOURCEKIND SOURCENAME PHASE READYTOUSE CREATIONTIME ERROR
|
||||||
|
snap-cirros VirtualMachine pvc-test-vm Succeeded true 28m
|
||||||
|
|
||||||
|
Example manifest to restore the snapshot:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
<<EOF>cirros-restore.yaml
|
||||||
|
apiVersion: snapshot.kubevirt.io/v1alpha1
|
||||||
|
kind: VirtualMachineRestore
|
||||||
|
metadata:
|
||||||
|
name: restore-cirros
|
||||||
|
spec:
|
||||||
|
target:
|
||||||
|
apiGroup: kubevirt.io
|
||||||
|
kind: VirtualMachine
|
||||||
|
name: pvc-test-vm
|
||||||
|
virtualMachineSnapshotName: snap-cirros
|
||||||
|
EOF
|
||||||
|
kubectl apply -f cirros-restore.yaml
|
||||||
|
|
||||||
|
Verify the snapshot restore:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
[sysadmin@controller-0 kubevirt-GA-testing(keystone_admin)]$ kubectl get VirtualMachineRestore
|
||||||
|
NAME TARGETKIND TARGETNAME COMPLETE RESTORETIME ERROR
|
||||||
|
restore-cirros VirtualMachine pvc-test-vm true 34m
|
@ -0,0 +1,95 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _vm-using-secret-as-startup-configuration-4a8255e26b1f:
|
||||||
|
|
||||||
|
========================================
|
||||||
|
VM Using Secret as Startup Configuration
|
||||||
|
========================================
|
||||||
|
|
||||||
|
A secret can be presented to the |VM| as disk or as a filesystem.
|
||||||
|
|
||||||
|
The disk method does not support dynamic change propagation and the filesystem
|
||||||
|
method does not support live migration. Therefore, depending on the use-case,
|
||||||
|
one or the other may be more suitable.
|
||||||
|
|
||||||
|
Example of the creation of a Secret:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: app-secret
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
username: YWxheA==
|
||||||
|
password: TGk2OW51eCo=
|
||||||
|
|
||||||
|
Example of a |VM| using secret as filesystem:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-fedora
|
||||||
|
name: vmi-fedora-secret
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
devices:
|
||||||
|
filesystems:
|
||||||
|
- name: app-secret-fs
|
||||||
|
virtiofs: {}
|
||||||
|
disks:
|
||||||
|
- disk:
|
||||||
|
bus: virtio
|
||||||
|
name: containerdisk
|
||||||
|
machine:
|
||||||
|
type: ""
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
terminationGracePeriodSeconds: 0
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: quay.io/containerdisks/fedora:latest
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
expire: false
|
||||||
|
password: fedora
|
||||||
|
user: fedora
|
||||||
|
bootcmd:
|
||||||
|
# mount the Secret
|
||||||
|
- "sudo mkdir /mnt/app-secret"
|
||||||
|
- "sudo mount -t virtiofs app-secret-fs /mnt/app-secret"
|
||||||
|
name: cloudinitdisk
|
||||||
|
- secret:
|
||||||
|
secretName: app-secret
|
||||||
|
name: app-secret-fs
|
||||||
|
|
||||||
|
|
||||||
|
Then, you can login to |VM| to verify:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
[fedora@vmi-fedora-secret ~]$ df -h
|
||||||
|
Filesystem Size Used Avail Use% Mounted on
|
||||||
|
/dev/vda5 4.0G 453M 3.1G 13% /
|
||||||
|
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||||
|
tmpfs 450M 0 450M 0% /dev/shm
|
||||||
|
tmpfs 180M 720K 179M 1% /run
|
||||||
|
tmpfs 450M 0 450M 0% /tmp
|
||||||
|
/dev/vda2 966M 61M 840M 7% /boot
|
||||||
|
/dev/vda3 100M 12M 89M 12% /boot/efi
|
||||||
|
/dev/vda5 4.0G 453M 3.1G 13% /home
|
||||||
|
app-secret-fs 94G 8.0K 94G 1% /mnt/app-secret
|
||||||
|
tmpfs 90M 4.0K 90M 1% /run/user/1000
|
||||||
|
[fedora@vmi-fedora-secret ~]$ ls -lrth /mnt/app-secret
|
||||||
|
total 0
|
||||||
|
lrwxrwxrwx. 1 root 107 15 Jan 15 16:43 username -> ..data/username
|
||||||
|
lrwxrwxrwx. 1 root 107 15 Jan 15 16:43 password -> ..data/password
|
@ -0,0 +1,72 @@
|
|||||||
|
.. WARNING: Add no lines of text between the label immediately following
|
||||||
|
.. and the title.
|
||||||
|
|
||||||
|
.. _vm-using-service-account-as-filesystem-5fd4deb7339a:
|
||||||
|
|
||||||
|
======================================
|
||||||
|
VM Using Service Account as Filesystem
|
||||||
|
======================================
|
||||||
|
|
||||||
|
A ``serviceaccount`` volume references a Kubernetes ``serviceaccount``. A
|
||||||
|
``serviceaccount`` can be presented to the |VM| as disk or as a filesystem.
|
||||||
|
|
||||||
|
The disk method does not support dynamic change propagation and the filesystem
|
||||||
|
method does not support live migration. Therefore, depending on the use-case,
|
||||||
|
one or the other may be more suitable.
|
||||||
|
|
||||||
|
By using filesystem, ``serviceaccounts`` are shared through ``virtiofs``. In
|
||||||
|
contrast with using disk for sharing ``serviceaccounts``, filesystem allows you
|
||||||
|
to dynamically propagate changes on ``serviceaccounts`` to |VMIs| (i.e. the
|
||||||
|
|VM| does not need to be rebooted).
|
||||||
|
|
||||||
|
.. rubric:: Limitation
|
||||||
|
|
||||||
|
Currently, |VMIs| cannot be live migrated since ``virtiofs`` does not support
|
||||||
|
live migration.
|
||||||
|
|
||||||
|
|
||||||
|
Example of a |VM| creation using default service account:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
apiVersion: kubevirt.io/v1
|
||||||
|
kind: VirtualMachineInstance
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
special: vmi-fedora-sa
|
||||||
|
name: vmi-fedora
|
||||||
|
spec:
|
||||||
|
domain:
|
||||||
|
devices:
|
||||||
|
filesystems:
|
||||||
|
- name: serviceaccount-fs
|
||||||
|
virtiofs: {}
|
||||||
|
disks:
|
||||||
|
- disk:
|
||||||
|
bus: virtio
|
||||||
|
name: containerdisk
|
||||||
|
machine:
|
||||||
|
type: ""
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: 1024M
|
||||||
|
terminationGracePeriodSeconds: 0
|
||||||
|
volumes:
|
||||||
|
- name: containerdisk
|
||||||
|
containerDisk:
|
||||||
|
image: quay.io/containerdisks/fedora:latest
|
||||||
|
- cloudInitNoCloud:
|
||||||
|
userData: |-
|
||||||
|
#cloud-config
|
||||||
|
chpasswd:
|
||||||
|
expire: false
|
||||||
|
password: fedora
|
||||||
|
user: fedora
|
||||||
|
bootcmd:
|
||||||
|
# mount the ConfigMap
|
||||||
|
- "sudo mkdir /mnt/serviceaccount"
|
||||||
|
- "sudo mount -t virtiofs serviceaccount-fs /mnt/serviceaccount"
|
||||||
|
name: cloudinitdisk
|
||||||
|
- name: serviceaccount-fs
|
||||||
|
serviceAccount:
|
||||||
|
serviceAccountName: default
|
@ -174,6 +174,7 @@
|
|||||||
.. |RPC| replace:: :abbr:`RPC (Remote Procedure Call)`
|
.. |RPC| replace:: :abbr:`RPC (Remote Procedure Call)`
|
||||||
.. |RST| replace:: :abbr:`rST (reStructuredText)`
|
.. |RST| replace:: :abbr:`rST (reStructuredText)`
|
||||||
.. |RVMC| replace:: :abbr:`RVMC (Redfish Virtual Media Controller)`
|
.. |RVMC| replace:: :abbr:`RVMC (Redfish Virtual Media Controller)`
|
||||||
|
.. |RWX| replace:: :abbr:`RWX (Read Write Many)`
|
||||||
.. |SAN| replace:: :abbr:`SAN (Subject Alternative Name)`
|
.. |SAN| replace:: :abbr:`SAN (Subject Alternative Name)`
|
||||||
.. |SANs| replace:: :abbr:`SANs (Subject Alternative Names)`
|
.. |SANs| replace:: :abbr:`SANs (Subject Alternative Names)`
|
||||||
.. |SAS| replace:: :abbr:`SAS (Serial Attached SCSI)`
|
.. |SAS| replace:: :abbr:`SAS (Serial Attached SCSI)`
|
||||||
@ -221,6 +222,8 @@
|
|||||||
.. |UFT| replace:: :abbr:`UFT (Unified Flow Tool)`
|
.. |UFT| replace:: :abbr:`UFT (Unified Flow Tool)`
|
||||||
.. |UUID| replace:: :abbr:`UUID (Universally Unique Identifier)`
|
.. |UUID| replace:: :abbr:`UUID (Universally Unique Identifier)`
|
||||||
.. |UUIDs| replace:: :abbr:`UUIDs (Universally Unique Identifiers)`
|
.. |UUIDs| replace:: :abbr:`UUIDs (Universally Unique Identifiers)`
|
||||||
|
.. |vCPU| replace:: :abbr:`vCPU (Virtual Central Processing Unit)`
|
||||||
|
.. |vCPUs| replace:: :abbr:`vCPUs (Virtual Central Processing Units)`
|
||||||
.. |VF| replace:: :abbr:`VF (Virtual Function)`
|
.. |VF| replace:: :abbr:`VF (Virtual Function)`
|
||||||
.. |VFIO| replace:: :abbr:`VFIO (Virtual Function I/O)`
|
.. |VFIO| replace:: :abbr:`VFIO (Virtual Function I/O)`
|
||||||
.. |VFs| replace:: :abbr:`VFs (Virtual Functions)`
|
.. |VFs| replace:: :abbr:`VFs (Virtual Functions)`
|
||||||
@ -231,6 +234,10 @@
|
|||||||
.. |VLANs| replace:: :abbr:`VLANs (Virtual Local Area Networks)`
|
.. |VLANs| replace:: :abbr:`VLANs (Virtual Local Area Networks)`
|
||||||
.. |VM| replace:: :abbr:`VM (Virtual Machine)`
|
.. |VM| replace:: :abbr:`VM (Virtual Machine)`
|
||||||
.. |VMs| replace:: :abbr:`VMs (Virtual Machines)`
|
.. |VMs| replace:: :abbr:`VMs (Virtual Machines)`
|
||||||
|
.. |VMI| replace:: :abbr:`VMI (Virtual Machine Instance)`
|
||||||
|
.. |VMIs| replace:: :abbr:`VMIs (Virtual Machine Instances)`
|
||||||
|
.. |VMIM| replace:: :abbr:`VMIM (Virtual Machine Instance Migration)`
|
||||||
|
.. |VMIRS| replace:: :abbr:`VMIRS (Virtual Machine Instance Replica Set)`
|
||||||
.. |VNC| replace:: :abbr:`VNC (Virtual Network Computing)`
|
.. |VNC| replace:: :abbr:`VNC (Virtual Network Computing)`
|
||||||
.. |VNF| replace:: :abbr:`VNF (Virtual Network Function)`
|
.. |VNF| replace:: :abbr:`VNF (Virtual Network Function)`
|
||||||
.. |VNFs| replace:: :abbr:`VNFs (Virtual Network Functions)`
|
.. |VNFs| replace:: :abbr:`VNFs (Virtual Network Functions)`
|
||||||
|
@ -1078,6 +1078,7 @@ virsh
|
|||||||
virt
|
virt
|
||||||
virtio
|
virtio
|
||||||
Virtio
|
Virtio
|
||||||
|
virtiofs
|
||||||
virtualization
|
virtualization
|
||||||
Virtualization
|
Virtualization
|
||||||
virtualized
|
virtualized
|
||||||
|
Loading…
Reference in New Issue
Block a user