1
2
3
4
5
作者:李晓辉

微信联系:lxh_chat

联系邮箱: 939958092@qq.com

OpenShift里头有好多资源,能帮咱们在集群里头把应用给跑起来。Pod呢,就是在OpenShift集群里头执行容器的家伙。Pod资源可以执行一个或者多个容器。这些资源就是你跑着的应用实例。要是想跟容器打交道,可以用Pod管理工具。

在Kubernetes里头,工作负载资源能帮着应用管,这样就不用老是直接去碰应用的Pod了。

最常见的工作负载资源:

  • Deployments:Deployment对象是个资源,它靠Pod模板来描述你应用以及组件想要达到的理想状态。它用这个模板来创建应用的运行实例。Deployment会跟Replica Set资源一起配合,确保你的应用有足够数量的Pod。

  • Replica Sets:Replica Set资源,不管是单独用还是跟Deployment一起用,都能保证集群里头有指定数量的Pod副本处于健康状态。Replica Set用基于集合的选择器来认出集群里的Pod。它会自动创建、更新或者删除Pod,就为了维持Deployment里头设定的那个状态。

  • Daemon Sets:Daemon Set资源能保证在每个选中的节点上都跑着一个Pod。跟Replica Set不一样,Daemon Set不局限于特定数量的副本。要是集群里头新加入了一个符合条件的节点,Daemon Set就会自动在那个节点上创建Pod。要是把Daemon Set给删了,集群也会自动把相关的Pod清理干净。

  • Stateful Sets:Stateful Set是一组执行有状态应用的Pod,这些Pod有稳定、独特的身份(网络和存储)。Stateful Set这个工作负载资源很有用,能指向同一个存储身份,这样就能一直保存应用的持久化数据。

工作负载控制器、虚拟机(VM)和虚拟机实例(VMI)的区别

  • 工作负载控制器(Workload Controllers)

    • 定义:工作负载控制器是 Kubernetes 中用来管理应用部署和运行的工具。它们通过定义应用的期望状态,自动管理应用的生命周期。
    • 常见类型
      • Deployments:通过 Pod 模板定义应用的期望状态,确保应用有指定数量的 Pod 在运行。
      • Replica Sets:确保指定数量的 Pod 副本处于健康状态。
      • Daemon Sets:确保每个节点上都运行一个 Pod。
      • Stateful Sets:管理有状态应用,确保每个 Pod 有稳定的网络和存储身份。
  • 虚拟机(VM)

    • 定义:虚拟机是一个虚拟环境,模拟了物理机的资源,包括 CPU、内存、网络接口和存储。它就像一个完整的计算机,可以运行操作系统和应用程序。
    • 特点
      • 独立性:每个 VM 都是一个独立的环境,有自己的操作系统和资源。
      • 持久性:VM 通常会保存应用的状态和持久化数据,类似于 StatefulSet 管理的 Pod。
      • 资源隔离:VM 之间相互隔离,不会互相影响。
  • 虚拟机实例(VMI)

    • 定义:在 Red Hat OpenShift Virtualization 中,VMI 是 VM 的运行实例。VMI 是由 VM 模板创建的,具体运行在 Kubernetes 集群中的一个 Pod 里。
    • 工作原理
      • VM 对象:定义了 VMI 的模板,告诉 Kubernetes 如何创建 VMI。
      • VMI 的生命周期
        • 创建:当 VM 被创建并启动时,virt-controller Pod 会通知集群节点上的 virt-handler Pod 创建一个 virt-launcher Pod。
        • 运行virt-launcher Pod 包含一个运行的 libvirtd 容器实例,用来执行 VMI,确保 VMI 作为一个独立的进程运行。
        • 删除:如果 VMI 被删除,Kubernetes 会根据 VM 对象的配置重新生成一个新的 VMI 实例。

我们来总结一下:

  • 工作负载控制器:管理 Kubernetes 集群中的应用部署和运行,通过定义期望状态来自动管理应用的生命周期。
  • 虚拟机(VM):模拟物理机的资源,运行完整的操作系统和应用程序,具有独立性和持久性。
  • 虚拟机实例(VMI):VM 的运行实例,由 VM 模板创建,具体运行在 Kubernetes 集群中的一个 Pod 里,由 virt-launcher Pod 来管理。

OpenShift 虚拟机的组成部分

因为VMI(虚拟机实例)存在于Pod中,所以它们有各种组件来执行和维护工作负载的健康状况。这些组件包括控制台访问、网络接口、virt-launcher Pod、持久卷和持久卷声明。

  • 虚拟机控制台
    • VNC控制台:VNC(虚拟网络计算)控制台通过VNC连接到VMI控制台。VNC控制台根据VMI操作系统的配置,提供基于文本和图形的控制台。VNC是通过OpenShift Web控制台访问VMI的“控制台”选项卡时的默认选择。
    • 串行控制台:串行控制台通过其串行端口连接到VMI的基于文本的控制台。
    • RDP控制台:RDP(远程桌面协议)为基于Windows的VMI提供了一个图形工具。要使用RDP控制台,必须在VMI上安装并运行QEMU(快速模拟器)客户机代理。

当你使用OpenShift Web控制台时,可以在不同类型的控制台之间切换。

  • 网络接口

    • 默认Pod网络:默认Pod网络为VMI从集群的Pod网络分配一个IP地址。要使用默认Pod网络,网络接口必须使用伪装绑定方法。伪装绑定使用NAT(网络地址转换),使集群中的其他Pod能够与VMI通信。默认情况下,VMI只能在集群内访问。
    • Multus:你可以使用容器网络接口(CNI)插件Multus,将VM连接到多个接口和外部网络。Multus提供了一个自定义资源定义(CRD),称为网络附加定义(NAD),使你能够将Pod、VM或VMI连接到一个或多个网络。
    • 单根I/O虚拟化:VMI还可以使用单根I/O虚拟化(SR-IOV)设备,使VMI能够连接到虚拟功能网络,以实现高性能。
  • 持久卷和持久卷声明
    持久卷(PV)是持久卷API对象配置的存储资源。PV代表集群内现有的存储。你可以使用持久卷声明(PVC)将PV附加到VMI,这代表对特定存储资源的请求。

  • 启动源
    集群使用启动源来实例化VM。启动源是一个完全配置的磁盘映像,包含VM的操作系统(OS)、驱动程序和其他初始数据。启动源可以是RAW或QCOW2格式的云映像、ISO格式的安装磁盘映像、容器镜像注册表中的容器磁盘,或者是PVC。你可以从本地系统上传启动源,使用现有卷,使用现有快照,或者从注册表下载卷。从注册表下载会创建一个dataimportcron资源,该资源定义了一个cron作业,用于拉取和导入磁盘映像。

你还可以使用来自容器注册表(如Quay.io)的基础操作系统映像。要查看、添加或管理Web控制台中的可用启动源,请转到虚拟化→可启动卷。

golden映像是一个预配置的VM快照,你可以将其用作创建VM的启动源。golden映像是通过在VM上安装和配置操作系统及应用程序创建的。创建golden映像后,将其保存为模板或映像文件。Red Hat的启动源是作为容器磁盘在注册表中发布的golden映像,适用于Red Hat Enterprise Linux(RHEL)的版本。Red Hat golden映像会自动更新到操作系统的最新版本,并在安装OpenShift虚拟化后同步到连接的OpenShift集群。容器化数据导入器(CDI)将golden映像从Red Hat导入到openshift-virtualization-os-images项目中,作为快照或PVC。你可以使用golden映像来创建VM。你可以编辑标签和注释,或者删除配置的卷,但不能管理其他属性。

  • 配置映射和密钥
    配置映射是一种资源类型,包含其他资源可以使用的键值对。配置映射和密钥集中了多个资源使用的配置值。密钥的值始终被编码(不是加密),并且其访问权限仅限于授权用户。

要将配置映射和密钥添加到VM,你必须创建一个包含配置映射或密钥的磁盘。在将配置映射或密钥附加到VM之前,必须先创建它们。添加包含配置映射或密钥的磁盘后,必须启动VM,并从VM控制台手动挂载磁盘。

虚拟机创建和管理的关键组件

在 Red Hat OpenShift 提供虚拟化功能的组件中,集群将组件按照层级结构组织起来。处于层级结构中较高位置的组件(例如 virt-controller)会协调较低位置的组件(例如 virt-handler 守护进程集和虚拟机的 Pod)。

architectural-overview

在 Red Hat OpenShift Virtualization 中,创建和管理虚拟机的过程涉及多个关键组件,它们协同工作以确保虚拟机的生命周期管理高效且可靠。以下是这些组件及其功能的详细说明:

  • Virt-Controller

    • 功能:Virt-controller 是一个操作符(operator),它负责监控新的 VMI(虚拟机实例)对象。
    • 作用:它确保 VM(虚拟机)对象的定义状态得以实现,管理虚拟机的整个生命周期,包括创建、启动、停止和删除虚拟机。
  • Virt-Handler

    • 功能:Virt-handler 是一个守护进程集(daemon set),它在每个节点上运行。
    • 作用:它执行必要的操作以满足 VM 对象的定义状态。Virt-handler 监控 VM 的变化,并创建 virt-launcher 容器。
  • Virt-Launcher

    • 功能:Virt-launcher 容器在每个 VM 的 Pod 中运行。
    • 作用:它使用本地的 libvirtd 实例来实例化 VM,提供低级别的虚拟化架构,并与内核交互以管理 VM 进程的生命周期。当 VMI 被配置时,virt-launcher Pod 会将 IPv4 流量路由到 VMI 的 DHCP 地址。这种路由方式使你能够通过端口转发连接到 VMI。
  • Libvirtd

    • 功能:Libvirtd 是一个本地实例,提供低级别的虚拟化架构。
    • 作用:它与内核交互以管理 VM 进程的生命周期。Libvirtd 实例还包括 virsh 命令,用于管理 VM。这个工具提供了多个命令,用于列出、启动、停止或重启 VM:
      • virsh list:列出所有正在运行的 VM。
      • virsh start:启动一个 VM。
      • virsh shutdown:关闭一个 VM。
      • virsh dumpxml:将 VM 的 XML 配置转储到 STDOUT。你可以用它来更新现有的 VM,或者用它作为模板来创建另一个 VM。
      • virsh reset:在不先关闭的情况下重置一个 VM。
      • virsh restore:从保存的文件中恢复一个 VM。
      • virsh migrate:将一个 VM 迁移到另一个主机。

要使用 virsh 命令管理 VMI,你需要访问 VM 的 virt-launcher Pod。你可以通过 Web 控制台访问 virt-launcher 终端:

  1. 登录到 OpenShift Web 控制台。
  2. 导航到 工作负载(Workloads)→ Pods
  3. 找到对应 VMI 的 virt-launcher Pod 并选择它。
  4. 点击 终端(Terminal)

通过这些步骤,你就可以在 virt-launcher Pod 的终端中使用 virsh 命令来管理你的 VMI 了,如下图所示:

access-virt-launcher

virsh和virtctl使用案例

virsh

使用 virshvirtctl 管理虚拟机(VM)和虚拟机实例(VMI)案例如下:

使用 virsh 列出所有虚拟机

virt-launcher Pod 中,可以使用 virsh list 命令列出所有虚拟机:

1
virsh list
1
2
3
4
Authorization not available. Check if polkit service is running or see debug message for more information.
Id Name State
------------------------------------------------
1 network-services_mariadb-client running
  • 输出说明
    • Id:虚拟机的唯一标识符。
    • Name:虚拟机的名称,通常由命名空间和虚拟机名称组成。
    • State:虚拟机的当前状态,例如 runningpausedshutoff 等。

使用 virsh shutdown 命令关闭虚拟机:

1
virsh shutdown network-services_mariadb-client
1
2
Authorization not available. Check if polkit service is running or see debug message for more information.
Domain network-services_mariadb-client is being shutdown
  • 输出说明
    • 如果权限不足,会提示 Authorization not available
    • 如果成功,会显示 Domain network-services_mariadb-client is being shutdown

使用 virsh event 命令列出虚拟机的所有事件:

1
virsh event network-services_mariadb-client --all
1
2
3
4
Authorization not available. Check if polkit service is running or see debug message for more information.
event graphics for domain network-services_mariadb-client: connect local[unix /var/run/kubevirt-private/eef4df71-793c-474f.../virt/vnc] remote[unix ]
none
events received: 1
  • 输出说明
    • event graphics:显示与虚拟机相关的图形连接事件。
    • events received:显示接收到的事件数量。

virtctl

virtctl 是一个用于管理虚拟机和虚拟机实例的命令行工具。它可以用来启动、停止、暂停、重启或迁移虚拟机,还可以连接到虚拟机实例的串行控制台或创建端口转发服务。

使用 virtctl stop 命令停止虚拟机:

1
2
[lxh@host1 ~]$ virtctl stop vm-name
VM vm-name was scheduled to stop
  • 输出说明
    • 如果成功,会显示 VM vm-name was scheduled to stop

独立虚拟机实例(Stand-alone VMIs)

独立虚拟机实例(VMI)是独立于 OpenShift Virtualization 环境创建的。你可以通过命令行界面(CLI)和自动化脚本来创建独立 VMI。你可以使用 Web 控制台或 oc 命令来管理独立 VMI,就像管理 VM 资源一样。

要列出集群中的所有 VMI,包括独立 VMI,可以使用 oc get vmis 命令:

1
2
3
4
[lxh@host1 ~]$ oc get vmis -A
NAMESPACE NAME AGE PHASE ...
network-services mariadb-vm-1 5m Running ...
network-database postgresql-vm-1 59m Running ...
  • 输出说明
    • NAMESPACE:VMI 所在的命名空间。
    • NAME:VMI 的名称。
    • AGE:VMI 的运行时间。
    • PHASE:VMI 的当前状态,例如 RunningPendingSucceeded 等。

创建虚拟机(VM)的用例

在 Red Hat OpenShift Virtualization 中,你可以通过多种方式创建虚拟机(VM),例如使用 Red Hat 提供的预定义模板和实例类型、自定义模板、声明式清单文件、克隆现有 VM 对象,或者通过迁移操作符和导入。

以下是创建 VM 的最常见方法:

使用模板创建 VM

模板 是预定义的配置,包含创建 VM 所需的默认参数。这些参数通常来自 Red Hat 提供的可用启动源配置。你可以根据 VM 内部配置的应用程序需求自定义这些参数,例如启动源、计算资源或 SSH 密钥。你还可以创建定义这些自定义设置和启动源的模板。从模板创建 VM 后,你可以覆盖模板中定义的任何参数。

使用实例类型创建 VM

实例类型 是一个可重用的对象,你可以在其中定义要应用于新 VM 的资源和特性。你可以定义自定义实例类型,或者使用 OpenShift Virtualization 默认包含的类型。实例类型必须定义 CPU 和内存资源,其他属性是可选的。

从预定义实例类型创建 VM 时,你不能覆盖实例类型中定义的任何参数。因为实例类型定义了所需的 CPU 和内存资源,所以 OpenShift Virtualization 在从实例类型创建 VM 时总是拒绝这些资源的额外请求。预定义的实例类型称为 common-instancetypes

使用声明式文件创建 VM

声明式文件 是定义创建 VM 所需参数的清单文件。这些文件对于自动化非常有用,例如管理 GitOps 工作流。VM 清单必须是 YAML 格式。你可以在 VM 清单中使用实例类型来简化配置。创建 VM 清单后,可以使用 oc create -f <filename> 命令从文件创建 VM。

virtctl 命令可以创建 VM 基础清单,其中一些参数已经配置,例如名称、运行策略或内存。该命令将 VM 的配置以 YAML 格式输出到 STDOUT,你可以将其复制并粘贴到 YAML 文件中。

1
2
3
4
5
6
7
8
9
10
11
12
[lxh@host1 ~]$ virtctl create vm --name mariadb-prod
apiVersion: kubevirt.io/v1
kind: VirtualMachine
...output omitted...
spec:
domain:
devices: {}
memory:
guest: 512Mi
resources: {}
terminationGracePeriodSeconds: 180
status: {}