OpenShift 虚拟化(上游项目 - Kubernetes:KubeVirt,请参阅。 и Kubernetes(原名容器原生虚拟化)是 OpenShift 平台的一项功能,旨在部署和管理虚拟机 (VM),而虚拟机正是 Kubernetes 的核心实体。由于技术上的根本差异,这类任务在技术上极具挑战性。为了实现这一目标,我们采用了基于 Red Hat Enterprise 的成熟技术。 Linux 还有 KVM,它们已经陪伴我们多年,并证明了它们的有效性。

在本文中,我们将研究 OpenShift 虚拟化的技术方面,这些技术使虚拟机和容器能够在单个平台中共存,并将它们作为单个实体进行管理。
计算任务
容器使用机制 Linux- 核心特性,例如命名空间和 cgroups,用于进程隔离和资源管理。进程通常被认为是 Python 或 Java 应用程序或可执行文件,但实际上,它们可以是任何进程,例如 bash、Emacs 或 vim。
什么是虚拟机? 从hypervisor的角度来看,这也是一个过程。 但不是应用程序进程,而是负责执行特定VM的KVM进程。

容器镜像包含KVM虚拟机所需的所有工具、库和文件。 如果我们检查正在运行的虚拟机的 pod,我们将看到那里的帮助程序和 qemu-kvm 进程。 此外,我们还可以使用用于管理虚拟机的 KVM 工具,例如 qemu-img、qemu-nbd 和 virsh。

由于虚拟机是一个 Pod,它会自动继承 Kubernetes 中 Pod 的所有功能。 VM Pod 与常规 Pod 一样,受调度程序方案和标准(例如污点、容忍度、亲和性和反亲和性)的约束。 您还可以获得高可用性等好处。 然而,有一个重要的区别:常规 Pod 不会按照通常的方式从一个主机迁移到另一个主机。 如果某个节点离线,该节点上的 Pod 将被终止并重新分配给集群中的另一个节点。 对于虚拟机,我们期望看到实时迁移。
为了解决这个问题,创建了自定义资源定义(CDR)来描述负责初始化、监视和管理工作节点之间虚拟机实时迁移的实时迁移机制。
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstanceMigration
metadata:
name: migration-job
spec:
vmiName: fedora
停用节点时,会自动为那些将实时迁移设置为驱逐策略的虚拟机创建迁移任务。 通过这种方式,您可以控制虚拟机在集群节点之间移动时的行为。 您可以像所有其他 Pod 一样配置实时迁移并管理虚拟机。
Сеть
任何 Kubernetes 系统都使用软件 SDN 网络提供节点和 Pod 之间的通信。 OpenShift 也不例外,从版本 3 开始,默认情况下使用 OpenShiftSDN。 此外,OpenShift 4 还有另一个名为 Multus 的新功能,它允许您使多个网络可用并同时将 Pod 连接到它们。

使用 Multus,管理员可以定义额外的 CNI 网络,然后使用专用的集群网络操作员将这些网络部署并配置到集群上。之后,Pod 会连接到一个或多个此类网络,通常是标准的 OpenShiftSDN 和一个额外的接口。SR-IOV 设备,标准 Linux 如果您的虚拟机需要,可以使用桥接、MACVLAN 和 IPVLAN 设备。下图展示了如何在 eth1 接口上为桥接网络配置 Multus CNI:
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: multus1
rawCNIConfig: '{ "cniVersion": "0.3.1", "type": "bridge", "master": "eth1", "ipam":
{ "type": "static", "addresses": [ { "address": "191.168.1.1/24" } ] } }'
type: Raw
就 OpenShift 虚拟化而言,这意味着虚拟机可以绕过 SDN 直接连接到外部网络。 这对于从 Red Hat Virtualization 或 VMware vSphere 迁移到 OpenShift 的虚拟机非常重要,因为如果您有权访问第二个 OSI 层,网络设置将不会发生变化。 这也意味着虚拟机可能具有绕过 SDN 的网络地址。 因此,我们可以有效地使用专门的网络适配器,或者通过网络直接连接到存储系统......
您可以详细了解如何创建 OpenShift 虚拟化虚拟机并将其连接到网络 。 另外, 作为 OpenShift 虚拟化的一部分部署,提供了另一种熟悉的方式来创建和管理虚拟机管理程序下使用的物理节点上的网络配置。
存储
OpenShift 虚拟化中的连接和管理虚拟机磁盘是使用 Kubernetes 概念(例如 StorageClasses、PersistentVolumeClaims (PVC) 和 PersistentVolume (PV))以及 Kubernetes 环境的存储协议标准来执行的。 这为 Kubernetes 管理员和应用程序团队提供了一种通用、熟悉的方式来管理容器和虚拟机。 对于许多虚拟化环境的管理员来说,这个概念可能听起来很熟悉,因为它使用与 OpenStack 和许多其他云平台中使用的相同的分离 VM 配置文件和磁盘的原理。
但是,我们不能每次都简单地为虚拟机创建一个新磁盘,因为从虚拟机管理程序迁移到 OpenShift 时,我们需要保存数据。 是的,即使我们部署新的虚拟机,从模板进行部署也总是比从头开始创建要快。 因此,我们需要导入现有磁盘的功能。
为了简化此任务,OpenShift 虚拟化部署了容器化数据导入器 (CDI) 项目,该项目减少了从多个源导入磁盘的磁盘映像以创建 PVC 条目的次数。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "fedora-disk0"
labels:
app: containerized-data-importer
annotations:
cdi.kubevirt.io/storage.import.endpoint: "http://10.0.0.1/images/Fedora-Cloud-Base-31-1.9.x86_64.qcow2"
spec:
storageClassName: ocs-gold
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
正是这个条目激活了 CDI,触发了下图所示的操作序列:

CDI 完成后,PVC 将包含可供使用的虚拟机磁盘并转换为标准 OpenShift 格式...
在使用 OpenShift 虚拟化时,OpenShift Container Storage (OCS)(一种基于 Ceph 文件系统的红帽解决方案,可为容器实现持久存储功能)也很有用。 除了标准 PVC 访问方法 - RWO(块)和 RWX(文件)之外,OCS 还为原始块设备提供 RWX,这对于具有高性能要求的应用程序共享块访问非常有用。 此外,OCS支持新的Object Bucket Claim标准,允许应用程序直接使用对象数据存储。
容器中的虚拟机
如果您有兴趣了解其工作原理,请注意 OpenShift 虚拟化已作为 OpenShift 3.11 及更高版本的一部分在技术预览版中提供。 现有 OpenShift 订阅的所有者可以完全免费使用 OpenShift 虚拟化,无需任何额外步骤。 在撰写本文时,OpenShift 4.4 和 OpenShift 虚拟化 2.3 是最新版本;如果您使用的是以前的版本,则应该升级以获得最新功能。 完全受支持的 OpenShift 虚拟化版本应于 2020 年下半年发布。
欲了解更多信息,请参阅 安装说明,包括 ,它提供有关设置外部网络的信息。
来源: habr.com
