容器原生虚拟化

OpenShift Container Platform 4.4

容器原生虚拟化安装、使用与发行注记

Red Hat OpenShift Documentation Team

摘要

本文档提供有关如何在 OpenShift Container Platform 中使用容器原生虚拟化的信息。

第 1 章 关于容器原生虚拟化

了解容器原生虚拟化的功能与支持范围。

1.1. 容器原生虚拟化的作用

容器原生虚拟化(container-native virtualization)是 OpenShift Container Platform 的一个附加组件,可用于运行和管理虚拟机工作负载以及容器工作负载。

容器原生虚拟化通过 Kubernetes 自定义资源添加新对象至 OpenShift Container Platform 集群中,以启用虚拟化任务。这些任务包括:

  • 创建和管理 Linux 和 Windows 虚拟机
  • 通过各种控制台和 CLI 工具连接至虚拟机
  • 导入和克隆现有虚拟机
  • 管理虚拟机上附加的网络接口控制器和存储磁盘
  • 在节点间实时迁移虚拟机

增强版 web 控制台提供了一个图形化的门户界面 来管理虚拟化资源以及 OpenShift Container Platform 集群容器和基础架构。

您可以将容器原生虚拟化用于 OVN-KubernetesOpenShiftSDN 网络供应商。

1.2. 容器原生虚拟化支持

重要

容器原生虚拟化仅是一项技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

第 2 章 容器原生虚拟化发行注记

2.1. 容器原生虚拟化发行注记

2.1.1. 关于容器原生虚拟化 2.3

2.1.1.1. 容器原生虚拟化的作用

容器原生虚拟化(container-native virtualization)是 OpenShift Container Platform 的一个附加组件,可用于运行和管理虚拟机工作负载以及容器工作负载。

容器原生虚拟化通过 Kubernetes 自定义资源添加新对象至 OpenShift Container Platform 集群中,以启用虚拟化任务。这些任务包括:

  • 创建和管理 Linux 和 Windows 虚拟机
  • 通过各种控制台和 CLI 工具连接至虚拟机
  • 导入和克隆现有虚拟机
  • 管理虚拟机上附加的网络接口控制器和存储磁盘
  • 在节点间实时迁移虚拟机

增强版 web 控制台提供了一个图形化的门户界面 来管理虚拟化资源以及 OpenShift Container Platform 集群容器和基础架构。

您可以将容器原生虚拟化用于 OVN-KubernetesOpenShiftSDN 网络供应商。

2.1.1.2. 容器原生虚拟化支持

重要

容器原生虚拟化仅是一项技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

2.1.2. 新增和改变的功能

  • Microsoft 的 Windows 服务器虚拟化验证程序 (SVVP) 中认证的容器原生虚拟化可运行 Windows 服务器工作负载。

    • SVVP 认证适用于 Intel 和 AMD CPU。
    • SVVP Certificate Red Hat Enterprise Linux CoreOS 8 worker 的名称为 Red Hat OpenShift Container Platform 4 on RHEL CoreOS 8
  • 提供了与 Microsoft Windows 10 兼容的新模板。

2.1.2.1. 网络

  • 现在,您可以使用容器原生虚拟化用于 OVN-KubernetesOpenShiftSDN 网络供应商。
  • 容器原生虚拟化使用 nmstate 来报告并配置节点网络的状态。这样就可以通过将单个配置清单应用到集群来修改网络策略配置,例如在所有节点上创建或删除 Linux 网桥、绑定和 VLAN 设备。

    • 如需更多信息,请参阅 节点网络中的内容。

2.1.2.2. 存储

  • 现在,您可以将虚拟机磁盘导入、上传并克隆到命名空间中,这可能受 CPU 和内存资源限制。
  • virtctl 工具现在可以异步监控服务器端上传后处理,并更准确地报告虚拟机磁盘上传的状态。

2.1.2.3. Web 控制台

  • 现在,您可以在 web 控制台中查看状态为 Paused 的虚拟机。Web 控制台在 Virtual Machines 仪表板和 Virtual Machine Details 页面中显示这个状态。
注意

您还可以使用 oc CLI 查看状态为 Pause 的虚拟机 :

$ oc get vmi testvm -o=jsonpath='{.status.conditions[?(@.type=="Paused")].message}'
  • 如果虚拟机的状态为 Paused,您现在可 从 web 控制台取消暂停它
  • 您可以查看和管理独立于虚拟机列表中的虚拟机的虚拟机实例。
  • 容器原生虚拟化允许您在虚拟机向导中配置光盘。您可以从下拉列表中选择 CD-ROM 配置类型: ContainerURLAttach Disk。您可以在 Virtual Machine Details 页中编辑 CD-ROM 配置
  • 引导顺序列表现在包括在 Virtual Machine Details 中。您可以添加项目,删除项目,并修改引导顺序列表。
  • 虚拟机和虚拟机模板向导现在为不同的操作系统验证 CPU 和内存大小,以及磁盘总线要求。如果您试图创建不满足特定操作系统要求的虚拟机或虚拟机模板,向导会发出资源警告。
  • 现在,您可以在 Virtual Machine Details 页中查看并配置虚拟机专用资源。当您启用专用资源时,请确保您的虚拟机工作负载在没有被其他进程使用的 CPU 上运行。这可以提高虚拟机的性能以及延迟预测的准确性。

2.1.3. 主要的技术变化

  • 您需要在一个名为 openshift-cnv 的单一命名空间中服务容器原生虚拟化。如果不存在,现在会在部署过程中自动创建 openshift-cnv 命名空间。
  • 为防止错误,您无法重命名在容器原生虚拟化部署过程中创建的 CNV Operator Deployment 自定义资源。如果您尝试创建名称不是 kubevirt-hyperconverged(默认名称) 的自定义资源,则创建将失败,并在 web 控制台中显示错误消息。
  • 为了防止无意中的数据丢失,如果集群定义了虚拟机或 DataVolume,则无法再卸载容器原生虚拟化。

    • 您必须手动删除所有 虚拟机 (VM)、虚拟机实例 (VMI) 和 DataVolume (DV),然后才能卸载容器原生虚拟化。
    • 当尝试卸载容器原生虚拟化时,如果存在 VM、VMI 或 DV 对象,则卸载过程不会完成,直到删除了所有剩余对象。

      注意

      要确认因为待处理对象而导致卸载暂停,请查看 Events 选项卡。

2.1.4. 已知问题

  • KubeMacPool 在 container-native virtualization 2.3 中被禁用。这意味着,Pod 或虚拟机的辅助接口获得随机生成的 MAC 地址,而不是池中的唯一 MAC 地址。虽然这种情况会非常少,但随机分配的 MAC 地址可能会存在冲突。(BZ#1816971)
  • 有时,在 web 控制台中编辑 Container-native virtualization Operator 的订阅频道时,点击 Subscription OverviewChannel 按钮会导致 JavaScript 错误。(BZ#1796410)

    • 作为临时解决方案,通过运行以下 oc patch 命令,从 CLI 触发容器原生虚拟化 2.3 的升级过程:

      $ export TARGET_NAMESPACE=openshift-cnv CNV_CHANNEL=2.3 && oc patch -n "${TARGET_NAMESPACE}" $(oc get subscription -n ${TARGET_NAMESPACE} --no-headers -o name) --type='json' -p='[{"op": "replace", "path": "/spec/channel", "value":"'${CNV_CHANNEL}'"}, {"op": "replace", "path": "/spec/installPlanApproval", "value":"Automatic"}]'

      这个命令将您的订阅指向升级频道 2.3 并启用自动更新。

  • 在虚拟机和虚拟机模板向导中,virtIO 是附加一个 CD-ROM 时的默认接口。但是,virtIO CD-ROM 无法通过虚拟机的验证过程,因此不能被创建。(BZ#1817394)

    • 作为临时解决方案,在创建虚拟机和虚拟机模板时,选择 SATA 作为 CD-ROM 接口。
  • Containerized Data Importer (CDI) 不总是使用 CDIConfig 对象中的 scratchSpaceStorageClass 设置来导入和上传操作。相反,CDI 使用默认存储类来分配暂存空间。(BZ#1828198)

    • 这个问题的一个解决方案是,确保您为集群定义了一个默认存储类。以下命令可用于应用所需的注解:

      $ oc patch storageclass <STORAGE_CLASS_NAME> -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
  • 如果在部署早期版本的容器原生虚拟化时重命名了 Operator 部署自定义资源,则无法直接升级到容器原生虚拟化 2.3。自定义资源必须命名为 kubevirt-hyperconverged,这是默认名称。(BZ#1822266)

    • 作为临时解决方案,您可以:

      • 将现有自定义资源重命名为 kubevirt-hyperconverged
      • 创建一个新的、名为 kubevirt-hyperconverged(默认名称)的自定义资源。然后,删除名称不是 kubevirt-hyperconverged 的 的自定义资源。
  • 当您向虚拟机中添加 NIC 时,OpenShift Container Platform 4.4 web 控制台包含了 slirp 作为选项,但 slirp 不是有效的 NIC 类型。在向虚拟机中添加 NIC 时,不要选择 slirp 。(BZ#1828744)
  • 迁移后,会为虚拟机分配一个新的 IP 地址。但是,oc get vmioc describe vmi 命令仍会生成包含过时 IP 地址的输出。(BZ#1686208)

    • 作为临时解决方案,请运行以下命令来查看正确的 IP 地址:

      $ oc get pod -o wide
  • 没有管理员权限的用户,无法使用虚拟机向导在 L2 网络中的项目中添加网络接口。此问题是由于缺少允许用户加载网络附加定义的权限造成的。(BZ#1743985)

    • 作为临时解决方案,请为用户提供加载网络附加定义的权限。

      1. 使用以下示例将 ClusterRoleClusterRoleBinding 对象定义到 YAML 配置文件:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRole
        metadata:
         name: cni-resources
        rules:
        - apiGroups: ["k8s.cni.cncf.io"]
         resources: ["*"]
         verbs: ["*"]
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRoleBinding
        metadata:
          name: <role-binding-name>
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: cni-resources
        subjects:
        - kind: User
          name: <user to grant the role to>
          namespace: <namespace of the user>
      2. 作为 cluster-admin 用户,运行以下命令来创建您定义的 ClusterRoleClusterRoleBinding 对象:

        $ oc create -f <filename>.yaml
  • 当节点具有不同的 CPU 型号时,实时迁移会失败。即使节点具有相同的物理 CPU 型号,微代码更新引入的差异也会产生同样的问题。这是因为默认设置触发了主机 CPU 透传行为,这与实时迁移不兼容。(BZ#1760028)

    • 作为临时解决方案,请在 kubevirt-config ConfigMap 中设置默认 CPU 型号,如下例所示:

      注意

      您必须在启动支持实时迁移的虚拟机前进行此更改。

      1. 运行以下命令,打开 kubevirt-config ConfigMap 以进行编辑:

        $ oc edit configmap kubevirt-config -n openshift-cnv
      2. 编辑 ConfigMap:

        kind: ConfigMap
        metadata:
          name: kubevirt-config
        data:
          default-cpu-model: "<cpu-model>" 1
        1
        <cpu-model> 替换为实际 CPU 型号值。要确定此值,您可以为所有节点运行 oc describe node <node> 并查看 cpu-model-<name> 标签。选择所有节点上出现的 CPU 型号。
  • 当尝试使用 Haswell CPU 创建和启动虚拟机时,因为标记为错误的节点,虚拟机的启动可能会失败。这是对容器原生虚拟化之前版本的更改。在以前的版本中,虚拟机可以在 Haswell 主机上成功启动。(BZ#1781497)

    作为临时解决方案,在可能的情况下选择不同的 CPU 模型。

  • 由于 Operator Lifecycle Manager (OLM) 的中断,容器原生虚拟化升级过程偶尔会失败。造成此问题的原因是使用声明性 API 来跟踪容器原生虚拟化 Operator 状态具有局限性。在安装过程中启用自动更新降低了遇到此问题的风险。(BZ#1759612)
  • 容器原生虚拟化无法可靠识别由运行 oc adm drainkubectl drain 触发的节点排空。不要在部署容器原生虚拟化的任何集群节点上运行这些命令。节点上如有虚拟机正在运行,则不会排空。当前解决方案为将节点设置为维护模式。(BZ#1707427)
  • 如果您导航到 OperatorsInstalled Operators 页面上的 Subscription 选项卡,并点击当前升级频道编辑它,则可能没有可见的结果。如果是这种情况,并不代表有不可见的错误。(BZ#1796410)

    • 作为临时解决方案,通过运行以下 oc patch 命令,从 CLI 触发容器原生虚拟化 2.3 的升级过程:

      $ export TARGET_NAMESPACE=openshift-cnv CNV_CHANNEL=2.3 && oc patch -n "${TARGET_NAMESPACE}" $(oc get subscription -n ${TARGET_NAMESPACE} --no-headers -o name) --type='json' -p='[{"op": "replace", "path": "/spec/channel", "value":"'${CNV_CHANNEL}'"}, {"op": "replace", "path": "/spec/installPlanApproval", "value":"Automatic"}]'

      这个命令将您的订阅指向升级频道 2.3 并启用自动更新。

第 3 章 容器原生虚拟化安装

3.1. 为容器原生虚拟化配置集群

要获取 OpenShift Container Platform 的评估版本,请从 OpenShift Container Platform 主页下载一个试用版。

在默认情况下,容器原生虚拟化可以与 OpenShift Container Platform 协同工作,但推荐进行以下安装配置:

  • OpenShift Container Platform 集群安装在裸机上。根据集群中要托管的虚拟机的数量和大小来管理您的计算节点。
  • 在集群中配置监控

3.2. 安装容器原生虚拟化

安装容器原生虚拟化以便在 OpenShift Container Platform 集群中添加虚拟化功能。

您可以使用 OpenShift Container Platform 4.4 web 控制台来订阅和部署容器原生虚拟化 Operator。

3.2.1. 先决条件

  • OpenShift Container Platform 4.4
重要

容器原生虚拟化仅是一项技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

3.2.2. 订阅容器原生虚拟化目录(Container-native virtualization catalog)

安装容器原生虚拟化之前,请先通过 OpenShift Container Platform web 控制台订阅 Container-native virtualization 目录。订阅会授予 openshift-cnv 命名空间对容器原生虚拟化 Operator 的访问权限。

流程

  1. 打开浏览器窗口并登录 OpenShift Container Platform web 控制台。
  2. 导航到 OperatorsOperatorHub 页面。
  3. 搜索 OpenShift Virtualization 并选择它。
  4. 阅读 Operator 信息并单击 Install
  5. Create Operator Subscription 页面中:

    1. 对于安装的命名空间,请确保选择了 Operator 推荐的命名空间选项。这会在 openshift-cnv 命名空间中安装 Operator,该命名空间在不存在时自动创建。

      警告

      尝试在 openshift-cnv 以外的命名空间中安装容器原生虚拟化 Operator 会导致安装失败。

    2. 从可用 Update Channel 选项列表中选择 2.3
    3. 对于 Approval Strategy,请确保已选择默认值 Automatic。当有新 z-stream 发行版可用时,容器原生虚拟化将自动更新。
  6. 点击 Subscribe 使 Operator 可供 openshift-cnv 命名空间使用。

    Installed Operators 屏幕上,当容器原生虚拟化完成安装时 Status 会显示为 Succeeded

3.2.3. 部署容器原生虚拟化

创建 CNV Operator Deployment 自定义资源来部署容器原生虚拟化。

先决条件

  • openshift-cnv 命名空间中的一个有效的容器原生虚拟化目录订阅。

流程

  1. 导航到 OperatorsInstalled Operators 页面。
  2. 点击 OpenShift Virtualization
  3. 点击 CNV Operator Deployment 选项卡,然后点击 Create HyperConverged Cluster

    警告

    要避免部署错误,请不要重命名自定义资源。在执行下一步之前,请确保自定义资源名为默认的kubevirt-hyperconverged

  4. 查看 YAML,确保 BareMetalPlatform: true。如有必要,在继续操作前将值从 false 更改为 true
  5. 点击 Create 以启动容器原生虚拟化。
  6. 导航到 WorkloadsPods 页面,并监控容器原生虚拟化 Pod,直至全部处于 Running 状态。在所有 Pod 均处于 Running 状态后,您即可访问容器原生虚拟化。

3.3. 安装 virtctl 客户端

virtctl 客户端是用于管理容器原生虚拟化资源的命令行实用程序。

通过启用容器原生虚拟化存储库并安装 kubevirt-virtctl 软件包,将客户端安装到您的系统中。

3.3.1. 启用容器原生虚拟化存储库

红帽为 Red Hat Enterprise Linux 8 和 Red Hat Enterprise Linux 7 提供容器原生虚拟化存储库:

  • Red Hat Enterprise Linux 8 软件仓库:cnv-2.3-for-rhel-8-x86_64-rpms
  • Red Hat Enterprise Linux 7 软件仓库:rhel-7-server-cnv-2.3-rpms

subscription-manager 中启用存储库的过程与在两个平台中启用的过程相同。

流程

  • 使用 subscription manager 为您的系统启用适当的容器原生虚拟化存储库:

    # subscription-manager repos --enable <repository>

3.3.2. 安装 virtctl 客户端

kubevirt-virtctl 软件包安装 virtctl 客户端。

流程

  • 安装 kubevirt-virtctl 软件包:

    # yum install kubevirt-virtctl

另请参阅:使用 CLI 工具进行容器原生虚拟化。

3.4. 卸载容器原生虚拟化

您可使用 OpenShift Container Platform web 控制台来卸载容器原生虚拟化。

3.4.1. 先决条件

  • 已安装容器原生虚拟化 2.3。
  • 您必须删除所有 虚拟机虚拟机实例DataVolume

    重要

    在不删除这些对象的情况下尝试卸载容器原生虚拟化会导致失败。

3.4.2. 删除 CNV Operator 部署自定义资源

要卸载容器原生虚拟化,首先需要删除 CNV Operator Deployment 自定义资源。

先决条件

  • 一个活跃的 CNV Operator Deployment 自定义资源。

流程

  1. 在 OpenShift Container Platform web 控制台中,从 Project 列表中选择 openshift-cnv
  2. 导航到 OperatorsInstalled Operators 页面。
  3. 点击 OpenShift Virtualization
  4. 点击 CNV Operator Deployment 选项卡。
  5. 点击包含 kubevirt-hyperconverged 自定义资源 kebab 行中的 Options 菜单。在展开的菜单中,点击 Delete HyperConverged Cluster
  6. 在确认窗口中点击 Delete
  7. 导航到 WorkloadsPods 页面,验证是否只有 Operator Pod 正在运行。
  8. 在一个终端窗口中,运行以下命令清理剩余的资源:

    $ oc delete apiservices v1alpha3.subresources.kubevirt.io -n openshift-cnv

3.4.3. 删除目录订阅

要完成卸载容器原生虚拟化,请删除目录订阅。

先决条件

  • 一个有效的容器原生虚拟化目录订阅。

流程

  1. 导航到 OperatorsOperatorHub 页面。
  2. 搜索 OpenShift Virtualization 并选择它。
  3. 点击 Uninstall
注意

现在可删除 openshift-cnv 命名空间。

3.4.4. 使用 web 控制台删除命令空间

您可以使用 OpenShift Container Platform web 控制台删除一个命名空间。

注意

如果您没有删除命名空间的权限,则 Delete Namespace 选项不可用。

流程

  1. 导航至 AdministrationNamespaces
  2. 在命名空间列表中找到您要删除的命名空间。
  3. 在命名空间列表的右侧,从 Options 菜单 kebab 中选择 Delete Namespace
  4. Delete Namespace 页打开时,在相关项中输入您要删除的命名空间的名称。
  5. 点击 Delete

第 4 章 升级容器原生虚拟化

您可以手动升级到容器原生虚拟化的下一个次要版本,并使用 web 控制台监控更新的状态。

重要

容器原生虚拟化仅是一项技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

4.1. 关于升级容器原生虚拟化

4.1.1. 容器原生虚拟化的升级是如何工作的

  • 您可以使用 OpenShift Container Platform Web 控制台升级至容器原生虚拟化的下一个次要版本,以更改 Operator 订阅的频道。
  • 您可在容器原生虚拟化安装过程中启用自动 z-stream 更新功能。
  • 更新通过 Marketplace Operator 传送,它在 OpenShift Container Platform 安装过程中部署。Marketplace Operator 为您的集群提供外部 Operator。
  • 更新完成所需时间取决于您的网络连接情况。大部分自动更新可在十五分钟内完成。

4.1.2. 容器原生虚拟化升级对您的集群有什么影响

  • 升级不会中断虚拟机工作负载。

    • 升级过程中不会重启或迁移虚拟机 Pod。如果需要更新 virt-launcher Pod,则必须重启或实时迁移该虚拟机。

      注意

      每个虚拟机均有一个 virt-launcher Pod,用于运行虚拟机实例。virt-launcher Pod 运行一个 libvirt实例,用于管理虚拟机进程。

  • 升级不会中断网络连接。
  • DataVolume 及其关联 PersistentVolumeClaim 会在升级过程中保留。

4.2. 把容器原生虚拟化升级到下一个次版本

您可以使用 OpenShift Container Platform Web 控制台将容器原生虚拟化手动升级到下一个次版本,以更改 Operator 订阅的频道。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 访问 OpenShift Container Platform web 控制台,进入 OperatorsInstalled Operators
  2. OpenShift Virtualization 打开 Operator Details 页。
  3. Subscription 标签页打开 Subscription Overview 页。
  4. Channel 窗格中,点击版本号右侧的铅笔图标打开 Change Subscription Update Channel 窗口。
  5. 选择下一个次要版本。例如,如果您想要升级到容器原生虚拟化 2.3,请选择 2.3
  6. Save
  7. 通过导航到 Operators → Installed Operators来检查升级的状态 。您还可以通过运行以下 oc 命令来检查状态:

    $ oc get csv -n openshift-cnv

4.3. 监控升级状态

监控容器原生虚拟化升级状态的最佳方式是查看 ClusterServiceVersion (CSV) PHASE。此外您还可在 web 控制台中,或运行此处提供的命令来监控 CSV 状况。

注意

PHASE 和状况值均是基于可用信息的近似值。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令:

    $ oc get csv
  2. 查看输出,检查 PHASE 字段。例如:

    VERSION  REPLACES                                        PHASE
    2.2.1    kubevirt-hyperconverged-operator.v2.2.0         Installing
    2.2.0                                                    Replacing
  3. 可选:运行以下命令来监控所有容器原生虚拟化组件状况的聚合状态:

    $ oc get hco -n openshift-cnv kubevirt-hyperconverged \
    -o=jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.status}{"\t"}{.message}{"\n"}{end}'

    成功升级后会输出以下内容:

    ReconcileComplete  True  Reconcile completed successfully
    Available          True  Reconcile completed successfully
    Progressing        False Reconcile completed successfully
    Degraded           False Reconcile completed successfully
    Upgradeable        True  Reconcile completed successfully

第 5 章 使用 CLI 工具

用于管理集群中资源的两个主要 CLI 工具是:

  • 容器原生虚拟化 virtctl 客户端
  • OpenShift Container Platform oc 客户端

5.1. 先决条件

5.2. Virtctl 客户端命令

virtctl 客户端是用于管理容器原生虚拟化资源的命令行实用程序。下表包含整个容器原生虚拟化文档中使用的 virtctl 命令。

注意

要查看您可以通过命令使用的选项列表,请使用 -h 或者 --help 标记运行该选项。例如:

$ virtctl image-upload -h

表 5.1. virtctl 客户端命令

命令描述

virtctl start <vm_name>

启动虚拟机。

virtctl stop <vm_name>

停止虚拟机。

virtctl pause vm|vmi <object_name>

暂停虚拟机或虚拟机实例。机器状态保存在内存中。

virtctl unpause vm|vmi <object_name>

取消暂停虚拟机或虚拟机实例。

virtctl restart <vm_name>

重启虚拟机。

virtctl expose <vm_name>

创建转发虚拟机或虚拟机实例的指定端口的服务,并在节点的指定端口上公开该服务。

virtctl console <vmi_name>

连接至虚拟机实例的串行控制台。

virtctl vnc <vmi_name>

打开虚拟机实例的 VNC 连接。

virtctl image-upload dv <datavolume_name> --image-path=</path/to/image> --no-create

把虚拟机镜像上传到一个已存在的 DataVolume。

virtctl image-upload dv <datavolume_name> --size=<datavolume_size> --image-path=</path/to/image>

把虚拟机镜像上传到一个新的 DataVolume。

5.3. OpenShift Container Platform 客户端命令

OpenShift Container Platform oc 客户端是用于管理 OpenShift Container Platform 资源(包括虚拟机 (vm) 和虚拟机实例 (vmi) 对象类型)的命令行实用程序。

注意

您可以使用 -n <namespace> 指定一个不同的项目。

表 5.2. oc 命令

命令描述

oc login -u <user_name>

<user_name> 身份登录 OpenShift Container Platform 集群。

oc get <object_type>

显示当前项目中指定对象类型的对象列表。

oc describe <object_type> <resource_name>

显示当前项目中指定资源的详情。

oc create -f <object_config>

通过一个文件名或 stdin 在当前项目中创建资源。

oc edit <object_type> <resource_name>

编辑当前项目中的资源。

oc delete <object_type> <resource_name>

删除当前项目中的资源。

有关 oc 客户端命令的更全面信息,请参阅 OpenShift Container Platform CLI 工具文档。

第 6 章 虚拟机

6.1. 创建虚拟机

使用以下其中一个流程来创建虚拟机:

警告

不要在 openshift-* 命名空间中创建虚拟机 。相反,创建一个新命名空间或使用没有 openshift 前缀的现有命名空间。

6.1.1. 运行虚拟机向导来创建虚拟机

web 控制台带有一个交互式的向导来帮助您进行 General, Networking, Storage, AdvancedReview 步骤,以简化创建虚拟机的过程。所有必填字段均标有 *。当输入所需信息后,您可以检查并创建虚拟机。

可创建 NIC 和存储磁盘,并在创建后将其附加到虚拟机。

Bootable Disk

如果在 General 步骤中将 URLContainer 选为 Source,则会创建一个 rootdisk 磁盘,并将其作为 Bootable Disk 附加到虚拟机。您可修改 rootdisk,但不可将其移除。

如果虚拟机上未附加任何磁盘,则从 PXE 源置备的虚拟机无需 Bootable Disk。如有一个或多个磁盘附加到虚拟机,您必须将其中一个选为 Bootable Disk

先决条件

  • 在使用向导创建虚拟机时,您的虚拟机存储介质必须支持 Read-Write-Many (RWX) PVC。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 点击 Create Virtual Machine 并选择 New with Wizard
  3. General 步骤中填写所有必填字段。选择一个 Template 来自动填写这些字段。
  4. 点击 Next 进入 Networking 步骤。默认附加 nic0 NIC。

    1. (可选)点击 Add Network Interface 来创建额外的 NIC。
    2. (可选)您可以通过点 Options 菜单 kebab 并选择 Delete 来删除任何或所有 NIC。虚拟机无需附加 NIC 也可创建。可在创建虚拟机之后创建 NIC。
  5. 点击 Next 进入 Storage 屏幕。

    1. (可选)点击 Add Disk 创建额外磁盘。可通过点 Options 菜单 kebab 并选择 Delete 来删除这些磁盘。
    2. (可选)点击 Options 菜单 kebab 来编辑磁盘并保存您的更改。
  6. Review and CreateResults 屏幕显示虚拟机的 JSON 配置文件。

虚拟机列于 WorkloadsVirtual Machines 中。

运行 web 控制台向导时,请参考虚拟机向导字段部分。

6.1.1.1. 虚拟机向导字段

名称参数描述

Template

 

从中创建虚拟机的模板。选择一个模板将自动填写其他字段。

Source

PXE

从 PXE 菜单置备虚拟机。集群中需要支持 PXE 的 NIC。

URL

从由 HTTPS3 端点提供的镜像置备虚拟机。

Container

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

Disk

从一个磁盘置备虚拟机。

操作系统

 

这是为虚拟机选择的主要操作系统。

Flavor

small、medium、large、tiny、Custom

预设值,用于决定分配给虚拟机的 CPU 和内存量。显示的 Flavor 的预设置值是根据操作系统决定的。

内存

 

分配给虚拟机的内存大小(以 GiB 为单位)。

CPU

 

分配给虚拟机的 CPU 数量。

Workload Profile

high performance

针对高性能负载进行了优化的虚拟机配置。

Server

针对运行服务器工作负载进行优化的配置集。

Desktop

用于桌面的虚拟机配置。

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

Start virtual machine on creation

 

选择此项可在创建时自动启动虚拟机。

6.1.1.2. Cloud-init 字段

名称描述

Hostname

为虚拟机设置具体主机名。

Authenticated SSH Keys

复制到虚拟机上 ~/.ssh/authorized_keys 的用户公钥。

Use custom script

将其他选项替换为您粘贴自定义 cloud-init 脚本的字段。

6.1.1.3. CD-ROM 字段

Source描述

Container

指定容器路径。例如:kubevirt/fedora-registry-disk: latest

URL

指定 URL 路径和大小(以 GiB 为单位)。然后从下拉菜单中选择这个 URL 的存储类。

Attach Disk

选择您要添加的虚拟机磁盘。

6.1.1.4. 网络字段

名称描述

名称

网络接口卡的名称

Model

指定网络接口卡的型号。支持的值包括 e1000e1000ene2k_pcipcnetrtl8139virtIO

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

6.1.1.5. 存储字段

名称描述

Source

为虚拟机选择一个空磁盘,或从以下选项中选择:URLContainerAttach Cloned DiskAttach Disk。要选择现有磁盘并将其附加到虚拟机,请从可用 PersistentVolumeClaims (PVC) 列表中选择 Attach Cloned DiskAttach Disk

名称

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

SIZE (GB)

磁盘大小(以 GB 为单位)。

Interface

磁盘设备的类型。支持的接口包括 virtIOSATASCSI

Storage class

用于创建磁盘的 StorageClass

6.1.2. 粘贴至预先配置的 YAML 文件中以创建虚拟机

通过在 web 控制台的 WorkloadsVirtual Machines 屏幕中写入或粘贴 YAML 配置文件来创建虚拟机。每当您打开 YAML 编辑屏幕,默认会提供一个有效的 example 虚拟机配置。

如果您点击 Create 时 YAML 配置无效,则错误消息会指示出错的参数。一次仅显示一个错误。

注意

编辑时离开 YAML 屏幕会取消您对配置做出的任何更改。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. Create Virtual Machine 并选择 New from YAML
  3. 在可编辑窗口写入或粘贴您的虚拟机配置。

    1. 或者,使用 YAML 屏幕中默认提供的 example 虚拟机。
  4. (可选)点击 Download 以下载当前状态下的 YAML 配置文件。
  5. 点击 Create 以创建虚拟机。

虚拟机列于 WorkloadsVirtual Machines 中。

6.1.3. 使用 CLI 创建虚拟机

流程

VirtualMachine 配置文件的 spec 对象会引用虚拟机设置,如内核数、内存量、磁盘类型以及要使用的卷。

  1. 通过引用相关 PVC claimName 作为卷,将虚拟机磁盘附加到虚拟机。
  2. 要利用 OpenShift Container Platform 客户端创建虚拟机,请运行此命令:

    $ oc create -f <vm.yaml>
  3. 由于虚拟机创建时处于 Stopped 状态,因此需启动虚拟机来运行虚拟机实例。
注意

ReplicaSet的目的通常是用来保证指定数量的相同 pod 可用。容器原生虚拟化当前不支持 ReplicaSet。

表 6.1. 域设置

设置描述

内核

虚拟机中的内核数。必须大于或等于 1。

内存

按节点分配给虚拟机的 RAM 量。指定一个值,以 M(兆字节)或 Gi(千兆字节)为单位。

磁盘

所引用卷的名称。必须与卷的名称匹配。

表 6.2. 卷设置

设置描述

名称

卷的名称,必须是 DNS 标签,且在虚拟机中唯一。

PersistentVolumeClaim

附加到虚拟机的 PVC。PVC 的 claimName 必须与虚拟机处于同一个项目中。

6.1.4. 虚拟机存储卷类型

虚拟机存储卷类型以及域和卷设置均已列出。

ephemeral

将网络卷用作只读后备存储的本地写时复制 (COW) 镜像。后备卷必须为 PersistentVolumeClaim。当虚拟机启动并在本地存储所有写入数据时,便会创建临时镜像。当虚拟机停止、重启或删除时,便会丢弃临时镜像。其底层的卷 (PVC) 不会以任何方式发生变化。

persistentVolumeClaim

将可用 PV 附加到虚拟机。附加 PV 可确保虚拟机数据在会话之间保持。

将现有虚拟机导入到 OpenShift Container Platform 中的建议方法是,使用 CDI 将现有虚拟机磁盘导入到 PVC 中,然后将 PVC 附加到虚拟机实例。在 PVC 中使用磁盘需要满足一些要求。

dataVolume

通过导入、克隆或上传操作来管理虚拟机磁盘的准备过程,以此在 persistentVolumeClaim 磁盘类型基础上构建 DataVolume。使用此卷类型的虚拟机可保证在卷就绪前不会启动。

cloudInitNoCloud

附加包含所引用的 cloud-init NoCloud 数据源的磁盘,从而向虚拟机提供用户数据和元数据。虚拟机磁盘内部需要安装 cloud-init。

containerDisk

引用容器镜像 registry 中存储的镜像,如虚拟机磁盘。该镜像拉取自 registry,在创建虚拟机时嵌入卷中。containerDisk 卷为临时卷,将在虚拟机停止、重启或删除时丢弃。

容器磁盘不限于单个虚拟机,对于创建大量无需持久性存储的虚拟机克隆来说非常有用。

容器镜像 registry 仅支持 RAW 和 QCOW2 格式的磁盘类型。建议使用 QCOW2 格式以减小镜像的大小。

emptyDisk

创建额外的稀疏 QCOW2 磁盘,与虚拟机接口的生命周期相关联。当虚拟机中的客户端初始化重启后,数据保留下来,但当虚拟机停止或从 web 控制台重启时,数据将被丢弃。空磁盘用于存储应用程序依赖项和数据,否则这些依赖项和数据会超出临时磁盘有限的临时文件系统。

此外还必须提供磁盘容量大小。

6.1.5. 其他资源

KubeVirt v.0.26.5 API Reference 中的 VirtualMachineSpec 定义为虚拟机规格的参数和等级提供更宽松的上下文。

注意

KubeVirt API Reference 是上游项目参考,可能包含容器原生虚拟化不支持的参数。

6.2. 编辑虚拟机

您可以使用 web 控制台中的 YAML 编辑器或命令行上的 OpenShift 客户端来更新虚拟机配置。您还可以更新 web 控制台虚拟机概述中的参数子集。

6.2.1. 在 web 控制台中编辑虚拟机

在 web 控制台的 Virtual Machine Overview 屏幕中点击相关字段旁的铅笔图标以编辑虚拟机的选择值。可使用 CLI 编辑其他值。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择虚拟机以打开 Virtual Machine Overview 屏幕。
  3. 点击铅笔图标使该字段可编辑。
  4. 进行相关的更改并点击 Save

如果虚拟机正在运行,则更改要在重启虚拟机之后才会生效。

6.2.2. 使用 web 控制台编辑虚拟机 YAML 配置

使用 web 控制台编辑虚拟机的 YAML 配置。

并非所有参数均可更新。如果您编辑无法更改的值并点击 Save,则错误消息会指示参数无法更新。

虚拟机处于 Running 状态时可编辑 YAML 配置,但只有在停止并重新启动虚拟机后,更改才会生效。

注意

编辑时离开 YAML 屏幕会取消您对配置做出的任何更改。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machine
  2. 选择虚拟机。
  3. 点击 YAML 选项卡以显示可编辑的配置。
  4. (可选):您可点击 Download,在本地下载当前状态的 YAML 文件。
  5. 编辑该文件并点击 Save

确认消息显示修改已成功,其中包含对象的更新版本号。

6.2.3. 使用 CLI 编辑虚拟机 YAML 配置

使用这个步骤,通过 CLI 编辑虚拟机 YAML 配置

先决条件

  • 已使用 YAML 对象配置文件配置了虚拟机。
  • 已安装 oc CLI。

流程

  1. 运行以下命令以更新虚拟机配置。

    $ oc edit <object_type> <object_ID>
  2. 打开对象配置。
  3. 编辑 YAML。
  4. 如果要编辑正在运行的虚拟机,您需要执行以下任一操作:

    • 重启虚拟机
    • 运行以下命令使新配置生效。

      $ oc apply <object_type> <object_ID>

6.2.4. 将虚拟磁盘添加到虚拟机

使用这个流程在虚拟机中添加虚拟磁盘。

流程

  1. Virtual Machines 选项卡中选择您的虚拟机。
  2. 选择 Disks 选项卡。
  3. 点击 Add Disks 打开 Add Disk 窗口。
  4. Add Disk 窗口中,指定 SourceNameSizeInterfaceStorage Class
  5. 使用下拉列表和复选框编辑磁盘配置。
  6. 点击 OK

6.2.5. 将网络接口添加到虚拟机

将网络接口添加到虚拟机.

流程

  1. Virtual Machines 选项卡中选择虚拟机。
  2. 选择 Network Interfaces 选项卡。
  3. 点击 Add Network Interface
  4. Add Network Interface 窗口中,指定网络接口的 NameModelNetworkTypeMAC Address
  5. 点击 Add 添加网络接口。
  6. 重启虚拟机以启用访问。
  7. 编辑下拉列表和复选框来配置网络接口。
  8. 点击 Save Changes
  9. 点击 OK

新网络接口显示在 Create Network Interfac 列表的顶部,直到用户重启。

新网络接口有一个 Pending VM restart 链接状态,直到您重启虚拟机。将鼠标悬停在链接状态上方可显示更详细的信息。

当在虚拟机上定义了网络接口卡并连接到网络时,Link State 会被默认设置为 Up

6.2.6. 为虚拟机编辑 CD-ROM

使用以下流程为虚拟机配置 CD-ROM。

流程

  1. Virtual Machines 选项卡中选择您的虚拟机。
  2. 选择 Overview 选项卡。
  3. 点击 CD-ROMs 标签右侧的铅笔图标来添加或编辑 CD-ROM 配置。这会打开 Edit CD-ROM 窗口。

    • 如果没有可编辑的 CD-ROM,会显示如下信息:The virtual machine doesn’t have any CD-ROMs attached.
    • 如果有可用的 CD-ROM,您可以点击 -来删除一个 CD-ROM。
  4. Edit CD-ROM 窗口中执行以下操作:

    1. Media Type 下拉菜单中选择 CD-ROM 配置类型。CD-ROM 配置类型是 ContainerURLPersistent Volume Claim
    2. 为每个 Type 填写所需信息。
    3. 当添加了所有 CD-ROM 时,点击 Save

6.3. 编辑引导顺序

您可以使用 Web 控制台或 CLI 更新引导顺序列表的值。

通过 Virtual Machine Overview 页面中的 Boot Order ,您可以:

  • 选择一个磁盘或者网络接口卡 (NIC) 并将其添加到引导顺序列表中。
  • 编辑引导顺序列表中磁盘或 NIC 的顺序。
  • 从引导顺序列表中移除磁盘或者 NIC,然后将其返回到可引导源清单。

6.3.1. 向 web 控制台的引导顺序列表中添加项目

使用 web 控制台将项目添加到引导顺序列表中。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择虚拟机以打开 Virtual Machine Overview 屏幕。
  3. 点击位于 Boot Order 右侧的铅笔图标如果 YAML 配置不存在,或者是首次创建引导顺序列表时,会显示以下消息: No resource selected.VM will attempt to boot disks from YAML by order of appearance in YAMLv file.Please select a boot source
  4. Add Source,选择虚拟机的可引导磁盘或者网络接口卡 (NIC) 。
  5. 在引导顺序列表中添加附加磁盘或者 NIC。
  6. Save

6.3.2. 在 web 控制台中编辑引导顺序列表

在 web 控制台中编辑引导顺序列表。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择虚拟机以打开 Virtual Machine Overview 屏幕。
  3. 点击位于 Boot Order 右侧的铅笔图标
  4. 选择适当的方法来移动引导顺序列表中的项目:

    • 如果您没有使用屏幕阅读器,请在您想要移动的项目旁的箭头图标上切换,拖动或下移项目,然后将其放到您选择的位置。
    • 如果您使用屏幕阅读器,请按上箭头或者下箭头键移动引导顺序列表中的项目。然后,按 Tab 键将项目放到您选择的位置。
  5. Save

6.3.3. 在 YAML 配置文件中编辑引导顺序列表

使用 CLI 编辑 YAML 配置文件中的引导顺序列表。

流程

  1. 运行以下命令为虚拟机打开 YAML 配置文件:

    $ oc edit vm example
  2. 编辑 YAML 文件并修改与磁盘或网络接口卡 (NIC) 关联的引导顺序值。例如:

    disks:
      - bootOrder: 1 1
        disk:
          bus: virtio
        name: containerdisk
      - disk:
          bus: virtio
        name: cloudinitdisk
      - cdrom:
          bus: virtio
        name: cd-drive-1
    interfaces:
      - boot Order: 2 2
        macAddress: '02:96:c4:00:00'
        masquerade: {}
        name: default
    1
    为磁盘指定的引导顺序值。
    2
    为网络接口卡指定的引导顺序值。
  3. 保存 YAML 文件。
  4. reload the content,使 YAML 文件中更新的引导顺序值应用到 web 控制台的引导顺序列表中。

6.3.4. 从 web 控制台中的引导顺序列表中删除项目

使用 Web 控制台从引导顺序列表中移除项目。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择虚拟机以打开 Virtual Machine Overview 屏幕。
  3. 点击位于 Boot Order 右侧的铅笔图标
  4. 点项旁边的 Remove 图标。该项目从引导顺序列表中删除,可用引导源列表的内容被保存。如果您从引导顺序列表中删除所有项目,则会显示以下消息: No resource selected.VM will attempt to boot disks from YAML by order of appearance in YAML file.Please select a boot source.

6.4. 删除虚拟机

您可从 web 控制台或使用 oc 命令行删除虚拟机。

6.4.1. 使用 web 控制台删除虚拟机

删除虚拟机会将其从集群中永久移除。

注意

当您删除虚拟机时,其使用的 DataVolume 会被自动删除。

流程

  1. 在容器原生虚拟化控制台中,从侧边菜单中点击 WorkloadsVirtual Machines
  2. 点击待删除虚拟机的 ⋮ 按钮,然后选择 Delete Virtual Machine

    • 或者,点击虚拟机名称,打开 Virtual Machine Details 屏幕,然后点击 ActionsDelete Virtual Machine
  3. 在确认弹出窗口中,点击 Delete 永久删除虚拟机。

6.4.2. 使用 CLI 删除虚拟机

您可以使用 oc 命令行接口 (CLI) 删除虚拟机。您可以使用 oc 对多个虚拟机执行操作。

注意

当您删除虚拟机时,其使用的 DataVolume 会被自动删除。

先决条件

  • 找到要删除的虚拟机名称。

流程

  • 运行以下命令以删除虚拟机:

    $ oc delete vm <vm_name>
    注意

    此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用 -n <project_name> 选项。

6.5. 删除虚拟机实例

当删除虚拟机时,相关的 VMI 会被自动删除。要手动删除虚拟机实例 (VMI),请使用 oc CLI。

注意

在卸载容器原生虚拟化前,使用此流程检查并删除所有还存在的 VMI。

6.5.1. 列出所有虚拟机实例:

您可使用 oc CLI 列出集群中的虚拟机实例。

流程

  • 运行以下命令列出所有虚拟机实例:

    $ oc get vmis

6.5.2. 删除一个虚拟机实例

您可以使用 oc CLI 删除虚拟机实例。

先决条件

  • 找出您要删除的虚拟机实例的名称。

流程

  • 运行以下命令删除虚拟机实例:

    $ oc delete vmi <vmi_name>
    注意

    此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用 -n <project_name> 选项。

6.6. 控制虚拟机状态

您可从 web 控制台来停止、启动和重启虚拟机。

注意

要从命令行界面 (CLI) 控制虚拟机,请使用 virtctl 客户端

6.6.1. 启动虚拟机

您可从 web 控制台启动虚拟机。

流程

  1. WorkloadsVirtual Machines
  2. 找到包含要启动的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 在启动虚拟机前,要查看有关所选虚拟机的综合信息:

      1. 点击虚拟机名称访问 Virtual Machine Details 页面。
      2. 点击 Actions
  4. 选择 Start Virtual Machine
  5. 在确认窗口中,点击 Start 启动虚拟机。
注意

首次启动从 URL 源置备的虚拟机时,当容器原生虚拟化从 URL 端点导入容器时,虚拟机将处于 Importing 状态。根据镜像大小,该过程可能需要几分钟时间。

6.6.2. 重启虚拟机

您可从 web 控制台重启正在运行的虚拟机。

重要

为了避免错误,不要重启状态为 Importing 的虚拟机。

流程

  1. WorkloadsVirtual Machines
  2. 找到包含要启动的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 要在重启前查看有关所选虚拟机的综合信息:

      1. 点击虚拟机名称访问 Virtual Machine Details 页面。
      2. 点击 Actions
  4. 选择 Restart Virtual Machine
  5. 在确认窗口中,点击 Restart 重启虚拟机。

6.6.3. 停止虚拟机

您可从 web 控制台停止虚拟机。

流程

  1. WorkloadsVirtual Machines
  2. 找到包含您要停止的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. 点击 kebab 位于行右边的 Options 菜单。
    • 在停止之前,查看所选虚拟机的综合信息:

      1. 点击虚拟机名称访问 Virtual Machine Details 页面。
      2. 点击 Actions
  4. 选择 Stop Virtual Machine
  5. 在确认窗口中,点击 Stop 停止虚拟机。

6.6.4. 取消暂停虚拟机

您可从 web 控制台取消暂停一个正暂停的虚拟机。

先决条件

  • 至少一个虚拟机的状态是 Paused

    注意

    您可以使用 virtctl 客户端暂停虚拟机。

流程

  1. WorkloadsVirtual Machines
  2. 找到包含您要取消暂停的虚拟机的行。
  3. 导航到适合您的用例的菜单:

    • 要保留此页面(您可以在其中对多个虚拟机执行操作):

      1. Status 栏中点 Paused
    • 要在取消暂停之前查看所选虚拟机的综合信息:

      1. 点击虚拟机名称访问 Virtual Machine Details 页面。
      2. 点击位于 Status 右侧的铅笔图标
  4. 在确认窗口中,点击 Unpause 来取消暂停虚拟机。

6.7. 访问虚拟机控制台

容器原生虚拟化提供不同的虚拟机控制台,您可使用这些控制台来完成不同的产品任务。您可通过 web 控制台并使用 CLI 命令来访问这些控制台。

6.7.1. 虚拟机控制台会话

您可从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡连接至正在运行的虚拟机的 VNC 控制台和串行控制台。

有两个控制台可用:图形 VNC ConsoleSerial Console。每次导航到 Consoles 选项卡时会默认打开 VNC Console。您可使用 VNC Console Serial Console 列表来切换这两种控制台。

控制台会话将在后台保持活跃,除非断开连接。当 Disconnect before switching 复选框活跃且您切换了控制台时,当前控制台会话将断开连接,与选定控制台的新会话将连接至虚拟机。这样可保证一次仅打开一个控制台会话。

VNC Console 的选项

Send Key 按钮列出了要发送至虚拟机的密钥组合。

Serial Console 的选项

使用 Disconnect 按钮可手动断开 Serial Console 会话与虚拟机的连接。
使用 Reconnect 按钮可手动打开 Serial Console 会话与虚拟机的连接。

6.7.2. 使用 web 控制台连接至虚拟机

6.7.2.1. 连接至终端

您可使用 web 控制台连接至虚拟机。

流程

  1. 确定您处于正确的项目中。如果不是,则点击 Project 列表,然后选择适当项目。
  2. 点击 WorkloadsVirtual Machines 以显示该项目中的虚拟机。
  3. 选择虚拟机。
  4. Overview 选项卡中,点 virt-launcher-<vm-name> pod。
  5. 点击 Terminal 选项卡。如果终端空白,则选择终端,然后按任意键启动连接。

6.7.2.2. 连接至串行控制台

从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡连接至正在运行的虚拟机的 Serial Console

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 选择虚拟机。
  3. 点击 Consoles。默认会打开 VNC 控制台。
  4. 点击 VNC Console 下拉菜单并选择 Serial Console

6.7.2.3. 连接至 VNC 控制台

从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡连接至正在运行的虚拟机的 VNC 控制台。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 选择虚拟机。
  3. 点击 Consoles。默认会打开 VNC 控制台。

6.7.2.4. 连接至 RDP 控制台

桌面查看器控制台利用远程桌面协议 (RDP),为连接至 Windows 虚拟机提供更好的控制台体验。

要使用 RDP 连接至 Windows 虚拟机,请从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡下载虚拟机的 console.rdp 文件,并将其提供给您首选的 RDP 客户端。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent
  • 第 2 层 vNIC 附加到虚拟机。
  • 与 Windows 虚拟机处于相同网络的机器上装有 RDP 客户端。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 选择 Windows 虚拟机。
  3. 点击 Consoles 选项卡。
  4. 点击 Consoles 列表并选择 Desktop Viewer
  5. Network Interface 列表中,选择第 2 层 vNIC。
  6. 点击 Launch Remote Desktop 下载 console.rdp 文件。
  7. 打开 RDP 客户端并引用 console.rdp 文件。例如,使用 Remmina

    $ remmina --connect /path/to/console.rdp
  8. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。

6.7.3. 使用 CLI 命令访问虚拟机控制台

6.7.3.1. 通过 SSH 访问虚拟机实例

您在虚拟机上公开 22 号端口后,即可使用 SSH 来访问虚拟机。

使用 virtctl expose 命令可将虚拟机实例端口转发至节点端口,并为启用的访问创建服务。以下示例创建 fedora-vm-ssh 服务,该服务将 <fedora-vm> 虚拟机的 22 号端口转发至节点上的端口:

先决条件

  • 必须与虚拟机实例处于同一个项目中。
  • 您要访问的虚拟机实例必须使用 masquerade 绑定方法连接至默认的 Pod 网络。
  • 您要访问的虚拟机实例必须正在运行。
  • 安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令来创建 fedora-vm-ssh 服务:

    $ virtctl expose vm <fedora-vm> --port=20022 --target-port=22 --name=fedora-vm-ssh --type=NodePort 1
    1
    <fedora-vm> 是您在其上运行 fedora-vm-ssh 服务的虚拟机的名称。
  2. 检查服务,找出服务获取的端口:

    $ oc get svc
    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
    fedora-vm-ssh   NodePort   127.0.0.1      <none>        20022:32551/TCP   6s

    在本例中,服务获取了 32551 端口。

  3. 通过 SSH 登录虚拟机实例。使用节点的 ipAddress 以及您在上一步中发现的端口:

    $ ssh username@<node_IP_address> -p 32551

6.7.3.2. 访问虚拟机实例的串行控制台

virtctl console 命令可打开特定虚拟机实例的串行控制台。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。

流程

  • 使用 virtctl 连接至串行控制台:

    $ virtctl console <VMI>

6.7.3.3. 使用 VNC 访问虚拟机实例的图形控制台

virtctl 客户端实用程序可使用 remote-viewer 功能打开正在运行的虚拟机实例的图形控制台。该功能包含在 virt-viewer 软件包中。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。
注意

如果要通过 SSH 在远程机器上使用 virtctl,您必须将 X 会话转发至您的机器。

流程

  1. 使用 virtctl 实用程序连接至图形界面:

    $ virtctl vnc <VMI>
  2. 如果命令失败,请尝试使用 -v 标志来收集故障排除信息:

    $ virtctl vnc <VMI> -v 4

6.7.3.4. 通过 RDP 控制台连接至 Windows 虚拟机

远程桌面协议 (RDP) 为连接至 Windows 虚拟机提供更好的控制台体验。

要通过 RDP 连接至 Windows 虚拟机,请为 RDP 客户端指定附加的 L2 vNIC 的 IP 地址。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent
  • 附加到虚拟机的第 2 层 vNIC。
  • 与 Windows 虚拟机处于相同网络的机器上装有 RDP 客户端。

流程

  1. 以具有访问令牌的用户身份通过 oc CLI 工具登录容器原生虚拟化集群。

    $ oc login -u <user> https://<cluster.example.com>:8443
  2. 使用 oc describe vmi 显示正在运行的 Windows 虚拟机的配置。

    $ oc describe vmi <windows-vmi-name>
    ...
    spec:
      networks:
      - name: default
        pod: {}
      - multus:
          networkName: cnv-bridge
        name: bridge-net
    ...
    status:
      interfaces:
      - interfaceName: eth0
        ipAddress: 198.51.100.0/24
        ipAddresses:
          198.51.100.0/24
        mac: a0:36:9f:0f:b1:70
        name: default
      - interfaceName: eth1
        ipAddress: 192.0.2.0/24
        ipAddresses:
          192.0.2.0/24
          2001:db8::/32
        mac: 00:17:a4:77:77:25
        name: bridge-net
    ...
  3. 找出并复制第 2 层网络接口的 IP 地址。在以上示例中是 192.0.2.0,如果您首选 IPv6,则为 2001:db8::
  4. 打开 RDP 客户端,并使用上一步中复制的 IP 地址进行连接。
  5. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。

6.8. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

6.8.1. 了解 VirtIO 驱动程序

VirtIO 驱动程序是 Microsoft Windows 虚拟机在容器原生虚拟化中运行时所需的半虚拟化设备驱动程序。受支持的驱动程序可在 Red Hat Container Catalogcontainer-native-virtualization/virtio-win 容器磁盘中找到。

必须将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机,以启用驱动程序安装。您可在虚拟机安装 Windows 期间安装 VirtIO 驱动程序,或将其附加到现有 Windows 安装。

安装完驱动程序后,可从虚拟机中移除 container-native-virtualization/virtio-win 容器磁盘。

另请参阅:在新 Windows 虚拟机上安装 Virtio 驱动程序

6.8.2. Microsoft Windows 虚拟机支持的 VirtIO 驱动程序

表 6.3. 支持的驱动程序

驱动程序名称硬件 ID描述

viostor

VEN_1AF4&DEV_1001
VEN_1AF4&DEV_1042

块驱动程序。有时会在 Other devices 组中显示为 SCSI Controller

viorng

VEN_1AF4&DEV_1005
VEN_1AF4&DEV_1044

熵源(entropy)驱动程序。有时会在 Other devices 组中显示为 PCI Device

NetKVM

VEN_1AF4&DEV_1000
VEN_1AF4&DEV_1041

网络驱动程序。有时会在 Other devices 组中显示为 Ethernet Controller。仅在配置了 VirtIO NIC 时可用。

6.8.3. 将 VirtIO 驱动程序容器磁盘添加到虚拟机中

针对 Microsoft Windows 的容器原生虚拟化 VirtIO 驱动程序作为一个容器磁盘提供,可在 Red Hat Container Catalog 中找到。要为 Windows 虚拟机安装这些驱动程序,请在虚拟机配置文件中将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机。

先决条件

  • Red Hat Container Catalog 下载 container-native-virtualization/virtio-win 容器磁盘。这一步并非强制要求,因为如果集群中不存在容器磁盘,将从 Red Hat registry 中下载,但通过此步下载可节省安装时间。

流程

  1. container-native-virtualization/virtio-win 容器磁盘作为 cdrom 磁盘添加到 Windows 虚拟机配置文件中。如果集群中还没有容器磁盘,将从 registry 中下载。

    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2 1
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
    1
    容器原生虚拟化按照 VirtualMachine 配置文件中定义的顺序启动虚拟机磁盘。您可将虚拟机的其他磁盘定义到 container-native-virtualization/virtio-win 容器磁盘前面,也可使用 bootOrder 可选参数来确保虚拟机从正确磁盘启动。如果为一个磁盘指定 bootOrder,则必须为配置中的所有磁盘指定。
  2. 虚拟机启动后,磁盘随即可用:

    • 如果要将容器磁盘添加到正在运行的虚拟机,请在 CLI 中执行 oc apply -f <vm.yaml>,或重启虚拟机,以使更改生效。
    • 如果虚拟机还未运行,则使用 virtctl start <vm>

虚拟机启动后,可从附加的 SATA CD 驱动器安装 VirtIO 驱动程序。

6.8.4. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤请参考您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。

6.8.5. 从虚拟机移除 VirtIO 容器磁盘

在向虚拟机安装完所有所需 VirtIO 驱动程序后,container-native-virtualization/virtio-win 容器磁盘便不再需要附加到虚拟机。从虚拟机配置文件中移除 container-native-virtualization/virtio-win 容器磁盘。

流程

  1. 编辑配置文件并移除 diskvolume

    $ oc edit vm <vm-name>
    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
  2. 重启虚拟机以使更改生效。

6.9. 在新 Windows 虚拟机上安装 VirtIO 驱动程序

6.9.1. 先决条件

6.9.2. 了解 VirtIO 驱动程序

VirtIO 驱动程序是 Microsoft Windows 虚拟机在容器原生虚拟化中运行时所需的半虚拟化设备驱动程序。受支持的驱动程序可在 Red Hat Container Catalogcontainer-native-virtualization/virtio-win 容器磁盘中找到。

必须将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机,以启用驱动程序安装。您可在虚拟机安装 Windows 期间安装 VirtIO 驱动程序,或将其附加到现有 Windows 安装。

安装完驱动程序后,可从虚拟机中移除 container-native-virtualization/virtio-win 容器磁盘。

另请参阅:在现有 Windows 虚拟机上安装 VirtIO 驱动程序

6.9.3. Microsoft Windows 虚拟机支持的 VirtIO 驱动程序

表 6.4. 支持的驱动程序

驱动程序名称硬件 ID描述

viostor

VEN_1AF4&DEV_1001
VEN_1AF4&DEV_1042

块驱动程序。有时会在 Other devices 组中显示为 SCSI Controller

viorng

VEN_1AF4&DEV_1005
VEN_1AF4&DEV_1044

熵源(entropy)驱动程序。有时会在 Other devices 组中显示为 PCI Device

NetKVM

VEN_1AF4&DEV_1000
VEN_1AF4&DEV_1041

网络驱动程序。有时会在 Other devices 组中显示为 Ethernet Controller。仅在配置了 VirtIO NIC 时可用。

6.9.4. 将 VirtIO 驱动程序容器磁盘添加到虚拟机中

针对 Microsoft Windows 的容器原生虚拟化 VirtIO 驱动程序作为一个容器磁盘提供,可在 Red Hat Container Catalog 中找到。要为 Windows 虚拟机安装这些驱动程序,请在虚拟机配置文件中将 container-native-virtualization/virtio-win 容器磁盘作为 SATA CD 驱动器附加到虚拟机。

先决条件

  • Red Hat Container Catalog 下载 container-native-virtualization/virtio-win 容器磁盘。这一步并非强制要求,因为如果集群中不存在容器磁盘,将从 Red Hat registry 中下载,但通过此步下载可节省安装时间。

流程

  1. container-native-virtualization/virtio-win 容器磁盘作为 cdrom 磁盘添加到 Windows 虚拟机配置文件中。如果集群中还没有容器磁盘,将从 registry 中下载。

    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2 1
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
    1
    容器原生虚拟化按照 VirtualMachine 配置文件中定义的顺序启动虚拟机磁盘。您可将虚拟机的其他磁盘定义到 container-native-virtualization/virtio-win 容器磁盘前面,也可使用 bootOrder 可选参数来确保虚拟机从正确磁盘启动。如果为一个磁盘指定 bootOrder,则必须为配置中的所有磁盘指定。
  2. 虚拟机启动后,磁盘随即可用:

    • 如果要将容器磁盘添加到正在运行的虚拟机,请在 CLI 中执行 oc apply -f <vm.yaml>,或重启虚拟机,以使更改生效。
    • 如果虚拟机还未运行,则使用 virtctl start <vm>

虚拟机启动后,可从附加的 SATA CD 驱动器安装 VirtIO 驱动程序。

6.9.5. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您正在安装的 Windows 版本,请参阅相关文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

6.9.6. 从虚拟机移除 VirtIO 容器磁盘

在向虚拟机安装完所有所需 VirtIO 驱动程序后,container-native-virtualization/virtio-win 容器磁盘便不再需要附加到虚拟机。从虚拟机配置文件中移除 container-native-virtualization/virtio-win 容器磁盘。

流程

  1. 编辑配置文件并移除 diskvolume

    $ oc edit vm <vm-name>
    spec:
      domain:
        devices:
          disks:
            - name: virtiocontainerdisk
              bootOrder: 2
              cdrom:
                bus: sata
    volumes:
      - containerDisk:
          image: container-native-virtualization/virtio-win
        name: virtiocontainerdisk
  2. 重启虚拟机以使更改生效。

6.10. 高级虚拟机管理

6.10.1. 自动执行管理任务

您可以使用 Red Hat Ansible Automation Platform 自动完成容器原生虚拟化管理任务。通过使用 Ansible Playbook 创建新虚拟机来了解基础知识。

6.10.1.1. 关于 Red Hat Ansible Automation

Ansible 是用于配置系统、部署软件和执行滚动更新的自动化工具。Ansible 包含对容器原生虚拟化的支持,Ansible 模块可用于自动执行集群管理任务,如模板、持久性卷声明和虚拟机操作。

Ansible 提供了一种方式来自动执行容器原生虚拟化管理,您也可以使用 oc CLI 工具或 API 来完成此项操作。Ansible 独具特色,因其可用于将 KubeVirt 模块与其他 Ansible 模块集成。

6.10.1.2. 自动创建虚拟机

使用 Red Hat Ansible Automation Platform,您可使用 kubevirt_vm Ansible Playbook 在 OpenShift Container Platform 集群中创建虚拟机。

先决条件

流程

  1. 编辑 Ansible Playbook YAML 文件,以便其包含 kubevirt_vm 任务:

      kubevirt_vm:
        namespace:
        name:
        cpu_cores:
        memory:
        disks:
          - name:
            volume:
              containerDisk:
                image:
            disk:
              bus:
    注意

    该片断仅包含 playbook 的 kubevirt_vm 部分。

  2. 编辑这些值以反应您要创建的虚拟机,包括 namespacecpu_cores 数、memory 以及 disks。例如:

      kubevirt_vm:
        namespace: default
        name: vm1
        cpu_cores: 1
        memory: 64Mi
        disks:
          - name: containerdisk
            volume:
              containerDisk:
                image: kubevirt/cirros-container-disk-demo:latest
            disk:
              bus: virtio
  3. 如果希望虚拟机创建后立即启动,请向 YAML 文件添加 state: running。例如:

      kubevirt_vm:
        namespace: default
        name: vm1
        state: running 1
        cpu_cores: 1
    1
    将该值改为 state: absent 会删除已存在的虚拟机。
  4. 运行 ansible-playbook 命令,将 playbook 文件名用作唯一参数:

    $ ansible-playbook create-vm.yaml
  5. 查看输出以确定该 play 是否成功:

    (...)
    TASK [Create my first VM] ************************************************************************
    changed: [localhost]
    
    PLAY RECAP ********************************************************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  6. 如果您未在 playbook 文件中包含 state: running,而您希望立即启动虚拟机,请编辑文件使其包含 state: running 并再次运行 playbook:

    $ ansible-playbook create-vm.yaml

要验证是否已创建虚拟机,请尝试访问虚拟机控制台

6.10.1.3. 示例:用于创建虚拟机的 Ansible Playbook

您可使用 kubevirt_vm Ansible Playbook 自动创建虚拟机。

以下 YAML 文件是一个 kubevirt_vm playbook 示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

---
- name: Ansible Playbook 1
  hosts: localhost
  connection: local
  tasks:
    - name: Create my first VM
      kubevirt_vm:
        namespace: default
        name: vm1
        cpu_cores: 1
        memory: 64Mi
        disks:
          - name: containerdisk
            volume:
              containerDisk:
                image: kubevirt/cirros-container-disk-demo:latest
            disk:
              bus: virtio

6.10.2. 为虚拟机配置 PXE 启动

容器原生虚拟化中提供 PXE 启动或网络启动。网络启动支持计算机启动和加载操作系统或其他程序,无需本地连接的存储设备。例如,在部署新主机时,您可使用 PXE 启动从 PXE 服务器中选择所需操作系统镜像。

6.10.2.1. 先决条件

  • 必须已连接 Linux 网桥。
  • PXE 服务器必须作为网桥连接至相同 VLAN。

6.10.2.2. 容器原生虚拟化网络术语表

容器原生虚拟化使用自定义资源和插件提供高级联网功能。

以下是整个容器原生虚拟化文档中使用的术语:

Container Network Interface (CNI)
一个 Cloud Native Computing Foundation 项目,侧重容器网络连接。容器原生虚拟化使用 CNI 插件基于基本 Kubernetes 网络功能进行构建。
Multus
一个“meta”CNI 插件,支持多个 CNI 共存,以便 Pod 或虚拟机可使用其所需的接口。
自定义资源定义 (CRD)
一种 Kubernetes API 资源,用于定义自定义资源,或使用 CRD API 资源定义的对象。
NetworkAttachmentDefinition
由 Multus 项目引入的 CRD,允许您将 Pod、虚拟机和虚拟机实例附加到一个或多个网络。
预启动执行环境 (PXE)
一种接口,让管理员能够通过网络从服务器启动客户端机器。网络启动可用于为客户端远程加载操作系统和其他软件。

6.10.2.3. 使用指定的 MAC 地址的 PXE 引导

作为管理员,您可首先为您的 PXE 网络创建 NetworkAttachmentDefinition 对象,以此通过网络引导客户端。然后在启动虚拟机实例前,在您的虚拟机实例配置文件中引用 NetworkAttachmentDefinition。如果 PXE 服务器需要,您还可在虚拟机实例配置文件中指定 MAC 地址。

先决条件

  • 必须已连接 Linux 网桥。
  • PXE 服务器必须作为网桥连接至相同 VLAN。

流程

  1. 在集群上配置 PXE 网络:

    1. 为 PXE 网络 pxe-net-conf 创建 NetworkAttachmentDefinition 文件:

      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: pxe-net-conf
      spec:
        config: '{
            "cniVersion": "0.3.1",
            "name": "pxe-net-conf",
            "plugins": [
              {
                "type": "cnv-bridge",
                "bridge": "br1"
              },
              {
                "type": "cnv-tuning" 1
              }
            ]
          }'
      1
      cnv-tuning 插件为自定义 MAC 地址提供支持。
      注意

      虚拟机实例将通过所请求的 VLAN 的访问端口附加到网桥 br1

  2. 使用您在上一步中创建的文件来创建 NetworkAttachmentDefinition 对象:

    $ oc create -f pxe-net-conf.yaml
  3. 编辑虚拟机实例配置文件以包括接口和网络的详情。

    1. 如果 PXE 服务器需要,请指定网络和 MAC 地址。如果未指定 MAC 地址,则会自动分配一个值。但请注意,自动分配的 MAC 地址不具有持久性。

      请确保 bootOrder 设置为 1,以便该接口先启动。在本例中,该接口连接到了名为 <pxe-net> 的网络中:

      interfaces:
      - masquerade: {}
        name: default
      - bridge: {}
        name: pxe-net
        macAddress: de:00:00:00:00:de
        bootOrder: 1
      注意

      启动顺序对于接口和磁盘全局通用。

    2. 为磁盘分配一个启动设备号,以确保置备操作系统后能够正确启动。

      将磁盘 bootOrder 值设置为 2

      devices:
        disks:
        - disk:
            bus: virtio
          name: containerdisk
          bootOrder: 2
    3. 指定该网络连接到之前创建的 NetworkAttachmentDefinition。在此场景中,<pxe-net> 连接到名为 <pxe-net-conf> 的 NetworkAttachmentDefinition:

      networks:
      - name: default
        pod: {}
      - name: pxe-net
        multus:
          networkName: pxe-net-conf
  4. 创建虚拟机实例:

    $ oc create -f vmi-pxe-boot.yaml
      virtualmachineinstance.kubevirt.io "vmi-pxe-boot" created
  5. 等待虚拟机实例运行:

    $ oc get vmi vmi-pxe-boot -o yaml | grep -i phase
      phase: Running
  6. 使用 VNC 查看虚拟机实例:

    $ virtctl vnc vmi-pxe-boot
  7. 查看启动屏幕,验证 PXE 启动是否成功。
  8. 登录虚拟机实例:

    $ virtctl console vmi-pxe-boot
  9. 验证虚拟机上的接口和 MAC 地址,并验证连接到网桥的接口是否具有指定的 MAC 地址。在本例中,我们使用了 eth1 进行 PXE 启动,无需 IP 地址。另一接口 eth0 从 OpenShift Container Platform 获取 IP 地址。

    $ ip addr
    ...
    3. eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
       link/ether de:00:00:00:00:de brd ff:ff:ff:ff:ff:ff

6.10.2.4. 模板:用于 PXE 启动的虚拟机实例配置文件

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
metadata:
  creationTimestamp: null
  labels:
    special: vmi-pxe-boot
  name: vmi-pxe-boot
spec:
  domain:
    devices:
      disks:
      - disk:
          bus: virtio
        name: containerdisk
        bootOrder: 2
      - disk:
          bus: virtio
        name: cloudinitdisk
      interfaces:
      - masquerade: {}
        name: default
      - bridge: {}
        name: pxe-net
        macAddress: de:00:00:00:00:de
        bootOrder: 1
    machine:
      type: ""
    resources:
      requests:
        memory: 1024M
  networks:
  - name: default
    pod: {}
  - multus:
      networkName: pxe-net-conf
    name: pxe-net
  terminationGracePeriodSeconds: 0
  volumes:
  - name: containerdisk
    containerDisk:
      image: kubevirt/fedora-cloud-container-disk-demo
  - cloudInitNoCloud:
      userData: |
        #!/bin/bash
        echo "fedora" | passwd fedora --stdin
    name: cloudinitdisk
status: {}

6.10.3. 管理客户机内存

如果要调整客户机内存设置以适应特定用例,可通过编辑客户机的 YAML 配置文件来实现。容器原生虚拟化可用于配置客户机内存过量使用,以及禁用客户机内存开销核算。

这两个程序均有一定程度的风险。只有当您是经验丰富的管理员时方可继续。

6.10.3.1. 配置客户机内存过量使用

如果您的虚拟工作负载需要的内存超过可用内存,您可利用内存过量使用来为您的虚拟机实例分配全部或大部分主机内存。启用“内存过量使用”意味着您可以最大程度利用通常为主机保留的资源。

例如,如果主机具有 32 Gb RAM,则可利用内存过量功能,运行 8 个每个分配了 4GB RAM 的虚拟机。该分配方案假设所有虚拟机不会同时使用分配给它们的所有内存。

流程

  1. 要明确告知虚拟机实例它的可用内存超过集群请求内存,请编辑虚拟机配置文件,并将 spec.domain.memory.guest 设置为超过 spec.domain.resources.requests.memory 的值。这一过程即为“内存过量使用”。

    在本例中,对集群的请求内存为 1024M,但虚拟机实例被告知它有 2048M 可用。只要相关的节点上有足够的可用内存,虚拟机实例最多可消耗 2048M 内存。

    kind: VirtualMachine
    spec:
      template:
        domain:
        resources:
            requests:
              memory: 1024M
        memory:
            guest: 2048M
    注意

    如果节点面临内存压力,则适用于 pod 的驱除规则也适用于虚拟机实例。

  2. 创建虚拟机:

    $ oc create -f <file name>.yaml

6.10.3.2. 禁用客户机内存开销核算

警告

该程序仅对特定用例有用,且仅限由高级用户操作。

除了您所请求的内存量之外,每个虚拟机实例还会额外请求少量内存。这部分额外内存将用于打包每个 VirtualMachineInstance 进程的基础结构。

虽然通常不建议这么设置,但可以通过禁用客户机内存开销核算来提高节点上的虚拟机实例密度。

流程

  1. 要禁用客户机内存开销核算,请编辑 YAML 配置文件并将 overcommitGuestOverhead 值设置为 true。默认禁用此参数。

    kind: VirtualMachine
    spec:
      template:
        domain:
        resources:
            overcommitGuestOverhead: true
            requests:
              memory: 1024M
    注意

    如果启用 overcommitGuestOverhead,则会在内存限值中添加客户机开销(如果存在)。

  2. 创建虚拟机:

    $ oc create -f <file name>.yaml

6.10.4. 为虚拟机启用专用资源

虚拟机可以具有一个节点的资源,比如 CPU,以便提高性能。

6.10.4.1. 关于专用资源

当为您的虚拟机启用专用资源时,您的工作负载将会在不会被其他进程使用的 CPU 上调度。通过使用专用资源,您可以提高虚拟机性能以及延迟预测的准确性。

6.10.4.2. 先决条件

  • 节点上必须配置 CPU Manager。在调度虚拟机工作负载前,请确认节点具有 cpumanager = true 标签。

6.10.4.3. 为虚拟机启用专用资源

您可以在 web 控制台的 Virtual Machine Overview 页面中为虚拟机启用专用资源。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择一个虚拟机以打开 Virtual Machine Overview 页。
  3. Details 标签页。
  4. Dedicated Resources 项右面的铅笔标签打开 Dedicated Resources 窗口。
  5. 选择 Schedule this workload with dedicated resources (guaranteed policy)
  6. Save

6.11. 导入虚拟机

6.11.1. DataVolume 导入的 TLS 证书

6.11.1.1. 添加用于身份验证 DataVolume 导入的 TLS 证书

registry 或 HTTPS 端点的 TLS 证书必须添加到 ConfigMap 中才可从这些源导入数据。该 ConfigMap 必须存在于目标 DataVolume 的命名空间中。

通过引用 TLS 证书的相对文件路径来创建 ConfigMap。

流程

  1. 确定您处于正确的命名空间中。ConfigMap 只有位于相同命名空间中才可被 DataVolume 引用。

    $ oc get ns
  2. 创建 ConfigMap:

    $ oc create configmap <configmap-name> --from-file=</path/to/file/ca.pem>

6.11.1.2. 示例:从 TLS 证书创建的 ConfigMap

以下示例是从 ca.pem TLS 证书创建的 ConfigMap。

apiVersion: v1
kind: ConfigMap
metadata:
  name: tls-certs
data:
  ca.pem: |
    -----BEGIN CERTIFICATE-----
    ... <base64 encoded cert> ...
    -----END CERTIFICATE-----

6.11.2. 使用 DataVolume 导入虚拟机镜像

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请参阅操作系统文档。

6.11.2.1. 先决条件

6.11.2.2. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.11.2.3. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.11.2.4. 使用 DataVolume 将虚拟机镜像导入到对象中

要从所导入的镜像创建虚拟机,请在创建虚拟机前在 VirtualMachine 配置文件中指定镜像位置。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩
  • 托管镜像的 HTTP 端点,以及访问数据源所需的任何身份验证凭证
  • 至少一个可用 PersistentVolume

流程

  1. 确定用于托管您要导入的虚拟磁盘镜像的 HTTP 文件服务器。您需要一个正确格式的完整 URL:

  2. 如果您的数据源需要身份验证凭证,请编辑 endpoint-secret.yaml 文件,并在集群中应用更新的配置:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <endpoint-secret>
      labels:
        app: containerized-data-importer
    type: Opaque
    data:
      accessKeyId: "" 1
      secretKey:   "" 2
    1
    可选:您的密钥或用户名,base64 编码
    2
    可选:您的 secret 或密码,base64 编码
    $ oc apply -f endpoint-secret.yaml
  3. 编辑虚拟机配置文件,为您要导入的镜像指定数据源。在本例中,导入了一个 Fedora 镜像:

    apiVersion: kubevirt.io/v1alpha3
    kind: VirtualMachine
    metadata:
      creationTimestamp: null
      labels:
        kubevirt.io/vm: vm-fedora-datavolume
      name: vm-fedora-datavolume
    spec:
      dataVolumeTemplates:
      - metadata:
          creationTimestamp: null
          name: fedora-dv
        spec:
          pvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 2Gi
            storageClassName: local
          source:
            http:
              url: https://download.fedoraproject.org/pub/fedora/linux/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-28-1.1.x86_64.qcow2 1
              secretRef: "" 2
              certConfigMap: "" 3
        status: {}
      running: false
      template:
        metadata:
          creationTimestamp: null
          labels:
            kubevirt.io/vm: vm-fedora-datavolume
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: datavolumedisk1
            machine:
              type: ""
            resources:
              requests:
                memory: 64M
          terminationGracePeriodSeconds: 0
          volumes:
          - dataVolume:
              name: fedora-dv
            name: datavolumedisk1
    status: {}
    1
    您要导入的镜像的 HTTP 源。
    2
    secretRef 参数是可选的。
    3
    与使用自签名证书或者由系统 CA 捆绑包没有签名的证书的服务器进行通信需要 certConfigMap。所引用的 ConfigMap 必须与 DataVolume 位于相同命名空间中。
  4. 创建虚拟机:

    $ oc create -f vm-<name>-datavolume.yaml
    注意

    oc create 命令创建 DataVolume 和虚拟机。CDI 控制器使用正确注解创建底层 PVC,导入过程随即开始。导入完成后,DataVolume 状态变为 Succeeded,虚拟机可以启动。

    DataVolume 置备在后台进行,因此无需监控。您可以启动虚拟机,该虚拟机将在导入完成后才会运行。

可选验证步骤

  1. 运行 oc get pods 并查找导入程序 Pod。该 Pod 会从指定的 URL 下载镜像,并将其存储在置备的 PV 上。
  2. 监控 DataVolume 的状态,直至状态显示为 Succeeded

    $ oc describe dv <data-label> 1
    1
    在虚拟机配置文件中指定的 DataVolume 的数据标签。
  3. 要验证置备是否已完成以及 VMI 是否已启动,请尝试访问其串行控制台:

    $ virtctl console <vm-fedora-datavolume>

6.11.2.5. 模板:DataVolume 虚拟机配置文件

example-dv-vm.yaml

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: example-vm
  name: example-vm
spec:
  dataVolumeTemplates:
  - metadata:
      name: example-dv
    spec:
      pvc:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1G
      source:
          http:
             url: "" 1
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/vm: example-vm
    spec:
      domain:
        cpu:
          cores: 1
        devices:
          disks:
          - disk:
              bus: virtio
            name: example-dv-disk
        machine:
          type: q35
        resources:
          requests:
            memory: 1G
      terminationGracePeriodSeconds: 0
      volumes:
      - dataVolume:
          name: example-dv
        name: example-dv-disk
1
您要导入的镜像的 HTTP 源(如适用)。

6.11.2.6. 模板:DataVolume 导入配置文件

example-import-dv.yaml

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: "example-import-dv"
spec:
  source:
      http:
         url: "" 1
         secretRef: "" 2
  pvc:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: "1G"
1
您要导入的镜像的 HTTP 源。
2
secretRef 参数是可选的。

6.11.3. 使用 DataVolume 将虚拟机镜像导入到块存储

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请参阅操作系统文档。

6.11.3.1. 先决条件

6.11.3.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.11.3.3. 关于块 PersistentVolume

块 PersistentVolume (PV) 是一个受原始块设备支持的 PV。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的虚拟机来说,使用它可以获得性能优势。

原始块卷可以通过在 PV 和 PersistentVolumeClaim (PVC) 规格中指定 volumeMode: Block 来置备。

6.11.3.4. 创建本地块 PersistentVolume

通过填充文件并将其挂载为循环设备,在节点上创建本地块 PersistentVolume (PV)。然后您可以在 PV 配置中将该循环设备引用为 Block 卷,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 配置。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置一个 StorageClass。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的 PersistentVolume 的文件名。

6.11.3.5. 使用 DataVolume 导入虚拟机镜像至块 PersistentVolume

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。然后您可以在虚拟机配置中引用 DataVolume。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • 托管镜像的 HTTPs3 端点,以及访问数据源所需的任何身份验证凭证
  • 至少有一个可用块 PV。

流程

  1. 如果您的数据源需要身份验证凭证,请编辑 endpoint-secret.yaml 文件,并在集群中应用更新的配置。

    1. 利用您首选的文本编辑器来编辑 endpoint-secret.yaml 文件:

      apiVersion: v1
      kind: Secret
      metadata:
        name: <endpoint-secret>
        labels:
          app: containerized-data-importer
      type: Opaque
      data:
        accessKeyId: "" 1
        secretKey:   "" 2
      1
      可选:您的密钥或用户名,base64 编码
      2
      可选:您的 secret 或密码,base64 编码
    2. 更新 secret:

      $ oc apply -f endpoint-secret.yaml
  2. 创建 DataVolume 配置,用于指定要导入的镜像的数据源和 volumeMode: Block,以便使用可用块 PV。

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <import-pv-datavolume> 1
    spec:
      storageClassName: local 2
      source:
          http:
             url: <http://download.fedoraproject.org/pub/fedora/linux/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-28-1.1.x86_64.qcow2> 3
             secretRef: <endpoint-secret> 4
      pvc:
        volumeMode: Block 5
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi>
    1
    DataVolume 的名称。
    2
    可选:设置存储类,或忽略此项,接受集群默认值。
    3
    要导入的镜像的 HTTP 源。
    4
    仅在数据源需要身份验证时才需要。
    5
    导入到块 PV 时需要。
  3. 创建 DataVolume 以导入虚拟机镜像。

    $ oc create -f <import-pv-datavolume.yaml>1
    1
    上一步中创建的文件名 DataVolume。

6.11.3.6. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.11.4. 导入 VMware 虚拟机或模板

您可将一个单一的 VMware 虚拟机或模板导入到您的 OpenShift Container Platform 集群中。

如果您导入了 VMware 模板,向导会根据模板创建一个虚拟机。

重要

导入 VMware 虚拟机或模板只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

导入过程使用 VMware Virtual Disk Development Kit(VDDK)来复制 VMware 虚拟磁盘。您可以下载 VDDK SDK,构建 VDDK 镜像,将镜像上传到您的镜像 registry 中,并将其添加到 v2v-vmware ConfigMap 中。

您可以使用虚拟机向导导入 VMware VM,然后更新虚拟机的网络名称。

6.11.4.1. 为 VDDK 镜像配置镜像 registry

您可以配置内部 OpenShift Container Platform 镜像 registry 或 VDDK 镜像的安全外部镜像 registry。

注意

在公共仓库中存储 VDDK 镜像可能会违反 VMware 许可证的条款。

6.11.4.1.1. 配置内部镜像 registry

您可以通过更新 Image Registry Operator 配置在裸机上配置内部 OpenShift Container Platform 镜像 registry。

6.11.4.1.1.1. 更改镜像 registry 的管理状态

要启动镜像 registry,需要把 Image Registry Operator 配置的 managementStateRemoved 改为 Managed

流程

  • managementState Image Registry Operator 配置从 Removed 改为 Managed。例如:

    $ oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"managementState":"Managed"}}'
6.11.4.1.1.2. 为裸机配置 registry 存储

作为集群管理员,在安装后需要配置 registry 来使用存储。

先决条件

  • 具有 Cluster Administrator 权限
  • 在裸机上有一个集群。
  • 为集群置备的持久性存储,如 Red Hat OpenShift Container Storage。

    重要

    如果您只有一个副本,OpenShift Container Platform 支持对镜像 registry 存储的 ReadWriteOnce 访问。要部署支持高可用性的、带有两个或多个副本的镜像 registry,需要 ReadWriteMany 访问设置。

  • 必须具有 100Gi 容量。

流程

  1. 为了配置 registry 使用存储,需要修改 configs.imageregistry/cluster 资源中的 spec.storage.pvc

    注意

    使用共享存储时,请查看您的安全设置以防止被外部访问。

  2. 验证您没有 registry pod:

    $ oc get pod -n openshift-image-registry
    注意

    如果存储类型为 emptyDIR,则副本数不能超过 1

  3. 检查 registry 配置:

    $ oc edit configs.imageregistry.operator.openshift.io

    输出示例

    storage:
      pvc:
        claim:

    claim 字段留空以允许自动创建一个 image-registry-storage PVC。

  4. 检查 clusteroperator 的状态:

    $ oc get clusteroperator image-registry
6.11.4.1.2. 配置对内部镜像 registry 的访问

您可以通过一个路由公开 registry,直接从集群内部或外部访问 OpenShift Container Platform 内部 registry。

6.11.4.1.2.1. 直接从集群访问registry

您可以从集群内部访问registry。

流程

通过使用内部路由从集群访问registry:

  1. 使用节点地址来访问节点:

    $ oc get nodes
    $ oc debug nodes/<node_address>
  2. 要使用节点上的 ocpodman 等工具程序,请运行以下命令:

    sh-4.2# chroot /host
  3. 使用您的访问令牌登录到容器镜像registry:

    sh-4.2# oc login -u kubeadmin -p <password_from_install_log> https://api-int.<cluster_name>.<base_domain>:6443
    sh-4.2# podman login -u kubeadmin -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000

    您应该看到一条确认登录的消息,例如:

    Login Succeeded!
    注意

    用户名可以是任何值,令牌包含了所有必要的信息。如果用户名包含冒号,则会导致登录失败。

    因为 Image Registry Operator 创建了路由,所以它将与 default-route-openshift-image-registry.<cluster_name> 类似。

  4. 针对您的registry执行podman pullpodman push操作:

    重要

    您可以抓取任意镜像,但是如果已添加了system:registry角色,则只能将镜像推送到您自己的registry中。

    在以下示例中,使用:

    组件

    <registry_ip>

    172.30.124.220

    <port>

    5000

    <project>

    openshift

    <image>

    image

    <tag>

    忽略 (默认为 latest)

    1. 抓取任意镜像:

      $ podman pull name.io/image
    2. 使用 <registry_ip>:<port>/<project>/<image> 格式标记(tag)新镜像。项目名称必须出现在这个 pull 规范中,以供OpenShift Container Platform 把这个镜像正确放置在 registry 中,并在以后正确访问 registry 中的这个镜像:

      $ podman tag name.io/image image-registry.openshift-image-registry.svc:5000/openshift/image
      注意

      您必须具有指定项目的system:image-builder角色,该角色允许用户写或推送镜像。否则,下一步中的podman push将失败。为了进行测试,您可以创建一个新项目来推送镜像。

    3. 将新标记的镜像推送到registry:

      $ podman push image-registry.openshift-image-registry.svc:5000/openshift/image
6.11.4.1.2.2. 手动公开受保护的registry

通过使用路由可以开放从外部访问OpenShift Container Platform registry的通道,用户不再需要从集群内部登录到OpenShift Container Platform registry。您可以使用路由地址从集群以外登陆到 registry,并使用路由主机进行镜像的 tag 和 push 操作。

先决条件

  • 以下的先决条件会被自动执行:

    • 部署 Registry Operator。
    • 部署 Ingress Operator。

流程

您可以使用configs.imageregistry.operator.openshift.io资源中的DefaultRoute参数或使用自定义路由来公开路由。

使用DefaultRoute公开registry:

  1. DefaultRoute设置为True

    $ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
  2. 使用 podman 登录:

    $ HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
    $ podman login -u $(oc whoami) -p $(oc whoami -t) --tls-verify=false $HOST 1
    1
    如果集群的默认路由证书不受信任,则需要--tls-verify=false 。您可以将一个自定义的可信证书设置为 Ingress Operator 的默认证书。

使用自定义路由公开registry:

  1. 使用路由的 TLS 密钥创建一个 secret:

    $ oc create secret tls public-route-tls \
        -n openshift-image-registry \
        --cert=</path/to/tls.crt> \
        --key=</path/to/tls.key>

    此步骤是可选的。如果不创建一个secret,则路由将使用Ingress Operator的默认TLS配置。

  2. 在 Registry Operator 中:

    spec:
      routes:
        - name: public-routes
          hostname: myregistry.mycorp.organization
          secretName: public-route-tls
    ...
    注意

    如果为registry的路由提供了一个自定义的 TLS 配置,则仅需设置secretName

6.11.4.1.3. 配置对外部镜像 registry 的访问

如果将外部镜像 registry 用于 VDDK 镜像,您可以将外部镜像 registry 的证书颁发机构添加到 OpenShift Container Platform 集群。

另外,您可以从 Docker 凭证中创建一个 pull secret,并将其添加到您的服务帐户中。

6.11.4.1.3.1. 在集群中添加证书颁发机构

您可以将证书颁发机构 (CA) 添加到集群,以便按照以下方法在推送和拉取镜像时使用。

先决条件

  • 您必须具有集群管理员特权。
  • 您必须有权访问 registry 的公共证书,通常是位于 /etc/docker/certs.d/ 目录中的 hostname/ca.crt 文件。

流程

  1. openshift-config 命名空间中创建一个 ConfigMap,其中包含使用自签名证书的 registry 的可信证书。对于每个 CA 文件,请确保 ConfigMap 中的键是 hostname[..port] 格式的 registry 主机名:

    $ oc create configmap registry-cas -n openshift-config \
    --from-file=myregistry.corp.com..5000=/etc/docker/certs.d/myregistry.corp.com:5000/ca.crt \
    --from-file=otherregistry.com=/etc/docker/certs.d/otherregistry.com/ca.crt
  2. 更新集群镜像配置:

    $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-cas"}}}' --type=merge
6.11.4.1.3.2. 允许 Pod 引用其他安全 registry 中的镜像

Docker 客户端的 .dockercfg $HOME/.docker/config.json 文件是一个 Docker 凭证文件,如果您之前已登录安全或不安全的 registry,则该文件会保存您的身份验证信息。

要拉取(pull)并非来自 OpenShift Container Platform 内部 registry 的安全容器镜像,您必须从 Docker 凭证创建一个 pull secret,并将其添加到您的服务帐户。

流程

  • 如果您已有该安全 registry 的 .dockercfg 文件,则可运行以下命令从该文件中创建一个 secret:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockercfg=<path/to/.dockercfg> \
        --type=kubernetes.io/dockercfg
  • 或者,如果您已有 $HOME/.docker/config.json 文件,则可运行以下命令:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
        --type=kubernetes.io/dockerconfigjson
  • 如果您还没有安全 registry 的 Docker 凭证文件,则可运行以下命令创建一个 secret:

    $ oc create secret docker-registry <pull_secret_name> \
        --docker-server=<registry_server> \
        --docker-username=<user_name> \
        --docker-password=<password> \
        --docker-email=<email>
  • 要使用 secret 为 Pod 拉取镜像,您必须将 secret 添加到您的服务帐户中。本例中服务帐户的名称应与 Pod 使用的服务帐户的名称匹配。default 是默认服务帐户:

    $ oc secrets link default <pull_secret_name> --for=pull

6.11.4.2. 创建并使用 VDDK 镜像

您可以下载 VMware Virtual Disk Development Kit(VDDK),构建 VDDK 镜像,并将 VDDK 镜像推送到您的镜像 registry。然后,将 VDDK 镜像添加到 v2v-vmware ConfigMap 中。

先决条件

  • 您必须有权访问 OpenShift Container Platform 内部镜像 registry 或安全的外部 registry。

流程

  1. 创建并导航到临时目录:

    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
  2. 在一个浏览器中,进入 VMware code 并点 SDKs
  3. Compute Virtualization 下,点 Virtual Disk Development Kit(VDDK)
  4. 选择最新的 VDDK 版本,点 Download,然后在临时目录中保存 VDDK 归档。
  5. 提取 VDDK 归档:

    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
  6. 创建 Dockerfile

    $ cat > Dockerfile <<EOF
    FROM busybox:latest
    COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    RUN mkdir -p /opt
    ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    EOF
  7. 构建镜像:

    $ podman build . -t <registry_route_or_server_path>/vddk:<tag> 1
    1
    指定您的镜像 registry:
    • 对于内部 OpenShift Container Platform registry,请使用内部 registry 路由,如 image-registry.openshift-image-registry.svc:5000/openshift/vddk:<tag>
    • 对于外部 registry,指定服务器名称、路径和标签。例如 server.example.com:5000/vddk:<tag>
  8. 将镜像推送至 registry:

    $ podman push <registry_route_or_server_path>/vddk:<tag>
  9. 确保镜像可以被 OpenShift Container PlatformO 环境访问。
  10. 编辑 openshift-cnv 项目中的 v2v- vmware ConfigMap:

    $ oc edit configmap v2v-vmware -n openshift-cnv
  11. vddk-init-image 参数添加到 data 小节中:

    ...
    data:
      vddk-init-image: <registry_route_or_server_path>/vddk:<tag>

6.11.4.3. 使用虚拟机向导来导入 VMware 虚拟机或模板

您可以使用虚拟机向导来导入 VMware 虚拟机或模板。

先决条件

  • 您必须创建 VDDK 镜像,将其推送到一个镜像 registry,并将其添加到 v2v-vmware ConfigMap 中。
  • 导入磁盘必须有足够的存储空间。

    警告

    如果您尝试导入磁盘大小大于可用存储空间的虚拟机,则操作将无法完成。因为没有足够的资源来删除对象,您将无法导入另一个虚拟机或清除存储。要解决这种情况,您必须在存储后端中添加更多对象存储设备。

  • VMware 虚拟机必须关机。

流程

  1. 在容器原生虚拟化 web 控制台中,点击 WorkloadsVirtual Machines
  2. 点击 Create Virtual Machine 并选择 Import with Wizard
  3. General 屏幕中,执行以下步骤:

    1. Provider 列表中选择 VMware
    2. 选择 Connect to New Instance 或从 vCenter instance 列表中选择保存的 vCenter 实例。

      • 如果您选择 Connect to New Instance,请填写 vCenter hostnameUsernamePassword
      • 如果您选择了一个保存的 vCenter 实例,向导将使用保存的凭证连接到 vCenter 实例。
    3. VM or Template to Import 列表中选择要导入的虚拟机或模板。
    4. 选择操作系统。
    5. Flavor 列表中选择现有类别或 Custom

      如果您选择 Custom,请指定 Memory (GB)CPUs

    6. 选择 Workload Profile
    7. 如果虚拟机名称已经在命名空间中被另一个虚拟机使用,请更新该名称。
    8. Next
  4. Networking 屏幕中,执行以下步骤:

    1. 点击网络接口 kebab 的 Options 菜单并选择 Edit
    2. 输入一个有效的网络接口名称。

      名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

    3. 选择网络接口型号。
    4. 选择网络定义。
    5. 选择网络接口类型。
    6. 输入 MAC 地址。
    7. 点击 Save,然后点击 Next
  5. Storage 屏幕中,执行以下步骤:

    1. 点击磁盘 kebab 的 Options 菜单并选择 Edit
    2. 输入有效名称。

      名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

    3. 选择接口类型。
    4. 选择存储类。

      如果您没有选择存储类,容器原生虚拟化将使用默认存储类来创建虚拟机。

    5. 点击 Save,然后点击 Next
  6. Advanced 屏幕中,如果您使用 cloud-init,请输入 HostnameAuthorized SSH Keys
  7. Next
  8. 检查您的设置并点击 Create Virtual Machine

    此时会显示 Successfully created virtual machine 消息以及为虚拟机创建的资源列表。关闭电源的虚拟机会出现在 WorkloadsVirtual Machines 中。

  9. 点击 See virtual machine details 查看导入的虚拟机的仪表板。

    如果发生错误,请执行以下步骤:

    1. 点击 WorkloadsPods
    2. 点击 Conversion Pod,例如 kubevirt-v2v-conversion-rhel7-mini-1-27b9h
    3. 点击 Logs 并检查错误消息。

有关向导字段的详情,请参考虚拟机向导字段部分。

6.11.4.4. 更新导入的 VMware 虚拟机的 NIC 名称

您必须更新从 VMware 导入的虚拟机的 NIC 名称,以符合容器原生虚拟化命名约定。

流程

  1. 登录虚拟机。
  2. 进入 /etc/sysconfig/network-scripts 目录。
  3. 将网络配置文件名称改为 ifcfg-eth0

    $ mv vmnic0 ifcfg-eth0 1
    1
    额外网络配置文件按顺序编号,例如:ifcfg-eth1ifcfg-eth2
  4. 更新网络配置文件中的 NAMEDEVICE 参数:

    NAME=eth0
    DEVICE=eth0
  5. 重启网络:

    $ systemctl restart network

6.11.4.5. 导入 VMware 虚拟机的故障排除

如果导入的虚拟机的状态是 Import error: (VMware),您可以检查 Conversion Pod 日志中的错误:

  1. 获取 Conversion Pod 名称:

    $ oc get pods -n <project> | grep v2v 1
    kubevirt-v2v-conversion-f66f7d-zqkz7            1/1     Running     0          4h49m
    1
    指定导入的虚拟机的项目。
  2. 获取 Conversion Pod 日志:

    $ oc logs kubevirt-v2v-conversion-f66f7d-zqkz7 -f -n <project>
6.11.4.5.1. 错误信息
  • 如果导入的虚拟机事件显示出错信息 Readiness probe failed,以下错误信息会出现在 Conversion Pod 的日志中:

    INFO - have error: ('virt-v2v error: internal error: invalid argument: libvirt domain ‘v2v_migration_vm_1’ is running or paused. It must be shut down in order to perform virt-v2v conversion',)"

    您必须确保在导入虚拟机前关闭该虚拟机。

6.11.4.5.2. 已知问题
  • 您的 OpenShift Container Platform 环境中必须为导入的磁盘有足够的存储空间。

    如果您尝试导入磁盘大小大于可用存储空间的虚拟机,则操作将无法完成。因为没有足够的资源来删除对象,您将无法导入另一个虚拟机或清除存储。要解决这种情况,您必须在存储后端中添加更多对象存储设备。(BZ#1721504)

  • 如果将 NFS 后端存储用于附加到 Conversion Pod 的 2 GB 磁盘,您必须 配置 hostPath 卷(BZ#1814611)

6.11.4.6. 虚拟机向导字段

6.11.4.6.1. 虚拟机向导字段
名称参数描述

Template

 

从中创建虚拟机的模板。选择一个模板将自动填写其他字段。

Source

PXE

从 PXE 菜单置备虚拟机。集群中需要支持 PXE 的 NIC。

URL

从由 HTTPS3 端点提供的镜像置备虚拟机。

Container

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

Disk

从一个磁盘置备虚拟机。

操作系统

 

这是为虚拟机选择的主要操作系统。

Flavor

small、medium、large、tiny、Custom

预设值,用于决定分配给虚拟机的 CPU 和内存量。显示的 Flavor 的预设置值是根据操作系统决定的。

内存

 

分配给虚拟机的内存大小(以 GiB 为单位)。

CPU

 

分配给虚拟机的 CPU 数量。

Workload Profile

high performance

针对高性能负载进行了优化的虚拟机配置。

Server

针对运行服务器工作负载进行优化的配置集。

Desktop

用于桌面的虚拟机配置。

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

Start virtual machine on creation

 

选择此项可在创建时自动启动虚拟机。

6.11.4.6.2. Cloud-init 字段
名称描述

Hostname

为虚拟机设置具体主机名。

Authenticated SSH Keys

复制到虚拟机上 ~/.ssh/authorized_keys 的用户公钥。

Use custom script

将其他选项替换为您粘贴自定义 cloud-init 脚本的字段。

6.11.4.6.3. 网络字段
名称描述

名称

网络接口卡的名称

Model

指定网络接口卡的型号。支持的值包括 e1000e1000ene2k_pcipcnetrtl8139virtIO

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

6.11.4.6.4. 存储字段
名称描述

Source

为虚拟机选择一个空磁盘,或从以下选项中选择:URLContainerAttach Cloned DiskAttach Disk。要选择现有磁盘并将其附加到虚拟机,请从可用 PersistentVolumeClaims (PVC) 列表中选择 Attach Cloned DiskAttach Disk

名称

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

SIZE (GB)

磁盘大小(以 GB 为单位)。

Interface

磁盘设备的类型。支持的接口包括 virtIOSATASCSI

Storage class

用于创建磁盘的 StorageClass

6.12. 编辑虚拟机

6.12.1. 启用用户权限以在命名空间之间克隆 DataVolume

命名空间的隔离性质意味着用户默认无法在命名空间之间克隆资源。

要让用户将虚拟机克隆到另一个命名空间,具有 cluster-admin 角色的用户必须创建新的 ClusterRole。将这个 ClusterRole 绑定到用户,使其能够将虚拟机克隆到目标命名空间。

6.12.1.1. 先决条件

  • 只有具有 cluster-admin 角色的用户才能创建 ClusterRole。

6.12.1.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.1.3. 创建用于克隆 DataVolume 的 RBAC 资源

创建新的 ClusterRole,以启用 datavolumes 资源的所有操作的权限。

流程

  1. 创建 ClusterRole 清单:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: <datavolume-cloner> 1
    rules:
    - apiGroups: ["cdi.kubevirt.io"]
      resources: ["datavolumes/source"]
      verbs: ["*"]
    1
    ClusterRole 的唯一名称。
  2. 在集群中创建 ClusterRole:

    $ oc create -f <datavolume-cloner.yaml> 1
    1
    上一步中创建的 ClusterRole 清单的文件名。
  3. 创建应用于源和目标命名空间的 RoleBinding 清单,并引用上一步中创建的 ClusterRole。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: <allow-clone-to-user> 1
      namespace: <Source namespace> 2
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: <Destination namespace> 3
    roleRef:
      kind: ClusterRole
      name: datavolume-cloner 4
      apiGroup: rbac.authorization.k8s.io
    1
    RoleBinding 的唯一名称。
    2
    源 DataVolume 的命名空间。
    3
    将 DataVolume 克隆到的命名空间。
    4
    上一步中创建的 ClusterRole 的名称。
  4. 在集群中创建 RoleBinding:

    $ oc create -f <datavolume-cloner.yaml> 1
    1
    上一步中创建的 RoleBinding 清单的文件名。

6.12.2. 将虚拟机磁盘克隆到新 DataVolume 中

您可通过引用 DataVolume 配置文件中的源 PVC 来将虚拟机磁盘的 PersistentVolumeClaim (PVC) 克隆到新 DataVolume 中。

6.12.2.1. 先决条件

6.12.2.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.2.3. 将虚拟机磁盘的 PersistentVolumeClaim 克隆到新 DataVolume 中

您可将现有虚拟机磁盘的 PersistentVolumeClaim (PVC) 克隆到新 DataVolume 中。之后该新 DataVolume 可用于新虚拟机。

注意

当独立于虚拟机创建 DataVolume 时,DataVolume 的生命周期与虚拟机保持独立。如果删除了虚拟机,DataVolume 及其相关 PVC 都不会被删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。

流程

  1. 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
  2. 为 DataVolume 对象创建 YAML 文件,用于指定新 DataVolume 的名称、源 PVC 的名称和命名空间,以及新 DataVolume 的大小。

    例如:

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <cloner-datavolume> 1
    spec:
      source:
        pvc:
          namespace: "<source-namespace>" 2
          name: "<my-favorite-vm-disk>" 3
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 4
    1
    新 DataVolume 的名称。
    2
    源 PVC 所在的命名空间。
    3
    源 PVC 的名称。
    4
    新 DataVolume 的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
  3. 通过创建 DataVolume 开始克隆 PVC:

    $ oc create -f <cloner-datavolume>.yaml
    注意

    在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新 DataVolume 的虚拟机。

6.12.2.4. 模板:DataVolume 克隆配置文件

example-clone-dv.yaml

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: "example-clone-dv"
spec:
  source:
      pvc:
        name: source-pvc
        namespace: example-ns
  pvc:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: "1G"

6.12.2.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.12.3. 使用 DataVolumeTemplate 克隆虚拟机

您可通过克隆现有虚拟机的 PersistentVolumeClaim (PVC) 来创建新虚拟机。在虚拟机配置文件中包括 dataVolumeTemplate,即可从原始 PVC 创建新 DataVolume。

6.12.3.1. 先决条件

6.12.3.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.3.3. 使用 DataVolumeTemplate 从克隆的 PersistentVolumeClaim 创建新虚拟机

您可创建一个虚拟机,它将现有虚拟机的 PersistentVolumeClaim (PVC) 克隆到 DataVolume 中。通过在虚拟机 spec 中引用 dataVolumeTemplate PVC 便会克隆到 DataVolume 中,然后自动用于创建虚拟机。

注意

当 DataVolume 作为虚拟机 DataVolumeTemplate 的一部分创建时,DataVolume 的生命周期依赖于虚拟机。如果删除了虚拟机,DataVolume 及其相关 PVC 也会一并删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。

流程

  1. 检查您要克隆的虚拟机,以识别关联 PVC 的名称和命名空间。
  2. VirtualMachine 对象创建 YAML 文件。以下虚拟机示例克隆 my-favorite-vm-disk,该磁盘位于 source-name 命名空间中。名为 favorite-clone2Gi DataVolume 从 my-favorite-vm-disk 创建而成。

    例如:

    apiVersion: kubevirt.io/v1alpha3
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm-dv-clone
      name: vm-dv-clone 1
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-dv-clone
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: root-disk
            resources:
              requests:
                memory: 64M
          volumes:
          - dataVolume:
              name: favorite-clone
            name: root-disk
      dataVolumeTemplates:
      - metadata:
          name: favorite-clone
        spec:
          pvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 2Gi
          source:
            pvc:
              namespace: "source-namespace"
              name: "my-favorite-vm-disk"
    1
    要创建的虚拟机。
  3. 使用 PVC 克隆的 DataVolume 创建虚拟机:

    $ oc create -f <vm-clone-datavolumetemplate>.yaml

6.12.3.4. 模板:DataVolume 虚拟机配置文件

example-dv-vm.yaml

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: example-vm
  name: example-vm
spec:
  dataVolumeTemplates:
  - metadata:
      name: example-dv
    spec:
      pvc:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1G
      source:
          http:
             url: "" 1
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/vm: example-vm
    spec:
      domain:
        cpu:
          cores: 1
        devices:
          disks:
          - disk:
              bus: virtio
            name: example-dv-disk
        machine:
          type: q35
        resources:
          requests:
            memory: 1G
      terminationGracePeriodSeconds: 0
      volumes:
      - dataVolume:
          name: example-dv
        name: example-dv-disk
1
您要导入的镜像的 HTTP 源(如适用)。

6.12.3.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.12.4. 将虚拟机磁盘克隆到新块存储 DataVolume 中

您可通过引用 DataVolume 配置文件中的源 PVC 来将虚拟机磁盘的 PersistentVolumeClaim (PVC) 克隆到新块 DataVolume 中。

6.12.4.1. 先决条件

6.12.4.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.12.4.3. 关于块 PersistentVolume

块 PersistentVolume (PV) 是一个受原始块设备支持的 PV。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的虚拟机来说,使用它可以获得性能优势。

原始块卷可以通过在 PV 和 PersistentVolumeClaim (PVC) 规格中指定 volumeMode: Block 来置备。

6.12.4.4. 创建本地块 PersistentVolume

通过填充文件并将其挂载为循环设备,在节点上创建本地块 PersistentVolume (PV)。然后您可以在 PV 配置中将该循环设备引用为 Block 卷,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 配置。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置一个 StorageClass。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的 PersistentVolume 的文件名。

6.12.4.5. 将虚拟机磁盘的 PersistentVolumeClaim 克隆到新 DataVolume 中

您可将现有虚拟机磁盘的 PersistentVolumeClaim (PVC) 克隆到新 DataVolume 中。之后该新 DataVolume 可用于新虚拟机。

注意

当独立于虚拟机创建 DataVolume 时,DataVolume 的生命周期与虚拟机保持独立。如果删除了虚拟机,DataVolume 及其相关 PVC 都不会被删除。

先决条件

  • 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
  • 安装 OpenShift CLI(oc)。
  • 至少一个可用块 PersistentVolume (PV) 大小不低于源 PVC。

流程

  1. 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
  2. 为 DataVolume 对象创建 YAML 文件,用于指定新 DataVolume 的名称、源 PVC 的名称和命名空间、volumeMode: Block(以使用可用块 PV),以及新 DataVolume 的大小。

    例如:

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <cloner-datavolume> 1
    spec:
      source:
        pvc:
          namespace: "<source-namespace>" 2
          name: "<my-favorite-vm-disk>" 3
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 4
        volumeMode: Block 5
    1
    新 DataVolume 的名称。
    2
    源 PVC 所在的命名空间。
    3
    源 PVC 的名称。
    4
    新 DataVolume 的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
    5
    指定目标为一个块 PV
  3. 通过创建 DataVolume 开始克隆 PVC:

    $ oc create -f <cloner-datavolume>.yaml
    注意

    在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新 DataVolume 的虚拟机。

6.12.4.6. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.13. 虚拟机网络

6.13.1. 为虚拟机使用默认 Pod 网络

您可以将默认 Pod 网络用于容器原生虚拟化。为此,您必须使用 masquerade 绑定方法。这是用于默认 Pod 网络的唯一推荐绑定方法。不要将 masquerade 模式用于非默认网络。

注意

对于辅助网络,请使用 bridge 绑定方法。

6.13.1.1. 从命令行配置伪装模式

您可使用伪装模式将虚拟机的外发流量隐藏在 Pod IP 地址后。伪装模式使用网络地址转换 (NAT) 来通过 Linux 网桥将虚拟机连接至 Pod 网络后端。

启用伪装模式,并通过编辑虚拟机配置文件让流量进入虚拟机。

先决条件

  • 虚拟机必须配置为使用 DHCP 来获取 IPv4 地址。以下示例配置为使用 DHCP。

流程

  1. 编辑虚拟机配置文件的 interfaces 规格:

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: red
              masquerade: {} 1
              ports:
                - port: 80 2
      networks:
      - name: red
        pod: {}
    1
    使用伪装模式进行连接
    2
    允许通过 80 端口传入流量
  2. 创建虚拟机:

    $ oc create -f <vm-name>.yaml

6.13.1.2. 选择绑定方法

如果从容器原生虚拟化 web 控制台向导创建虚拟机,请从 Networking 屏幕选择所需绑定方法。

6.13.1.2.1. 网络字段
名称描述

名称

网络接口卡的名称

Model

指定网络接口卡的型号。支持的值包括 e1000e1000ene2k_pcipcnetrtl8139virtIO

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

6.13.1.3. 默认网络的虚拟机配置示例

6.13.1.3.1. 模板:虚拟机配置文件
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  name: example-vm
  namespace: default
spec:
  running: false
  template:
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - masquerade: {}
            name: default
        resources:
          requests:
            memory: 1024M
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: kubevirt/fedora-cloud-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #!/bin/bash
              echo "fedora" | passwd fedora --stdin
6.13.1.3.2. 模板:Windows 虚拟机实例配置文件
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
metadata:
  labels:
    special: vmi-windows
  name: vmi-windows
spec:
  domain:
    clock:
      timer:
        hpet:
          present: false
        hyperv: {}
        pit:
          tickPolicy: delay
        rtc:
          tickPolicy: catchup
      utc: {}
    cpu:
      cores: 2
    devices:
      disks:
      - disk:
          bus: sata
        name: pvcdisk
      interfaces:
      - masquerade: {}
        model: e1000
        name: default
    features:
      acpi: {}
      apic: {}
      hyperv:
        relaxed: {}
        spinlocks:
          spinlocks: 8191
        vapic: {}
    firmware:
      uuid: 5d307ca9-b3ef-428c-8861-06e72d69f223
    machine:
      type: q35
    resources:
      requests:
        memory: 2Gi
  networks:
  - name: default
    pod: {}
  terminationGracePeriodSeconds: 0
  volumes:
  - name: pvcdisk
    persistentVolumeClaim:
      claimName: disk-windows

6.13.2. 将虚拟机附加到多个网络

容器原生虚拟化提供第 2 层网络功能,支持将虚拟机连接至多个网络。您可使用现有工作负载导入虚拟机,具体取决于对多个接口的访问权限。您还可配置 PXE 网络以便可通过网络启动机器。

要开始工作,网络管理员将为 web 控制台或 CLI 中的命名空间配置桥接 NetworkAttachmentDefinition。然后,用户可以创建一个 vNIC 来将该命名空间中的 Pod 和虚拟机附加到桥接网络。

6.13.2.1. 容器原生虚拟化网络术语表

容器原生虚拟化使用自定义资源和插件提供高级联网功能。

以下是整个容器原生虚拟化文档中使用的术语:

Container Network Interface (CNI)
一个 Cloud Native Computing Foundation 项目,侧重容器网络连接。容器原生虚拟化使用 CNI 插件基于基本 Kubernetes 网络功能进行构建。
Multus
一个“meta”CNI 插件,支持多个 CNI 共存,以便 Pod 或虚拟机可使用其所需的接口。
自定义资源定义 (CRD)
一种 Kubernetes API 资源,用于定义自定义资源,或使用 CRD API 资源定义的对象。
NetworkAttachmentDefinition
由 Multus 项目引入的 CRD,允许您将 Pod、虚拟机和虚拟机实例附加到一个或多个网络。
预启动执行环境 (PXE)
一种接口,让管理员能够通过网络从服务器启动客户端机器。网络启动可用于为客户端远程加载操作系统和其他软件。

6.13.2.2. 创建 NetworkAttachmentDefinition

6.13.2.3. 先决条件

  • 必须在每个节点上配置并附加 Linux 网桥。如需更多信息,请参阅 node networking 中的内容。
6.13.2.3.1. 在 Web 控制台中创建 Linux 网桥 NetworkAttachmentDefinition

NetworkAttachmentDefinition 是一个自定义资源,可向容器原生虚拟化集群中的特定命名空间公开第 2 层设备。

网络管理员可创建 NetworkAttachmentDefinition,以向 Pod 和虚拟机提供现有的第 2 层网络。

流程

  1. 在 Web 控制台中,点击 NetworkingNetwork Attachment Definitions
  2. 点击 Create Network Attachment Definition
  3. 输入唯一 Name 和可选 Description
  4. 点击 Network Type 列表并选择 CNV Linux bridge
  5. Bridge Name 字段输入网桥名称。
  6. (可选)如果资源配置了 VLAN ID,请在 VLAN Tag Number 字段中输入 ID 号。
  7. 点击 Create
6.13.2.3.2. 在 CLI 中创建 Linux 网桥 NetworkAttachmentDefinition

作为网络管理员,您可配置 cnv-bridge 类型的 NetworkAttachmentDefinition,为 Pod 和虚拟机提供第 2 层网络。

注意

NetworkAttachmentDefinition 必须与 Pod 或虚拟机位于同一个命名空间中。

流程

  1. 在任何本地目录中为 NetworkAttachmentDefinition 新建一个新文件。该文件必须具有以下内容,并修改以匹配您的配置:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: a-bridge-network
      annotations:
        k8s.v1.cni.cncf.io/resourceName: bridge.network.kubevirt.io/br0 1
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "a-bridge-network", 2
        "plugins": [
          {
            "type": "cnv-bridge", 3
            "bridge": "br0" 4
          },
          {
            "type": "cnv-tuning" 5
          }
        ]
      }'
    1
    如果添加此注解到 NetworkAttachmentDefinition,您的虚拟机实例将只在连接 br0 网桥的节点上运行。
    2
    必需。配置名称。建议您将配置名称与 NetworkAttachmentDefinition 的 name 值匹配。
    3
    为该 NetworkAttachmentDefinition 提供网络的 Container Network Interface (CNI) 插件的实际名称。不要更改此字段,除非要使用不同的 CNI。
    4
    如果该值不是 br0,则必须替换网桥的实际名称。
    5
    必需。MAC 池管理器可通过此项为连接分配唯一的 MAC 地址。
    $ oc create -f <resource_spec.yaml>
  2. 编辑要连接至桥接网络的虚拟机或虚拟机实例的配置文件,例如:

    apiVersion: v1
    kind: VirtualMachine
    metadata:
      name: example-vm
    spec:
      domain:
        devices:
          interfaces:
            - masquerade: {}
              name: default
            - bridge: {}
              name: bridge-net 1
      ...
    
      networks:
        - name: default
          pod: {}
        - name: bridge-net 2
          multus:
            networkName: a-bridge-network 3
      ...
    1 2
    桥接接口和网络的名称值必须相同。
    3
    您必须替换来自 NetworkAttachmentDefinition 的实际 name 值。
    注意

    虚拟机实例将连接到 default 的 Pod 网络和 bridge-net,该定义由名为 a-bridge-network 的 NetworkAttachmentDefinition 定义。

  3. 向资源应用配置文件:

    $ oc create -f <local/path/to/network-attachment-definition.yaml>
注意

当在下一部分中定义 vNIC 时,请确保 NETWORK 值是来自您在上一部分中创建的 NetworkAttachmentDefinition 的桥接网络名称。

6.13.2.4. 为虚拟机创建 NIC

从 web 控制台创建并附加额外 NIC。

流程

  1. 在容器原生虚拟化控制台的正确项目中,点击 WorkloadsVirtual Machines
  2. 选择虚拟机。
  3. 点击 Network Interfaces 以显示已附加到虚拟机的 NIC。
  4. 点击 Create Network Interface 在列表中创建新插槽。
  5. 填写新 NIC 的 NameModelNetworkTypeMAC Address
  6. 点击 按钮保存并附加 NIC 到虚拟机。

6.13.2.5. 网络字段

名称描述

名称

网络接口卡的名称

Model

指定网络接口卡的型号。支持的值包括 e1000e1000ene2k_pcipcnetrtl8139virtIO

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

在虚拟机上安装可选 QEMU 客户机代理,以便主机可以显示附加网络相关信息。

6.13.3. 在虚拟机上安装 QEMU 客户机代理

QEMU 客户机代理是在虚拟机上运行的守护进程。代理将虚拟机上的网络信息(尤其是附加网络的 IP 地址)传递给主机。

6.13.3.1. 先决条件

  • 通过输入以下命令验证客户机代理是否已安装并正在运行:

    $ systemctl status qemu-guest-agent

6.13.3.2. 在 Linux 虚拟机上安装 QEMU 客户机代理

qemu-guest-agent 广泛可用,默认在红帽虚拟机中可用。安装代理并启动服务

流程

  1. 通过其中一个控制台或通过 SSH 访问虚拟机命令行。
  2. 在虚拟机上安装 QEMU 客户机代理:

    $ yum install -y qemu-guest-agent
  3. 启动 QEMU 客户机代理服务:

    $ systemctl start qemu-guest-agent
  4. 确保服务持久:

    $ systemctl enable qemu-guest-agent

在 web 控制台中创建虚拟机或虚拟机模板时,您还可使用向导的 cloud-init 部分中的 custom script 字段来安装和启动 QEMU 客户机代理。

6.13.3.3. 在 Windows 虚拟机上安装 QEMU 客户机代理

对于 Windows 虚拟机,QEMU 客户机代理包含在 VirtIO 驱动程序中,该驱动程序可使用以下流程之一进行安装:

6.13.3.3.1. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤请参考您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。
6.13.3.3.2. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您正在安装的 Windows 版本,请参阅相关文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

6.13.4. 在虚拟机上查看 NIC 的 IP 地址

QEMU 客户机代理在虚拟机上运行,并会将附加 NIC 的 IP 地址传递给主机,以便您可以通过 web 控制台和 oc 客户端查看 IP 地址。

6.13.4.1. 先决条件

  1. 通过输入以下命令验证客户机代理是否已安装并正在运行:

    $ systemctl status qemu-guest-agent
  2. 如果客户机代理没有安装和运行,请在虚拟机上安装并运行客户机代理

6.13.4.2. 在 CLI 中查看虚拟机接口的 IP 地址

oc describe vmi <vmi_name> 命令中包含网络接口配置。

您还可通过在虚拟机上运行 ip addr 或通过运行 oc get vmi <vmi_name> -o yaml 来查看 IP 地址信息。

流程

  • 使用 oc describe 命令来显示虚拟机接口配置:

    $ oc describe vmi <vmi_name>
    
    ...
    Interfaces:
       Interface Name:  eth0
       Ip Address:      10.244.0.37/24
       Ip Addresses:
         10.244.0.37/24
         fe80::858:aff:fef4:25/64
       Mac:             0a:58:0a:f4:00:25
       Name:            default
       Interface Name:  v2
       Ip Address:      1.1.1.7/24
       Ip Addresses:
         1.1.1.7/24
         fe80::f4d9:70ff:fe13:9089/64
       Mac:             f6:d9:70:13:90:89
       Interface Name:  v1
       Ip Address:      1.1.1.1/24
       Ip Addresses:
         1.1.1.1/24
         1.1.1.2/24
         1.1.1.4/24
         2001:de7:0:f101::1/64
         2001:db8:0:f101::1/64
         fe80::1420:84ff:fe10:17aa/64
       Mac:             16:20:84:10:17:aa

6.13.4.3. 在 web 控制台中查看虚拟机接口的 IP 地址

IP 信息显示在虚拟机的 Virtual Machine Overview 屏幕中。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 点击虚拟机名称以打开 Virtual Machine Overview 屏幕。

每个附加 NIC 的信息会显示在 IP ADDRESSES 下。

6.14. 虚拟机磁盘。

6.14.1. 为虚拟机配置本地存储

您可以使用 hostpath 置备程序功能为您的虚拟机配置本地存储。

6.14.1.1. 关于 hostpath 置备程序

hostpath 置备程序是设计用于容器原生虚拟化的本地存储置备程序。如果要为虚拟机配置本地存储,您必须首先启用 hostpath 置备程序。

安装容器原生虚拟化 Operator 时,会自动安装 hostpath 置备程序 Operator。要使用它,您必须:

  • 配置 SELinux:

    • 如果您使用 Red Hat Enterprise Linux CoreOS 8 worker,您必须在每个节点上创建一个 MachineConfig 对象。
    • 否则,将 SELinux 标签 container_file_t 应用到每个节点上的由 PersistentVolume (PV) 支持的目录中。
  • 创建 HostPathProvisioner 自定义资源。
  • 为 hostpath 置备程序创建 StorageClass 对象。

在创建自定义资源时,hostpath 置备程序 Operator 将部署置备程序作为每个节点上的 DaemonSet。在自定义资源文件中,您将指定 hostpath 置备程序创建的 PersistentVolume 的后备目录。

6.14.1.2. 在 Red Hat Enterprise Linux CoreOS 8 中为 hostpath 置备程序配置 SELinux

在创建 HostPathProvisioner 自定义资源前,您必须配置 SELinux。要在 Red Hat Enterprise Linux CoreOS 8 worker 中配置 SELinux,您必须在每个节点上创建一个 MachineConfig 对象。

注意

如果您不使用 Red Hat Enterprise Linux CoreOS worker,请跳过该流程。

先决条件

  • 在每个节点上为 hostpath 置备程序创建的 PersistentVolume (PV) 创建后备目录。

流程

  1. 创建 MachineConfig 文件。例如:

    $ touch machineconfig.yaml
  2. 编辑该文件,确保包含希望 hostpath 置备程序在其中创建 PV 的目录。例如:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      name: 50-set-selinux-for-hostpath-provisioner
      labels:
        machineconfiguration.openshift.io/role: worker
    spec:
      config:
        ignition:
          version: 2.2.0
        systemd:
          units:
            - contents: |
                [Unit]
                Description=Set SELinux chcon for hostpath provisioner
                Before=kubelet.service
    
                [Service]
                ExecStart=/usr/bin/chcon -Rt container_file_t <path/to/backing/directory> 1
    
                [Install]
                WantedBy=multi-user.target
              enabled: true
              name: hostpath-provisioner.service
    1
    指定希望置备程序在其中创建 PV 的后备目录。
  3. 创建 MachineConfig 对象:

    $ oc create -f machineconfig.yaml -n <namespace>

6.14.1.3. 使用 hostpath 置备程序启用本地存储

要部署 hostpath 置备程序并使虚拟机能够使用本地存储,请首先创建一个 HostPathProvisioner 自定义资源。

先决条件

  • 在每个节点上为 hostpath 置备程序创建的 PersistentVolume (PV) 创建后备目录。
  • 将 SELinux 上下文 container_file_t 应用到每个节点上的 PV 后备目录。例如:

    $ sudo chcon -t container_file_t -R </path/to/backing/directory>
    注意

    如果您使用 Red Hat Enterprise Linux CoreOS 8 worker,您必须改用 MachineConfig 清单来配置 SELinux。

流程

  1. 创建 HostPathProvisioner 自定义资源文件。例如:

    $ touch hostpathprovisioner_cr.yaml
  2. 编辑该文件,确保 spec.pathConfig.path 值是您希望 hostpath 置备程序在其中创建 PV 的目录。例如:

    apiVersion: hostpathprovisioner.kubevirt.io/v1alpha1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      pathConfig:
        path: "</path/to/backing/directory>" 1
        useNamingPrefix: "false" 2
    1
    指定希望置备程序在其中创建 PV 的后备目录。
    2
    如果要使用绑定到所创建的 PV 的 PersistentVolumeClaim (PVC) 名称作为目录名的前缀,请将该值更改为 true
    注意

    如果您没有创建后备目录,则置备程序会尝试为您创建该目录。如果您没有应用 container_file_t SELinux 上下文,这会导致 Permission denied

  3. openshift-cnv 命名空间中创建自定义资源:

    $ oc create -f hostpathprovisioner_cr.yaml -n openshift-cnv

6.14.1.4. 创建 StorageClass 对象

当您创建 StorageClass 对象时,您将设置参数,它们会影响属于该存储类的 PersistentVolume (PV) 的动态置备。

注意

您不能在创建 StorageClass 对象后更新其参数。

流程

  1. 创建用于定义存储类的 YAML 文件。例如:

    $ touch storageclass.yaml
  2. 编辑该文件。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hostpath-provisioner 1
    provisioner: kubevirt.io/hostpath-provisioner
    reclaimPolicy: Delete 2
    volumeBindingMode: WaitForFirstConsumer 3
    1
    您可以通过更改此值来选择性地重命名存储类。
    2
    两个可能的 reclaimPolicy 值为 DeleteRetain。如果您没有指定值,则存储类默认为 Delete
    3
    volumeBindingMode 值决定何时发生动态置备和卷绑定。指定 WaitForFirstConsumer,将 PV 的绑定和置备延迟到创建使用 PersistentVolumeClaim (PVC) 的 Pod 后。这样可确保 PV 满足 Pod 的调度要求。
  3. 创建 StorageClass 对象:

    $ oc create -f storageclass.yaml

其他信息

6.14.2. 使用 virtctl 工具上传本地磁盘镜像

您可使用 virtctl 命令把一个本地存储的磁盘镜像上传到一个新的或已存在的 DataVolume 中。

6.14.2.1. 先决条件

6.14.2.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.14.2.3. 创建上传 DataVolume

使用 upload 数据源手动创建 DataVolume,用于上传本地磁盘镜像。

流程

  1. 创建 DataVolume 配置,用于指定 spec: source: upload{}

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <upload-datavolume> 1
    spec:
      source:
          upload: {}
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 2
    1
    DataVolume 的名称。
    2
    DataVolume 的大小请确定这个值大于或等于您要上传的磁盘的大小。
  2. 运行以下命令来创建 DataVolume:

    $ oc create -f <upload-datavolume>.yaml

6.14.2.4. 上传本地磁盘镜像至一个 DataVolume

您可使用 virtctl 将一个客户端机器中的一个本地磁盘镜像上传至集群中的 DataVolume (DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。

注意

上传本地磁盘镜像后,您可将其添加到虚拟机中。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。

流程

  1. 确定以下各项:

    • 要使用的上传 DataVolume 的名称。如果此 DataVolume 不存在,则会自动创建。
    • 在上传过程中创建 DataVolume 的大小。大小必须大于或等于磁盘镜像的大小。
    • 要上传的虚拟机磁盘镜像的文件位置
  2. 运行 virtctl image-upload 命令上传磁盘镜像。指定您在上一步中获得的参数。例如:

    $ virtctl image-upload dv <datavolume_name> \ 1
    --size=<datavolume_size> \ 2
    --image-path=</path/to/image> \ 3
    1
    DataVolume 的名称。
    2
    DataVolume 的大小例如: --size=500Mi, --size=1G
    3
    虚拟机磁盘镜像的文件路径。
    注意
    • 如果您不想创建新 DataVolume,请省略 --size 参数,并包含 --no-create 标志。
    • 若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。
  3. 可选。要验证 DataVolume 是否已创建,请运行以下命令来查看所有 DataVolume 对象:

    $ oc get dvs

6.14.2.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.14.3. 上传本地磁盘镜像至块存储 DataVolume

您可使用 virtctl 命令行实用程序上传本地磁盘镜像至块 DataVolume 中。

在此工作流中,您会创建一个本地块设备用作 PersistentVolume,将此块卷与 upload DataVolume 关联,并使用 virtctl 将本地磁盘镜像上传至 DataVolume 中。

6.14.3.1. 先决条件

6.14.3.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.14.3.3. 关于块 PersistentVolume

块 PersistentVolume (PV) 是一个受原始块设备支持的 PV。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的虚拟机来说,使用它可以获得性能优势。

原始块卷可以通过在 PV 和 PersistentVolumeClaim (PVC) 规格中指定 volumeMode: Block 来置备。

6.14.3.4. 创建本地块 PersistentVolume

通过填充文件并将其挂载为循环设备,在节点上创建本地块 PersistentVolume (PV)。然后您可以在 PV 配置中将该循环设备引用为 Block 卷,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 配置。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置一个 StorageClass。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的 PersistentVolume 的文件名。

6.14.3.5. 创建上传 DataVolume

使用 upload 数据源手动创建 DataVolume,用于上传本地磁盘镜像。

流程

  1. 创建 DataVolume 配置,用于指定 spec: source: upload{}

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <upload-datavolume> 1
    spec:
      source:
          upload: {}
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 2
    1
    DataVolume 的名称。
    2
    DataVolume 的大小请确定这个值大于或等于您要上传的磁盘的大小。
  2. 运行以下命令来创建 DataVolume:

    $ oc create -f <upload-datavolume>.yaml

6.14.3.6. 上传本地磁盘镜像至一个 DataVolume

您可使用 virtctl 将一个客户端机器中的一个本地磁盘镜像上传至集群中的 DataVolume (DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。

注意

上传本地磁盘镜像后,您可将其添加到虚拟机中。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。

流程

  1. 确定以下各项:

    • 要使用的上传 DataVolume 的名称。如果此 DataVolume 不存在,则会自动创建。
    • 在上传过程中创建 DataVolume 的大小。大小必须大于或等于磁盘镜像的大小。
    • 要上传的虚拟机磁盘镜像的文件位置
  2. 运行 virtctl image-upload 命令上传磁盘镜像。指定您在上一步中获得的参数。例如:

    $ virtctl image-upload dv <datavolume_name> \ 1
    --size=<datavolume_size> \ 2
    --image-path=</path/to/image> \ 3
    1
    DataVolume 的名称。
    2
    DataVolume 的大小例如: --size=500Mi, --size=1G
    3
    虚拟机磁盘镜像的文件路径。
    注意
    • 如果您不想创建新 DataVolume,请省略 --size 参数,并包含 --no-create 标志。
    • 若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。
  3. 可选。要验证 DataVolume 是否已创建,请运行以下命令来查看所有 DataVolume 对象:

    $ oc get dvs

6.14.3.7. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.14.4. 将本地虚拟机磁盘移动到不同的节点中

使用本地卷存储的虚拟机可被移动,以便在特定节点中运行。

因为以下原因,您可能想要将该虚拟机移动到特定的节点上:

  • 当前节点对本地存储配置有限制。
  • 新节点对那个虚拟机的工作负载进行了更好的优化。

要移动使用本地存储的虚拟机,您必须使用 DataVolume 克隆基础卷。克隆操作完成后,您可以 编辑虚拟机配置,以便使用新 DataVolume,或 将新 DataVolume 添加到其他虚拟机

注意

没有 cluster-admin 角色的用户需要 额外的用户权限 才能在命名空间间克隆卷。

6.14.4.1. 克隆本地卷到另一个节点

您可以通过克隆底层 PersistentVolumeClaim (PVC),移动虚拟机磁盘使其在特定节点上运行。

要确保虚拟机磁盘克隆到正确的节点,您必须创建新的 PersistentVolume (PV) 或在正确的节点上识别它。对 PV 应用一个唯一标签,以便 DataVolume 能够引用它。

注意

目标 PV 的大小不得小于源 PVC。如果目标 PV 小于源 PVC,克隆操作会失败。

先决条件

  • 虚拟机不能正在运行。在克隆虚拟机磁盘前关闭虚拟机。

流程

  1. 在节点上创建新本地 PV,或使用已有的本地 PV:

    • 创建包含 nodeAffinity.nodeSelectorTerms 参数的本地 PV。以下 manifest 在 node01 上创建了一个 10Gi 的本地 PV

      kind: PersistentVolume
      apiVersion: v1
      metadata:
        name: <destination-pv> 1
        annotations:
      spec:
        accessModes:
        - ReadWriteOnce
        capacity:
          storage: 10Gi 2
        local:
          path: /mnt/local-storage/local/disk1 3
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node01 4
        persistentVolumeReclaimPolicy: Delete
        storageClassName: local
        volumeMode: Filesystem
      1
      PV 的名称。
      2
      PV 的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
      3
      节点上的挂载路径。
      4
      要创建 PV 的节点的名称。
    • 已存在于节点上的一个 PV。您可以通过查看其配置中的 nodeAffinity 字段来标识置备 PV 的节点:

      $ oc get pv <destination-pv> -o yaml

      以下输出显示 PV 位于 node01:

      ...
      spec:
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname 1
                operator: In
                values:
                - node01 2
      ...
      1
      Kubernetes.io/hostname 使用节点主机名来选择节点。
      2
      节点的主机名称。
  2. 为 PV 添加唯一标签:

    $ oc label pv <destination-pv> node=node01
  3. 创建 DataVolume 清单来引用以下内容:

    • 虚拟机的 PVC 名称和命名空间。
    • 应用上一步中的 PV 标签。
    • 目标 PV 的大小。

      apiVersion: cdi.kubevirt.io/v1alpha1
      kind: DataVolume
      metadata:
        name: <clone-datavolume> 1
      spec:
        source:
          pvc:
            name: "<source-vm-disk>" 2
            namespace: "<source-namespace>" 3
        pvc:
          accessModes:
            - ReadWriteOnce
          selector:
            matchLabels:
              node: node01 4
          resources:
            requests:
              storage: <10Gi> 5
      1
      新 DataVolume 的名称。
      2
      源 PVC 的名称。如果您不知道 PVC 名称,您可以在虚拟机配置中找到它: spec.volumes.persistentVolumeClaim.claimName
      3
      源 PVC 所在的命名空间。
      4
      应用于上一步中 PV 的标签。
      5
      目标 PV 的大小。
  4. 通过将 DataVolume 清单应用到集群来开始克隆操作:

    $ oc apply -f <clone-datavolume.yaml>

DataVolume 将虚拟机的 PVC 克隆到特定节点上的 PV 中。

6.14.5. 通过添加空白磁盘镜像扩展虚拟存储

您可向容器原生虚拟化添加空白磁盘镜像来提高存储容量或创建新数据分区。

6.14.5.1. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.14.5.2. 使用 DataVolume 创建空白磁盘镜像

您可通过自定义和部署 DataVolume 配置文件在 PersistentVolumeClaim 中创建新空白磁盘镜像。

先决条件

  • 至少一个可用 PersistentVolume。
  • 安装 OpenShift CLI(oc)。

流程

  1. 编辑 DataVolume 配置文件:

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: blank-image-datavolume
    spec:
      source:
          blank: {}
      pvc:
        # Optional: Set the storage class or omit to accept the default
        # storageClassName: "hostpath"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
  2. 运行以下命令,创建空白磁盘镜像:

    $ oc create -f <blank-image-datavolume>.yaml

6.14.5.3. 模板:适用于空白磁盘镜像的 DataVolume 配置文件

blank-image-datavolume.yaml

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: blank-image-datavolume
spec:
  source:
      blank: {}
  pvc:
    # Optional: Set the storage class or omit to accept the default
    # storageClassName: "hostpath"
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 500Mi

6.14.6. DataVolume 的存储默认值

kubevirt-storage-class-defaults ConfigMap 为 DataVolumes 提供了默认的访问模式卷模式。您可以编辑或添加 ConfigMap 的默认存储类,以便在 Web 控制台中创建与基础存储更加匹配的 DataVolume。

6.14.6.1. 关于 DataVolume 的存储设置

DataVolume 要求在 web 控制台中创建定义的 访问模式卷模式。这些存储设置默认使用 ReadWriteOnce 访问模式和 Filesystem 卷模式进行配置。

您可以通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改这些设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

在 Web 控制台中创建的所有 DataVolume 都使用默认存储设置,除非您指定了在 ConfigMap 中也定义的存储类。

6.14.6.1.1. 访问模式

DataVolume 支持以下访问模式:

  • ReadWriteOnce:这个卷可以被一个单一的节点以读写模式挂载。ReadWriteOnce 具有更大的灵活性,它是默认设置。
  • ReadWriteMany:卷可以被多个节点以读写模式挂载。对于一些功能(如虚拟机在节点间实时迁移),ReadWriteMany 是必需的。

如果底层存储支持,则建议使用 ReadWriteMany

6.14.6.1.2. 卷模式

卷模式定义了卷是否要与格式化的文件系统一起使用,或者保持在原始块状态。DataVolume 支持以下卷模式:

  • Filesystem: 在 DataVolume 中创建文件系统。这是默认的设置。
  • Block: 创建块 DataVolume。只有底层存储支持时才使用 Block

6.14.6.2. 在 web 控制台中编辑 kubevirt-storage-class-defaults ConfigMap

通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改 DataVolume 的存储设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

流程

  1. 从侧边菜单中点 WorkloadsConfig Maps
  2. Project 列表中,选择 openshift-cnv
  3. 点击 kubevirt-storage-class-defaults 打开 Config Map Overview
  4. 点击 YAML 选项卡以显示可编辑的配置。
  5. 使用适合您的底层存储的存储配置更新 data 值:

    ...
    data:
      accessMode: ReadWriteOnce 1
      volumeMode: Filesystem 2
      <new>.accessMode: ReadWriteMany 3
      <new>.volumeMode: Block 4
    1
    默认 accessMode 是 ReadWriteOnce
    2
    默认 volumeMode 是 Filesystem
    3
    如果您为存储类添加一个访问模式,请将参数的 <new> 部分替换为存储类名称。
    4
    如果您为存储类添加一个卷模式,请将参数的 <new> 部分替换为存储类名称。
  6. Save 以更新 ConfigMap。

6.14.6.3. 在 CLI 中编辑 kubevirt-storage-class-defaults ConfigMap

通过编辑 openshift-cnv 命名空间中的 kubevirt-storage-class-defaults ConfigMap 来修改 DataVolume 的存储设置。您还可以为其他存储类添加设置,以便在 Web 控制台中为不同的存储类型创建 DataVolume。

注意

您必须配置底层存储支持的存储设置。

流程

  1. 使用 oc edit 编辑 ConfigMap:

    $ oc edit configmap kubevirt-storage-class-defaults -n openshift-cnv
  2. 更新 ConfigMap 的 data 值:

    ...
    data:
      accessMode: ReadWriteOnce 1
      volumeMode: Filesystem 2
      <new>.accessMode: ReadWriteMany 3
      <new>.volumeMode: Block 4
    1
    默认 accessMode 是 ReadWriteOnce
    2
    默认 volumeMode 是 Filesystem
    3
    如果为存储类添加了访问模式,需要将参数的 <new> 部分替换为存储类名称。
    4
    如果您为存储类添加一个卷模式,请将参数的 <new> 部分替换为存储类名称。
  3. 保存并退出编辑器以更新 ConfigMap。

6.14.6.4. 多个存储类默认设置示例

以下 YAML 文件是一个 kubevirt-storage-class-defaults ConfigMap 示例,它为两个存储类( migrationblock)配置了存储设置。

在更新 ConfigMap 前,请确保您的底层存储支持所有设置。

kind: ConfigMap
apiVersion: v1
metadata:
  name: kubevirt-storage-class-defaults
  namespace: openshift-cnv
...
data:
  accessMode: ReadWriteOnce
  volumeMode: Filesystem
  nfs-sc.accessMode: ReadWriteMany
  nfs-sc.volumeMode: Filesystem
  block-sc.accessMode: ReadWriteMany
  block-sc.volumeMode: Block

6.14.7. 准备 CDI 涂销空间

6.14.7.1. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.14.7.2. 了解涂销空间

Containerized Data Importer (CDI) 需要涂销空间(临时存储)来完成一些操作,如导入和上传虚拟机镜像。在此过程中,CDI 会提供一个与支持目标 DataVolume (DV) 的 PVC 大小相等的涂销空间 PVC。该涂销空间 PVC 将在操作完成或中止后删除。

该 CDIConfig 对象可用于通过设置 CDIConfig 对象的 spec: 部分中的 scratchSpaceStorageClass 来定义使用哪个 StorageClass 绑定涂销空间 PVC。

如果定义的 StorageClass 与集群中的 StorageClass 不匹配,则会使用为集群定义的默认 StorageClass。如果没有在集群中定义默认 StorageClass,则会使用置备原始 DV 或 PVC 时使用的 StorageClass。

注意

CDI 需要通过 file 卷模式来请求涂销空间,与支持原始 DataVolume 的 PVC 无关。如果 block 卷模式支持原始 PVC,则您必须定义一个能够置备 file 卷模式 PVC 的 StorageClass。

手动调配

如果没有存储类,CDI 则会使用项目中与镜像的大小要求匹配的任何 PVC。如果没有与这些要求匹配的 PVC,则 CDI 导入 Pod 将保持 Pending 状态,直至有适当的 PVC 可用或直至超时功能关闭 Pod。

6.14.7.3. 需要涂销空间的 CDI 操作

类型原因

registry 导入

CDI 必须下载镜像至涂销空间,并对层进行提取,以查找镜像文件。然后镜像文件传递至 QEMU-IMG 以转换成原始磁盘。

上传镜像

QEMU-IMG 不接受来自 STDIN 的输入。相反,要上传的镜像保存到涂销空间中,然后才可传递至 QEMU-IMG 进行转换。

存档镜像的 HTTP 导入

QEMU-IMG 不知道如何处理 CDI 支持的存档格式。相反,镜像取消存档并保存到涂销空间中,然后再传递至 QEMU-IMG。

经过身份验证的镜像的 HTTP 导入

QEMU-IMG 未充分处理身份验证。相反,镜像保存到涂销空间中并进行身份验证,然后再传递至 QEMU-IMG。

自定义证书的 HTTP 导入

QEMU-IMG 未充分处理 HTTPS 端点的自定义证书。相反,CDI 下载镜像到涂销空间,然后再将文件传递至 QEMU-IMG。

6.14.7.4. 在 CDI 配置中定义 StorageClass

在 CDI 配置中定义 StorageClass,为 CDI 操作动态置备涂销空间。

流程

  • 使用 oc 客户端来编辑 cdiconfig/config 并添加或编辑 spec: scratchSpaceStorageClass,以便与集群中的 StorageClass 匹配。

    $ oc edit cdiconfig/config
    API Version:  cdi.kubevirt.io/v1alpha1
    kind: CDIConfig
    metadata:
      name: config
    ...
    spec:
      scratchSpaceStorageClass: "<storage_class>"
    ...

6.14.7.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

其他资源

  • 有关 StorageClass 以及如何在集群中对其进行定义的更多信息,请参阅动态置备小节。

6.14.8. 删除 DataVolume

您可以使用 oc CLI 手动删除 DataVolume。

注意

当您删除虚拟机时,其使用的 DataVolume 会被自动删除。

6.14.8.1. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.14.8.2. 列出所有 DataVolume

您可以使用 oc CLI 列出集群中的 DataVolume。

流程

  • 运行以下命令列出所有 DataVolumes:

    $ oc get dvs

6.14.8.3. 删除 DataVolume

您可以使用 oc CLI 删除 DataVolume。

先决条件

  • 找出要删除的 DataVolume 的名称。

流程

  • 运行以下命令删除 DataVolume:

    $ oc delete dv <datavolume_name>
    注意

    此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用 -n <project_name> 选项。

第 7 章 虚拟机模板

7.1. 创建虚拟机模板

使用虚拟机模板可轻松创建具有相似配置的多个虚拟机。创建完模板后,在创建虚拟机时即可引用该模板。

7.1.1. 利用 web 控制台中的互动向导创建虚拟机模板

web 控制台带有一个交互式的向导来帮助您进行 General, Networking, Storage, AdvancedReview 步骤,以简化创建虚拟机的过程。所有必填字段均标有 *。在所有必填字段中提供值后,向导才会移至下一步。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machine Templates
  2. 点击 Create Template 并选择 New with Wizard
  3. General 步骤中填写所有必填字段。
  4. 点击 Next 进入 Networking 屏幕。默认会附加名为 nic0 的 NIC。

    1. 可选:点 Add Network Interface 来创建额外 NIC。
    2. Optional:您可以通过点 Options 菜单 kebab 并选择 Delete 来删除任何或所有 NIC。从模板创建的虚拟机无需附加 NIC。可在创建虚拟机之后创建 NIC。
  5. 点击 Next 进入 Storage 屏幕。

    1. 可选:点击 Add Disk 创建额外磁盘。
    2. 可选:点击磁盘可修改可用字段。点击 ✓ 按钮保存更改。
    3. 可选:点击 DiskSelect Storage 列表中选择可用磁盘。

      注意

      如果在 General 步骤中将 URLContainer 选为 Source,则会创建一个 rootdisk 磁盘,并将其作为 Bootable Disk 附加到虚拟机。您可修改 rootdisk,但不可将其移除。

      如果虚拟机上未附加任何磁盘,则从 PXE 源置备的虚拟机无需 Bootable Disk。如有一个或多个磁盘附加到虚拟机,您必须将其中一个选为 Bootable Disk

  6. 点击 Create Virtual Machine Template >Results 屏幕显示虚拟机模板的 JSON 配置文件。

    该模板列于 WorkloadsVirtual Machine Templates 中。

7.1.2. 虚拟机模板交互式向导字段

下表描述了 Create Virtual Machine Template 交互式向导中 Basic SettingsNetworkingStorage 窗格的字段。

7.1.2.1. 虚拟机模板向导字段

名称参数描述

Source

PXE

从 PXE 菜单置备虚拟机。集群中需要支持 PXE 的 NIC。

URL

从由 HTTPS3 端点提供的镜像置备虚拟机。

Container

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

Disk

从一个磁盘置备虚拟机。

操作系统

 

这是为虚拟机选择的主要操作系统。

Flavor

small、medium、large、tiny、Custom

预设值,用于决定分配给虚拟机的 CPU 和内存量。显示的 Flavor 的预设置值是根据操作系统决定的。

内存

 

分配给虚拟机的内存大小(以 GiB 为单位)。

CPU

 

分配给虚拟机的 CPU 数量。

Workload Profile

high performance

针对高性能负载进行了优化的虚拟机配置。

Server

针对运行服务器工作负载进行优化的配置集。

Desktop

用于桌面的虚拟机配置。

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

7.1.2.2. Cloud-init 字段

名称描述

Hostname

为虚拟机设置具体主机名。

Authenticated SSH Keys

复制到虚拟机上 ~/.ssh/authorized_keys 的用户公钥。

Use custom script

将其他选项替换为您粘贴自定义 cloud-init 脚本的字段。

7.1.2.3. 网络字段

名称描述

名称

网络接口卡的名称

Model

指定网络接口卡的型号。支持的值包括 e1000e1000ene2k_pcipcnetrtl8139virtIO

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

7.1.2.4. 存储字段

名称描述

Source

为虚拟机选择一个空磁盘,或从以下选项中选择:URLContainerAttach Cloned DiskAttach Disk。要选择现有磁盘并将其附加到虚拟机,请从可用 PersistentVolumeClaims (PVC) 列表中选择 Attach Cloned DiskAttach Disk

名称

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

SIZE (GB)

磁盘大小(以 GB 为单位)。

Interface

磁盘设备的类型。支持的接口包括 virtIOSATASCSI

Storage class

用于创建磁盘的 StorageClass

7.2. 编辑虚拟机模板

要在 web 控制台中更新虚拟机模板,您可以在 YAML 编辑器中编辑完整的配置,或在 Virtual Machine Template Overview 屏幕中编辑参数的子集。

7.2.1. 在 web 控制台中编辑虚拟机模板

在 web 控制台的 Virtual Machine Template Overview 屏幕中点击相关字段旁的铅笔图标以编辑虚拟机模板的选择值。可使用 CLI 编辑其他值。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machine Templates
  2. 选择虚拟机模板以打开 Virtual Machine Template Overview 屏幕。
  3. 点击铅笔图标使该字段可编辑。
  4. 进行相关的更改并点击 Save

编辑虚拟机模板不会影响已经从该模板中创建的虚拟机。

7.2.2. 在 web 控制台中编辑虚拟机模板 YAML 配置

您可从 web 控制台编辑虚拟机模板的 YAML 配置。

并非所有参数均可修改。如果在进行了无效配置情况下点击 Save,则会出现一个错误消息用来指出不可修改的参数。

注意

编辑时离开 YAML 屏幕会取消您对配置做出的任何更改。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machine Templates
  2. 选择一个模板。
  3. 点击 YAML 选项卡以显示可编辑的配置。
  4. 编辑该文件并点击 Save

确认消息显示修改已成功,其中包含对象的更新版本号。

7.2.3. 将虚拟磁盘添加到虚拟机模板

使用这个步骤将虚拟磁盘添加到虚拟机模板

流程

  1. Virtual Machine Templates 选项卡中选择您的虚拟机模板。
  2. 选择 Disks 选项卡。
  3. 点击 Add Disks 打开 Add Disk 窗口。
  4. Add Disk 窗口中,指定 SourceNameSizeInterfaceStorage Class
  5. 使用下拉列表和复选框编辑磁盘配置。
  6. 点击 OK

7.2.4. 将网络接口添加到虚拟机模板

将网络接口添加到虚拟机模板

流程

  1. Virtual Machine Templates 选项卡中选择虚拟机模板。
  2. 选择 Network Interfaces 选项卡。
  3. 点击 Add Network Interface
  4. Add Network Interface 窗口中,指定网络接口的 NameModelNetworkTypeMAC Address
  5. 点击 Add 添加网络接口。
  6. 重启虚拟机以启用访问。
  7. 编辑下拉列表和复选框来配置网络接口。
  8. 点击 Save Changes
  9. 点击 OK

新网络接口显示在 Create Network Interfac 列表的顶部,直到用户重启。

新网络接口有一个 Pending VM restart 链接状态,直到您重启虚拟机。将鼠标悬停在链接状态上方可显示更详细的信息。

当在虚拟机上定义了网络接口卡并连接到网络时,Link State 会被默认设置为 Up

7.2.5. 为虚拟机模板编辑 CD-ROM

使用以下流程为虚拟机配置 CD-ROM。

流程

  1. Virtual Machine Templates 选项卡中选择您的虚拟机模板。
  2. 选择 Overview 选项卡。
  3. 点击 CD-ROMs 标签右侧的铅笔图标来添加或编辑 CD-ROM 配置。这会打开 Edit CD-ROM 窗口。

    • 如果没有可编辑的 CD-ROM,会显示如下信息:The virtual machine doesn’t have any CD-ROMs attached.
    • 如果有可用的 CD-ROM,您可以点击 -来删除一个 CD-ROM。
  4. Edit CD-ROM 窗口中执行以下操作:

    1. Media Type 下拉菜单中选择 CD-ROM 配置类型。CD-ROM 配置类型是 ContainerURLPersistent Volume Claim
    2. 为每个 Type 填写所需信息。
    3. 当添加了所有 CD-ROM 时,点击 Save

7.3. 为虚拟机模板启用专用资源

虚拟机可以具有一个节点的资源,比如 CPU,以便提高性能。

7.3.1. 关于专用资源

当为您的虚拟机启用专用资源时,您的工作负载将会在不会被其他进程使用的 CPU 上调度。通过使用专用资源,您可以提高虚拟机性能以及延迟预测的准确性。

7.3.2. 先决条件

  • 节点上必须配置 CPU Manager。在调度虚拟机工作负载前,请确认节点具有 cpumanager = true 标签。

7.3.3. 为虚拟机模板启用专用资源

您可以在 web 控制台的 Virtual Machine Template Overview 页面中为虚拟机模板启用专用资源。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machine Templates
  2. 选择虚拟机模板以打开 Virtual Machine Template Overview 页。
  3. Details 标签页。
  4. Dedicated Resources 项右面的铅笔标签打开 Dedicated Resources 窗口。
  5. 选择 Schedule this workload with dedicated resources (guaranteed policy)
  6. Save

7.4. 删除虚拟机模板

您可删除 web 控制台中的虚拟机模板。

7.4.1. 删除 web 控制台中的虚拟机模板

删除虚拟机模板会将其从集群中永久移除。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machine Templates
  2. 您可从本窗格删除虚拟机,这有助于对一个窗格中的多个模板执行操作,也可从 Virtual Machine Template Details 窗格,其中可查看所选模板的综合详情:

    • 点击要删除的模板 kebab 的 Options 菜单,然后选择 Delete Template
    • 点击模板名称打开 Virtual Machine Template Details 窗格,然后点击 ActionsDelete Template
  3. 在确认弹出窗口中点击 Delete 永久删除模板。

第 8 章 实时迁移

8.1. 虚拟机实时迁移

8.1.1. 先决条件

  • 在使用 LiveMigration 前,请确保虚拟机使用的存储类具有一个带有共享 ReadWriteMany(RWX)访问模式的 PersistentVolumeClaim(PVC)。请参阅 DataVolume 的存储默认设置,以确保您的存储设置正确。

8.1.2. 了解实时迁移

实时迁移是在不中断虚拟工作负载或访问的情况下,将正在运行的虚拟机实例迁移到集群中另一节点的过程。如果您选择将一个虚拟机实例迁移到另一节点,则该过程为手动过程,如果虚拟机实例具有 LiveMigrate 驱除策略且运行它的节点已置于维护中,则该过程为自动过程。

重要

虚拟机必须具有一个采用共享 ReadWriteMany (RWX) 访问模式的 PersistentVolumeClaim (PVC) 才能实时迁移。

8.1.3. 更新 LiveMigration 访问模式

要使 LiveMigration 正常工作,必须使用 ReadWriteMany(RWX)访问模式。如果需要,使用此流程更新访问模式。

流程

  • 要设置 RWX 访问模式,请运行以下 oc patch 命令:

    $ oc patch -n openshift-cnv \
        cm kubevirt-storage-class-defaults \
            -p '{"data":{"'$<STORAGE_CLASS>'.accessMode":"ReadWriteMany"}}'

8.2. 实时迁移限制和超时

应用实时迁移限制和超时,以防迁移过程使集群不堪重负。通过编辑 kubevirt-config 配置文件来配置这些设置。

8.2.1. 配置实时迁移限制和超时

通过向 kubevirt-config 配置文件添加更新的 key:value 字段来为集群配置实时迁移限制和超时,该文件位于 openshift-cnv 命名空间中。

流程

  • 编辑 kubevirt-config 配置文件并添加必要的实时迁移参数。以下示例显示默认值:

    $ oc edit configmap kubevirt-config -n openshift-cnv
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kubevirt-config
      namespace: kubevirt
      labels:
        kubevirt.io: ""
    data:
      feature-gates: "LiveMigration"
      migrations: |-
        parallelMigrationsPerCluster: 5
        parallelOutboundMigrationsPerNode: 2
        bandwidthPerMigration: 64Mi
        completionTimeoutPerGiB: 800
        progressTimeout: 150

8.2.2. 集群范围内的实时迁移限制和超时

表 8.1. 迁移参数

参数描述默认

parallelMigrationsPerCluster

集群中并行运行的迁移数。

5

parallelOutboundMigrationsPerNode

每个节点的最大出站迁移数。

2

bandwidthPerMigration

每次迁移的带宽限制,以 MiB/s 为单位。

64Mi

completionTimeoutPerGiB

如果迁移未能在此时间内完成则会取消,以每 GiB 内存秒数为单位。例如,如果 6GiB 内存的虚拟机实例未能在 4800 秒内完成,该虚拟机实例将超时。如果 Migration MethodBlockMigration,则迁移磁盘的大小纳入计算中。

800

progressTimeout

如果内存复制未能在此时间内取得进展,则会取消迁移,以秒为单位。

150

8.3. 迁移虚拟机实例到另一节点

使用 web 控制台或 CLI 手动将虚拟机实例实时迁移到另一节点。

8.3.1. 在 web 控制台中启动虚拟机实例的实时迁移

将正在运行的虚拟机实例迁移到集群中的不同节点。

注意

Migrate Virtual Machine 对所有用户可见,但只有管理员用户可以启动虚拟机迁移。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 您可从此屏幕启动迁移,这有助于在一个屏幕中对多个虚拟机执行操作,也可从 Virtual Machine Details 屏幕中进行,其中可查看所选虚拟机的综合详情:

    • 点击虚拟机 kebab 末尾的 Options 菜单,然后选择 Migrate Virtual Machine
    • 点击虚拟机名称,打开 Virtual Machine Details 屏幕,然后点击 ActionsMigrate Virtual Machine
  3. 点击 Migrate 把虚拟机迁移到另一节点。

8.3.2. 在 CLI 中启动虚拟机实例的实时迁移

通过在集群中创建 VirtualMachineInstanceMigration 对象并引用虚拟机实例的名称来启动正在运行的虚拟机实例的实时迁移。

流程

  1. 为要迁移的虚拟机实例创建 VirtualMachineInstanceMigration 配置文件。例如 VMI-migrate.yaml

    apiVersion: kubevirt.io/v1alpha3
    kind: VirtualMachineInstanceMigration
    metadata:
      name: migration-job
    spec:
      vmiName: vmi-fedora
  2. 在集群中创建对象:

    $ oc create -f vmi-migrate.yaml

VirtualMachineInstanceMigration 对象触发虚拟机实例的实时迁移。只要虚拟机实例在运行,该对象便始终存在于集群中,除非手动删除。

8.4. 监控虚拟机实例的实时迁移

您可通过 web 控制台或 CLI 监控虚拟机实例的实时迁移进程。

8.4.1. 在 web 控制台中监控虚拟机实例的实时迁移

在迁移期间,虚拟机的状态为 Migrating。该状态显示在 Virtual Machines 列表中,或显示在正在迁移的虚拟机的 Virtual Machine Details 屏幕中。

流程

  • 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines

8.4.2. 在 CLI 中监控虚拟机实例的实时迁移

虚拟机迁移的状态保存在 VirtualMachineInstance 配置的 Status 组件中。

流程

  • 在正在迁移的虚拟机实例上使用 oc describe 命令:

    $ oc describe vmi vmi-fedora
    ...
    Status:
      Conditions:
        Last Probe Time:       <nil>
        Last Transition Time:  <nil>
        Status:                True
        Type:                  LiveMigratable
      Migration Method:  LiveMigration
      Migration State:
        Completed:                    true
        End Timestamp:                2018-12-24T06:19:42Z
        Migration UID:                d78c8962-0743-11e9-a540-fa163e0c69f1
        Source Node:                  node2.example.com
        Start Timestamp:              2018-12-24T06:19:35Z
        Target Node:                  node1.example.com
        Target Node Address:          10.9.0.18:43891
        Target Node Domain Detected:  true

8.5. 取消虚拟机实例的实时迁移

取消实时迁移,以便虚拟机实例保留在原始节点上。

您可通过 web 控制台或 CLI 取消实时迁移。

8.5.1. 在 web 控制台中取消虚拟机实例的实时迁移

可以使用 WorkloadsVirtual Machines 屏幕中的每个虚拟机上的 kebab Options 菜单,或使用 Virtual Machine Details 屏幕上的 Actions 菜单来取消虚拟机实例的实时迁移。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 您可从此屏幕取消迁移,这有助于在一个屏幕中对多个虚拟机执行操作,也可通过 Virtual Machine Details 屏幕进行,其中可查看所选虚拟机的综合详情:

    • 点击虚拟机 kebab 末尾的 Options 菜单,然后选择 Cancel Virtual Machine Migration
    • 点击虚拟机名称,打开 Virtual Machine Details 屏幕,然后点击 ActionsCancel Virtual Machine Migration
  3. 点击 Cancel Migration 以取消虚拟机实时迁移。

8.5.2. 在 CLI 中取消虚拟机实例的实时迁移

通过删除与迁移关联的 VirtualMachineInstanceMigration 对象来取消虚拟机实例的实时迁移。

流程

  • 删除触发实时迁移的 VirtualMachineInstanceMigration 对象,本例中为 migration-job

    $ oc delete vmim migration-job

8.6. 配置虚拟机驱除策略

LiveMigrate 驱除策略可确保当节点置于维护中或排空时,虚拟机实例不会中断。具有驱除策略的虚拟机实例将实时迁移到另一节点。

8.6.1. 使用 LiveMigration 驱除策略配置自定义虚拟机

您只需在自定义虚拟机上配置 LiveMigration 驱除策略。通用模板默认已配置该驱除策略。

流程

  1. evictionStrategy: LiveMigrate 选项添加到虚拟机配置文件的 spec 部分。本例使用 oc edit 来更新 VirtualMachine 配置文件中的相关片段:

    $ oc edit vm <custom-vm> -n <my-namespace>
    apiVersion: kubevirt.io/v1alpha3
    kind: VirtualMachine
    metadata:
      name: custom-vm
    spec:
      terminationGracePeriodSeconds: 30
      evictionStrategy: LiveMigrate
      domain:
        resources:
          requests:
    ...
  2. 重启虚拟机以使更新生效:

    $ virtctl restart <custom-vm> -n <my-namespace>

第 9 章 节点维护

9.1. 手动刷新 TLS 证书

容器原生虚拟化组件的 TLS 证书是在安装时创建的,并在一年内有效。您必须在这些证书过期前进行手动刷新。

9.1.1. 刷新 TLS 证书

要刷新容器原生虚拟化的 TLS 证书,请下载并运行 rotate-certs 脚本。该脚本可从 GitHub 上的 kubevirt/hyperconverged-cluster-operator 存储库中获得。

重要

刷新证书时,以下操作会受到影响:

  • 迁移会取消
  • 镜像上传会取消
  • VNC 和控制台连接会关闭

先决条件

  • 确保您以具有 cluster-admin 权限的用户身份登录集群。该脚本使用与集群的活跃会话来刷新 openshift-cnv 命名空间中的证书。

流程

  1. 从 GitHub 下载 rotate-certs.sh 脚本:

    $ curl -O https://raw.githubusercontent.com/kubevirt/hyperconverged-cluster-operator/master/tools/rotate-certs.sh
  2. 确保脚本可以执行:

    $ chmod +x rotate-certs.sh
  3. 运行脚本:

    $ ./rotate-certs.sh -n openshift-cnv

TLS 证书已刷新,并在一年内有效。

9.2. 节点维护模式

9.2.1. 了解节点维护模式

将节点置于维护中可将节点标记为不可调度,并排空其中的所有虚拟机和 pod。具有 LiveMigrate 驱除策略的虚拟机实例实时迁移到另一节点不会丢失服务。在从通用模板创建的虚拟机中默认配置此驱除策略,而自定义虚拟机则必须手动更配置。

没有驱除策略的虚拟机实例将在该节点上被删除,并会在另一节点上重新创建。

重要

虚拟机必须具有一个采用共享 ReadWriteMany (RWX) 访问模式的 PersistentVolumeClaim (PVC) 才能实时迁移。

9.3. 将节点设置为维护模式

9.3.1. 了解节点维护模式

将节点置于维护中可将节点标记为不可调度,并排空其中的所有虚拟机和 pod。具有 LiveMigrate 驱除策略的虚拟机实例实时迁移到另一节点不会丢失服务。在从通用模板创建的虚拟机中默认配置此驱除策略,而自定义虚拟机则必须手动更配置。

没有驱除策略的虚拟机实例将在该节点上被删除,并会在另一节点上重新创建。

重要

虚拟机必须具有一个采用共享 ReadWriteMany (RWX) 访问模式的 PersistentVolumeClaim (PVC) 才能实时迁移。

通过 web 控制台或 CLI 将节点置于维护模式

9.3.2. 通过 web 控制台将节点设置为维护模式

使用 ComputeNodes 列表中每个节点上 kebab 的 Options 菜单,或使用 Node Details 屏幕的 Actions 控件,将节点设置 维护模式。

流程

  1. 在容器原生虚拟化控制台中,点击 ComputeNodes
  2. 您可从此屏幕将节点设置为维护,这有助于在一个屏幕中对多个虚拟机执行操作,也可通过 Node Details 屏幕进行,其中可查看所选节点的综合详情:

    • 点击节点 kebab 末尾的 Options 菜单并选择 Start Maintenance
    • 点击节点名称以打开 Node Details 屏幕,然后点击 ActionsStart Maintenance
  3. 在确认窗口中点击 Start Maintenance

该节点将实时迁移具有 liveMigration 驱除策略的虚拟机实例,且该节点不可再调度。该节点上的所有其他 pod 和虚拟机均被删除,并会在另一节点上重新创建。

9.3.3. 在 CLI 中将节点设置为维护模式

通过创建 NodeMaintenance 自定义资源 (CR) 对象来将节点设置为维护模式,该对象需引用节点名称以及将节点设置为维护模式的原因。

流程

  1. 创建节点维护模式的 CR 配置。本例使用名为 node02-maintenance.yaml 的 CR:

    apiVersion: kubevirt.io/v1alpha1
    kind: NodeMaintenance
    metadata:
      name: node02-maintenance
    spec:
      nodeName: node02
      reason: "Replacing node02"
  2. 在集群中创建 NodeMaintenance 对象:

    $ oc apply -f <node02-maintenance.yaml>

该节点会实时迁移具有 liveMigration 驱除策略的虚拟机实例,并污染该节点,使其不可再调度。该节点上的所有其他 pod 和虚拟机均被删除,并会在另一节点上重新创建。

9.4. 从维护模式恢复节点

恢复节点会使节点退出维护模式,可再次调度。

通过 web 控制台或 CLI 从维护模式恢复节点。

9.4.1. 通过 web 控制台从维护模式恢复节点

使用 ComputeNodes 列表中每个节点上 kebab 的 Options 菜单,或使用 Node Details 屏幕中的 Actions 控制,从维护模式恢复节点。

流程

  1. 在容器原生虚拟化控制台中,点击 ComputeNodes
  2. 您可从此屏幕恢复节点,这有助于在一个屏幕中对多个虚拟机执行操作,也可从 Node Details 屏幕,其中可查看所选节点的综合详情:

    • 点击节点 kebab 末尾的 Options 菜单并选择 Stop Maintenance
    • 点击节点名称以打开 Node Details 屏幕,然后点击 ActionsStop Maintenance
  3. 在确认窗口中点击 Stop Maintenance

之后该节点将变为可调度,但维护前在该节点上运行的虚拟机实例不会自动迁移回该节点。

9.4.2. 在 CLI 中从维护模式恢复节点

通过删除节点的 NodeMaintenance 对象从维护模式恢复节点并使其可再次调度。

流程

  1. 查找 NodeMaintenance 对象:

    $ oc get nodemaintenance
  2. 可选:检查 NodeMaintenance 对象以确保其与正确节点关联:

    $ oc describe nodemaintenance <node02-maintenance>
    Name:         node02-maintenance
    Namespace:
    Labels:
    Annotations:
    API Version:  kubevirt.io/v1alpha1
    Kind:         NodeMaintenance
    ...
    Spec:
      Node Name:  node02
      Reason:     Replacing node02
  3. 删除 NodeMaintenance 对象:

    $ oc delete nodemaintenance <node02-maintenance>

第 10 章 节点网络

10.1. 观察节点网络状态

节点网络状态是集群中所有节点的网络配置。

10.1.1. 关于 nmstate

容器原生虚拟化使用 nmstate 来报告并配置节点网络的状态。这样就可以通过将单个配置清单应用到集群来修改网络策略配置,例如在所有节点上创建 Linux 桥接。

节点网络由以下对象监控和更新:

NodeNetworkState
报告该节点上的网络状态。
NodeNetworkConfigurationPolicy
描述节点上请求的网络配置。您可以通过将 NodeNetworkConfigurationPolicy清单应用到集群来更新节点网络配置,包括添加和删除网络接口 。
NodeNetworkConfigurationEnactment
报告每个节点上采用的网络策略。

10.1.2. 查看节点的网络状态

一个 NodeNetworkState 对象存在于集群中的每个节点上。此对象定期更新,并捕获该节点的网络状态。

流程

  1. 列出集群中的所有 NodeNetworkState 对象:

    $ oc get nns
  2. 通过 NodeNetworkState 查看该节点上的网络。为了清楚,这个示例中的输出已被重新编辑:

    $ oc get nns node01 -o yaml
    apiVersion: nmstate.io/v1alpha1
    kind: NodeNetworkState
    metadata:
      name: node01 1
    status:
      currentState: 2
        dns-resolver:
    ...
        interfaces:
    ...
        route-rules:
    ...
        routes:
    ...
      lastSuccessfulUpdateTime: "2020-01-31T12:14:00Z" 3
    1
    NodeNetworkState 的名称从节点获得。
    2
    currentState 包含节点的完整网络配置,包括 DNS 、接口和路由。
    3
    最新成功更新的时间戳。只要节点可以被访问,这个时间戳就会定期更新,它可以用来指示报告的新旧程度。

10.2. 更新节点网络配置

您可以通过将 NodeNetworkConfigurationPolicy 清单应用到集群来更新节点网络的配置,如为节点添加或删除接口。

10.2.1. 关于 nmstate

容器原生虚拟化使用 nmstate 来报告并配置节点网络的状态。这样就可以通过将单个配置清单应用到集群来修改网络策略配置,例如在所有节点上创建 Linux 桥接。

节点网络由以下对象监控和更新:

NodeNetworkState
报告该节点上的网络状态。
NodeNetworkConfigurationPolicy
描述节点上请求的网络配置。您可以通过将 NodeNetworkConfigurationPolicy清单应用到集群来更新节点网络配置,包括添加和删除网络接口 。
NodeNetworkConfigurationEnactment
报告每个节点上采用的网络策略。

10.2.2. 在节点上创建接口

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个接口。清单详细列出了请求的接口配置。

默认情况下,清单会应用到集群中的所有节点。要将接口只添加到特定的节点,在节点选择器上添加 spec: nodeSelector 参数和适当的 <key>:<value>

流程

  1. 创建 NodeNetworkConfigurationPolicy 清单。以下示例在所有 worker 节点上配置了一个 Linux 桥接:

    apiVersion: nmstate.io/v1alpha1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: <br1-eth1-policy> 1
    spec:
      nodeSelector: 2
        node-role.kubernetes.io/worker: "" 3
      desiredState:
        interfaces:
          - name: br1
            description: Linux bridge with eth1 as a port 4
            type: linux-bridge
            state: up
            ipv4:
              dhcp: true
              enabled: true
            bridge:
              options:
                stp:
                  enabled: false
              port:
                - name: eth1
    1
    策略的名称。
    2
    可选。如果没有包括 nodeSelector,策略会应用到集群中的所有节点。
    3
    本例使用 node-role.kubernetes.io/worker:"" 节点选择器来选择集群中的所有 worker 节点。
    4
    可选。接口人类可读的描述。
  2. 创建策略:

    $ oc apply -f <br1-eth1-policy.yaml> 1
    1
    策略清单的文件名。

10.2.3. 确认节点上的策略更新

NodeNetworkConfigurationPolicy 清单描述了您为集群中的节点请求的网络配置。Policy 对象包括您请求的网络配置以及整个集群中的 Policy 的执行状态。

当应用策略时,会为集群中的每个节点创建一个 NodeNetworkConfigurationEnactment。Enactment 是一个只读对象,代表在该节点上执行策略的状态。如果策略在该节点上应用失败,则该节点的 Enactment 将会包含 traceback 信息用于故障排除。

流程

  1. 要确认一个策略已在集群中被应用,列出策略及其状态:

    $ oc get nncp
  2. (可选)如果策略配置成功的时间比预期的要长,您可以检查特定策略请求的状态和状态条件:

    $ oc get nncp <policy> -o yaml
  3. (可选)如果策略在所有节点上配置成功的时间比预期的要长,您可以列出集群中的 Enactments 的状态:

    $ oc get nnce
  4. (可选)要查看特定的 Enactment 的配置,包括对失败配置进行任何错误报告:

    $ oc get nnce <node>.<policy> -o yaml

10.2.4. 从节点中删除接口

编辑 NodeNetworkConfigurationPolicy 对象,把接口的 state 设置为 absent 来把接口从节点中删除。

注意

删除添加接口的策略不会更改节点上的网络策略的配置。虽然 NodeNetworkConfigurationPolicy 是集群中的一个对象,但它只代表请求的配置。
同样,删除接口不会删除策略。

流程

  1. 更新用来创建接口的 NodeNetworkConfigurationPolicy 清单。以下示例删除了一个 Linux 桥接:

    apiVersion: nmstate.io/v1alpha1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: <br1-eth1-policy> 1
    spec:
      nodeSelector: 2
        node-role.kubernetes.io/worker: "" 3
      desiredState:
        interfaces:
          - name: br1
            type: linux-bridge
            state: absent 4
    1
    策略的名称。
    2
    可选。如果没有包括 nodeSelector,策略会应用到集群中的所有节点。
    3
    本例使用 node-role.kubernetes.io/worker:"" 节点选择器来选择集群中的所有 worker 节点。
    4
    将状态改为 absent 会删除接口。
  2. 更新节点上的策略并删除接口:

    $ oc apply -f <br1-eth1-policy.yaml> 1
    1
    策略清单的文件名。

10.2.5. 删除接口后恢复节点网络配置

从节点中删除接口不会自动将节点网络配置恢复到以前的状态。删除接口后,以前附加到该接口或从属的整个集群中的任何节点 NIC 都会处于 down 状态。将一个新的 NodeNetworkConfigurationPolicy 清单应用到集群来恢复 NIC。

流程

  1. 创建 NodeNetworkConfigurationPolicy 清单,用于指定 NIC 和所需状态 up

    apiVersion: nmstate.io/v1alpha1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: eth1
    spec:
      desiredState:
        interfaces:
        - name: eth1
          type: ethernet
          state: up
          ipv4:
            dhcp: true
            enabled: true
  2. 将清单应用到集群:

    $ oc apply -f <eth1.yaml> 1
    1
    策略清单的文件名。

10.2.6. 示例: Linux bridge interface NodeNetworkConfigurationPolicy

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个 Linux 网桥接口。

以下 YAML 文件是 Linux 网桥界面的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1alpha1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: br1-eth1-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
      - name: br1 4
        description: Linux bridge with eth1 as a port 5
        type: linux-bridge 6
        state: up 7
        ipv4:
          dhcp: true 8
          enabled: true 9
        bridge:
          options:
            stp:
              enabled: false 10
          port:
            - name: eth1 11
1
策略的名称。
2
可选。如果没有包括 nodeSelector,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选。接口人类可读的描述。
6
接口的类型。这个示例会创建一个桥接。
7
创建后接口的请求状态。
8
可选。如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
9
在这个示例中启用 ipv4
10
在这个示例中禁用 stp
11
网桥附加到的节点 NIC。

10.2.7. 示例:VLAN interface NodeNetworkConfigurationPolicy

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个 VLAN 接口。

以下 YAML 文件是 VLAN 接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1alpha1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: vlan-eth1-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: eth1.102 4
      description: VLAN using eth1 5
      type: vlan 6
      state: up 7
      vlan:
        base-iface: eth1 8
        id: 102 9
1
策略的名称。
2
可选。如果没有包括 nodeSelector,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选。接口人类可读的描述。
6
接口的类型。这个示例创建了一个 VLAN。
7
创建后接口的请求状态。
8
附加 VLAN 的节点 NIC。
9
VLAN 标签。

10.2.8. 示例: Bond interface NodeNetworkConfigurationPolicy

通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个绑定接口。

注意

容器原生虚拟化只支持以下绑定模式:

  • mode=1 active-backup
  • mode=5 balance-tlb
  • mode=6 balance-alb

以下 YAML 文件是绑定接口的清单示例。如果运行 playbook,其中会包含必须替换为您自己的信息的样本值。

apiVersion: nmstate.io/v1alpha1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: bond0-eth1-eth2-policy 1
spec:
  nodeSelector: 2
    kubernetes.io/hostname: <node01> 3
  desiredState:
    interfaces:
    - name: bond0 4
      description: Bond enslaving eth1 and eth2 5
      type: bond 6
      state: up 7
      ipv4:
        dhcp: true 8
        enabled: true 9
      link-aggregation:
        mode: active-backup 10
        options:
          miimon: '140' 11
        slaves: 12
        - eth1
        - eth2
      mtu: 1450 13
1
策略的名称。
2
可选。如果没有包括 nodeSelector,策略会应用到集群中的所有节点。
3
这个示例使用 hostname 节点选择器。
4
接口的名称。
5
可选。接口人类可读的描述。
6
接口的类型。这个示例创建了一个绑定。
7
创建后接口的请求状态。
8
可选。如果您不使用 dhcp,可以设置静态 IP,或让接口没有 IP 地址。
9
在这个示例中启用 ipv4
10
Bond 的驱动模式。这个示例使用 active 备份模式。
11
可选。这个示例使用 miimon 检查每 140ms 的绑定链接。
12
绑定中的下级节点 NIC。
13
可选。绑定的最大传输单元 (MTU) 。如果没有指定,其默认值为 1500

10.3. 对节点网络配置进行故障排除

如果节点网络配置遇到问题,则策略会自动回滚,且报告失败。这包括如下问题:

  • 配置没有在主机上应用。
  • 主机丢失了到默认网关的连接。
  • 断开了与 API 服务器的连接。

10.3.1. 对不正确的 NodeNetworkConfigurationPolicy 配置进行故障排除

您可以通过应用 NodeNetworkConfigurationPolicy,对整个集群中的节点网络配置应用更改。如果您应用了不正确的配置,您可以使用参照示例进行故障排除并修正失败的网络策略。

在本例中,一个 Linux 桥接策略应用到一个有 3 个 master 节点和 3 个 worker 节点的实例集群。策略无法应用,因为它会引用了一个不正确的接口。要查找错误,请调查可用的 nmstate 资源。然后您可以使用正确配置来更新 Policy。

流程

  1. 创建 Policy 并将其应用到集群。以下示例在 ens01 接口上创建了一个简单桥接:

    apiVersion: nmstate.io/v1alpha1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: ens01-bridge-testfail
    spec:
      desiredState:
        interfaces:
          - name: br1
            description: Linux bridge with the wrong port
            type: linux-bridge
            state: up
            ipv4:
              dhcp: true
              enabled: true
            bridge:
              options:
                stp:
                  enabled: false
              port:
                - name: ens01
    $ oc apply -f ens01-bridge-testfail.yaml
    nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
  2. 运行以下命令,检查 Policy 的状态:

    $ oc get nncp

    输出显示策略失败:

    NAME                    STATUS
    ens01-bridge-testfail   FailedToConfigure

    但是,仅有 Policy 状态并不表示它在所有节点或某个节点子集中是否失败。

  3. 列出 Enactments 以决定所有节点上的策略是否成功。如果策略仅仅因为某个子集而失败,这意味着问题在于特定的节点配置; 如果策略在所有节点中都失败,则表明问题在 Policy 中。

    $ oc get nnce

    输出显示 Policy 在所有节点上都失败:

    NAME                                   STATUS
    utput
    master-1.ens01-bridge-testfail         FailedToConfigure
    master-2.ens01-bridge-testfail         FailedToConfigure
    master-3.ens01-bridge-testfail         FailedToConfigure
    worker-1.ens01-bridge-testfail         FailedToConfigure
    worker-2.ens01-bridge-testfail         FailedToConfigure
    worker-3.ens01-bridge-testfail         FailedToConfigure
  4. 查看失败的 Enactments 并检查回溯信息。以下命令使用输出工具 jsonpath 来过滤输出结果:

    $ oc get nnce worker-1.ens01-bridge-testfail -o jsonpath='{.status.conditions[?(@.type=="Failing")].message}'

    这个命令会返回一个大的回溯信息,它被编辑为 brevity:

    error reconciling NodeNetworkConfigurationPolicy at desired state apply: , failed to execute nmstatectl set --no-commit --timeout 480: 'exit status 1' ''
    ...
    libnmstate.error.NmstateVerificationError:
    desired
    =======
    ---
    name: br1
    type: linux-bridge
    state: up
    bridge:
      options:
        group-forward-mask: 0
        mac-ageing-time: 300
        multicast-snooping: true
        stp:
          enabled: false
          forward-delay: 15
          hello-time: 2
          max-age: 20
          priority: 32768
      port:
      - name: ens01
    description: Linux bridge with the wrong port
    ipv4:
      address: []
      auto-dns: true
      auto-gateway: true
      auto-routes: true
      dhcp: true
      enabled: true
    ipv6:
      enabled: false
    mac-address: 01-23-45-67-89-AB
    mtu: 1500
    
    current
    =======
    ---
    name: br1
    type: linux-bridge
    state: up
    bridge:
      options:
        group-forward-mask: 0
        mac-ageing-time: 300
        multicast-snooping: true
        stp:
          enabled: false
          forward-delay: 15
          hello-time: 2
          max-age: 20
          priority: 32768
      port: []
    description: Linux bridge with the wrong port
    ipv4:
      address: []
      auto-dns: true
      auto-gateway: true
      auto-routes: true
      dhcp: true
      enabled: true
    ipv6:
      enabled: false
    mac-address: 01-23-45-67-89-AB
    mtu: 1500
    
    difference
    ==========
    --- desired
    +++ current
    @@ -13,8 +13,7 @@
           hello-time: 2
           max-age: 20
           priority: 32768
    -  port:
    -  - name: ens01
    +  port: []
     description: Linux bridge with the wrong port
     ipv4:
       address: []
      line 651, in _assert_interfaces_equal\n    current_state.interfaces[ifname],\nlibnmstate.error.NmstateVerificationError:

    NmstateVerificationError 列出了 desired(期望的) Policy 配置,Policy 在节点上的current(当前的) 配置,并高亮标识了不匹配参数间的difference(不同)。在本示例中,此 port 包含在 difference部分,这表示 Policy 中的端口配置问题。

  5. 要确保正确配置了策略,请求 NodeNetworkState 来查看一个或多个节点的网络配置。以下命令会返回 master-1 节点的网络配置:

    $ oc get nns master-1 -o yaml

    输出显示节点上的接口名称为 ens1,但失败的 Policy 使用了 ens01:

       - ipv4:
     ...
          name: ens1
          state: up
          type: ethernet
  6. 通过编辑现有策略修正此错误:

    $ oc edit nncp ens01-bridge-testfail
    ...
              port:
                - name: ens1

    保存 Policy 以应用更正。

  7. 检查 Policy 的状态,以确保它被成功更新:

    $ oc get nncp
    NAME                    STATUS
    ens01-bridge-testfail   SuccessfullyConfigured

更新的 Policy 可在集群中的所有节点上成功配置。

第 11 章 日志记录、事件和监控

11.1. 查看虚拟机日志

11.1.1. 了解虚拟机日志

收集 OpenShift Container Platform Build、Deployment 和 Pod 日志。在容器原生虚拟化中,可在 web 控制台或 CLI 中从虚拟机启动程序 Pod 中检索虚拟机日志。

-f 选项会实时跟随日志输出,可用于监控进度和进行错误检查。

如果启动程序 Pod 无法启动,则请使用 --previous 选项查看最后一次尝试的日志。

警告

所引用镜像的部署配置不当或存在问题均可能引发 ErrImagePullImagePullBackOff 错误。

11.1.2. 在 CLI 中查看虚拟机日志

从虚拟机启动程序 Pod 中获取虚拟机日志。

流程

  • 使用以下命令:

    $ oc logs <virt-launcher-name>

11.1.3. 在 web 控制台中查看虚拟机日志

从关联的虚拟机启动程序 Pod 中获取虚拟机日志。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 点击虚拟机以打开 Virtual Machine Details 面板。
  3. 进入 Overview 选项卡,点击 POD 部分的 virt-launcher-<vm-name> Pod。
  4. 点击 Logs

11.2. 查看事件

11.2.1. 了解虚拟机事件

OpenShift Container Platform 事件是命名空间中重要生命周期信息的记录,有助于对资源调度、创建和删除问题进行监控和故障排除。

容器原生虚拟化为虚拟机和虚拟机实例添加事件。您可以在 Web 控制台或 CLI 中查看这些事件。

另请参阅:查看 OpenShift Container Platform 集群中的系统事件信息

11.2.2. 在 web 控制台中查看虚拟机的事件

您可以在 web 控制台的 Virtual Machine Details 面板中查看正在运行的虚拟机的流事件。

▮▮ 按钮可暂停事件流。
▶ 按钮可继续暂停的事件流。

流程

  1. 从侧边菜单中选择 WorkloadsVirtual Machines
  2. 选择虚拟机。
  3. 点击 Events 以查看虚拟机的所有事件。

11.2.3. 在 CLI 中查看命名空间事件

使用 OpenShift Container Platform 客户端来获取命名空间的事件。

流程

  • 在命名空间中,使用 oc get 命令:

    $ oc get events

11.2.4. 在 CLI 中查看资源事件

资源描述中包含事件,您可以使用 OpenShift Container Platform 客户端获取这些事件。

流程

  • 在命名空间中,使用 oc describe 命令。以下示例演示了如何为虚拟机、虚拟机实例和虚拟机的 virt-launcher Pod 获取事件:

    $ oc describe vm <vm>
    $ oc describe vmi <vmi>
    $ oc describe pod virt-launcher-<name>

11.3. 查看有关虚拟机工作负载的信息

您可以使用 OpenShift Container Platform Web 控制台中的 Virtual Machines dashboard 来查看有关虚拟机的高级别的信息。

11.3.1. 关于虚拟机仪表板

通过导航到 WorkloadsVirtual Machines 页面并选择虚拟机,从 OpenShift Container Platform Web 控制台访问 Virtual Machines 仪表板。

仪表板包括以下卡:

  • Details 提供了有关虚拟机的识别信息 ,包括:

    • 名称
    • 命名空间
    • 创建日期
    • 节点名称
    • IP 地址
  • Inventory 列出虚拟机的资源,包括:

    • 网络接口控制卡 (NIC)
    • 磁盘
  • Status 包括:

    • 虚拟机的当前状态
    • 标明是否在虚拟机上安装了 QEMU 客户机代理
  • 使用率包括显示以下使用数据的图表 :

    • CPU
    • 内存
    • Filesystem
    • 网络传输
注意

使用下拉列表选择使用率数据持续的时间。可用选项包括 1 Hour6 Hours24 Hours

  • Events 列出了过去几小时中有关虚拟机活动的信息 。要查看其他事件,请点击 View all

11.4. 监控虚拟机健康状况

使用此流程来创建存活度和就绪度探测以监控虚拟机健康状况。

11.4.1. 关于存活度和就绪度探测

当 VirtualMachineInstance (VMI) 失败时,存活度探测 会停止 VMI。然后控制器(比如 VirtualMachine)会生成其他 VMI,恢复虚拟机响应度。

Readiness probes 可以告诉服务和端点,VirtualMachineInstance 是否准备好从服务接收网络流量。如果就绪度探测失败,则 VirtualMachineInstance 会从适用的端点中删除,直到探测恢复为止。

11.4.2. 定义 HTTP 存活度探针

此流程提供了定义 HTTP 存活度探测的示例配置文件。

流程

  1. 自定义 YAML 配置文件以创建 HTTP 存活度探测,请参考以下示例代码块。在此例中:

    • 您使用 spec.livenessProbe.httpGet 配置探测,它会在初始延迟 120 秒后查询 VirtualMachineInstance 的端口 1500
    • VirtualMachineInstance 使用 cloud-init 在端口 1500 上安装并运行最小的 HTTP 服务器。

      apiVersion: kubevirt.io/v1alpha3
      kind: VirtualMachineInstance
      metadata:
        labels:
          special: vmi-fedora
        name: vmi-fedora
      spec:
        domain:
          devices:
            disks:
            - disk:
                bus: virtio
              name: containerdisk
            - disk:
                bus: virtio
              name: cloudinitdisk
          resources:
            requests:
              memory: 1024M
        livenessProbe:
          initialDelaySeconds: 120
          periodSeconds: 20
          httpGet:
            port: 1500
          timeoutSeconds: 10
        terminationGracePeriodSeconds: 0
        volumes:
        - name: containerdisk
          registryDisk:
            image: kubevirt/fedora-cloud-registry-disk-demo
        - cloudInitNoCloud:
            userData: |-
              #cloud-config
              password: fedora
              chpasswd: { expire: False }
              bootcmd:
                - setenforce 0
                - dnf install -y nmap-ncat
                - systemd-run --unit=httpserver nc -klp 1500 -e '/usr/bin/echo -e HTTP/1.1 200 OK\\n\\nHello World!'
          name: cloudinitdisk
  2. 运行以下命令来创建 VirtualMachineInstance:

    $ oc create -f <file name>.yaml

11.4.3. 定义 TCP 存活度探测

此流程提供了定义 TCP 存活度探测的示例配置文件。

流程

  1. 自定义 YAML 配置文件以创建 TCP 存活度探测,请参考以下示例代码块。在此例中:

    • 您使用 spec.livenessProbe.tcpSocket配置探测,它会在初始延迟 120 秒后查询 VirtualMachineInstance 的端口 1500
    • VirtualMachineInstance 使用 cloud-init 在端口 1500 上安装并运行最小的 HTTP 服务器。

      apiVersion: kubevirt.io/v1alpha3
      kind: VirtualMachineInstance
      metadata:
        labels:
          special: vmi-fedora
        name: vmi-fedora
      spec:
        domain:
          devices:
            disks:
            - disk:
                bus: virtio
              name: containerdisk
            - disk:
                bus: virtio
              name: cloudinitdisk
          resources:
            requests:
              memory: 1024M
        livenessProbe:
          initialDelaySeconds: 120
          periodSeconds: 20
          tcpSocket:
            port: 1500
          timeoutSeconds: 10
        terminationGracePeriodSeconds: 0
        volumes:
        - name: containerdisk
          registryDisk:
            image: kubevirt/fedora-cloud-registry-disk-demo
        - cloudInitNoCloud:
            userData: |-
              #cloud-config
              password: fedora
              chpasswd: { expire: False }
              bootcmd:
                - setenforce 0
                - dnf install -y nmap-ncat
                - systemd-run --unit=httpserver nc -klp 1500 -e '/usr/bin/echo -e HTTP/1.1 200 OK\\n\\nHello World!'
          name: cloudinitdisk
  2. 运行以下命令来创建 VirtualMachineInstance:

    $ oc create -f <file name>.yaml

11.4.4. 定义就绪度探测

此流程提供了定义就绪度探测的示例配置文件。

流程

  1. 自定义 YAML 配置文件以创建就绪度探测。以类似存活度探测的方式配置就绪度探测。然而,请注意此示例中的以下不同之处:

    • 就绪度探测使用不同的 spec 名称进行保存。例如,您将就绪度探测创建为 spec.readinessProbe,而不是 spec.livenessProbe.<type-of-probe>
    • 在创建就绪度探测时,如果预计探测会出现多次成功或失败的情况,则可以选择设置 failureThresholdsuccessThreshold,以在 ready 状态和 non-ready 状态之间切换。

      apiVersion: kubevirt.io/v1alpha3
      kind: VirtualMachineInstance
      metadata:
        labels:
          special: vmi-fedora
        name: vmi-fedora
      spec:
        domain:
          devices:
            disks:
            - disk:
                bus: virtio
              name: containerdisk
            - disk:
                bus: virtio
              name: cloudinitdisk
          resources:
            requests:
              memory: 1024M
        readinessProbe:
          httpGet:
            port: 1500
          initialDelaySeconds: 120
          periodSeconds: 20
          timeoutSeconds: 10
          failureThreshold: 3
          successThreshold: 3
        terminationGracePeriodSeconds: 0
        volumes:
        - name: containerdisk
          registryDisk:
            image: kubevirt/fedora-cloud-registry-disk-demo
        - cloudInitNoCloud:
            userData: |-
              #cloud-config
              password: fedora
              chpasswd: { expire: False }
              bootcmd:
                - setenforce 0
                - dnf install -y nmap-ncat
                - systemd-run --unit=httpserver nc -klp 1500 -e '/usr/bin/echo -e HTTP/1.1 200 OK\\n\\nHello World!'
          name: cloudinitdisk
  2. 运行以下命令来创建 VirtualMachineInstance:

    $ oc create -f <file name>.yaml

11.5. 使用 OpenShift Container Platform dashboard 获取集群信息

从 OpenShift Container Platform web 控制台点击 Home > Dashboards > Overview,访问 OpenShift Container Platform 仪表板,其中包含有关集群的高级信息。

OpenShift Container Platform 仪表板提供各种集群信息,包含在各个仪表板

11.5.1. 关于 OpenShift Container Platform 仪表板页面

OpenShift Container Platform 仪表板由以下各卡组成:

  • Details 提供有关信息型集群详情的简单概述。

    状态包括 okerrorwarningin progressunknown。资源可添加自定义状态名称。

    • 集群 ID
    • 提供者
    • 版本
  • Cluster Inventory 详细列出资源数目和相关状态。这在通过干预解决问题时非常有用,其中包含以下相关信息:

    • 节点数
    • pod 数量
    • 持久性存储卷声明
    • 虚拟机(如果安装了容器原生虚拟化,则可用)
    • 集群中的裸机主机,根据其状态列出(仅在 metal3 环境中可用)。
  • Cluster Health 总结了整个集群的当前健康状况,包括相关警报和描述。如果安装了容器原生虚拟化,还会诊断容器原生虚拟化的整体健康状况。如出现多个子系统,请点击 See All 查看每个子系统的状态。
  • Cluster Capacity 表有助于管理员了解集群何时需要额外资源。此表包含一个内环和一个外环。内环显示当前的消耗,外环显示为资源配置的阈值,其中包括以下信息:

    • CPU 时间
    • 内存分配
    • 所消耗的存储
    • 所消耗的网络资源
  • Cluster Utilization 显示在指定时间段内各种资源的能力,以帮助管理员了解高资源消耗的范围和频率。
  • Events 列出了与集群中最近活动相关的消息,如创建 pod 或虚拟机迁移到另一台主机。
  • Top Consumers 可帮助管理员了解集群资源是如何被消耗的。点一个资源可以进入一个包括详细信息的页面,它列出了对指定集群资源(CPU 、内存或者存储)消耗最多的 Pod 和节点。

11.6. OpenShift Container Platform 集群监控、日志记录和遥测技术

OpenShift Container Platform 在集群层面提供各种监控资源。

11.6.1. 关于 OpenShift Container Platform 集群监控

OpenShift Container Platform 包括一个预配置、预安装且自助更新的监控堆栈,它基于 Prometheus 开源项目及其更广的生态系统。它提供对集群组件的监控,并且包含一组警报(在发生任何问题时立即通知集群管理员)以及一组 Grafana 仪表板。集群监控堆栈只支持监控 OpenShift Container Platform 集群。

重要

为确保与将来的 OpenShift Container Platform 更新兼容,只支持配置特定的监控堆栈选项。

11.6.2. 集群日志记录组件

集群日志记录组件基于 Elasticsearch、Fluentd 或 Rsyslog 以及 Kibana(EFK)。收集器 Fluentd 部署到 OpenShift Container Platform 集群中的每个节点。它收集所有节点和容器日志,并将它们写入 Elasticsearch (ES)。Kibana 是一个集中式 Web UI,用户和管理员可以在其中使用汇总的数据创建丰富的视觉化和仪表板。

目前有 5 种不同类型的集群日志记录组件:

  • logStore(存储) - 存储日志的位置。当前的实现是 Elasticsearch。
  • collection(收集) - 此组件从节点收集日志,将日志格式化并存储到 logStore 中。当前的实现是 Fluentd。
  • visualization(可视化) - 此 UI 组件用于查看日志、图形和图表等。当前的实现是 Kibana。
  • curation(策展) - 此组件按日志时间进行筛检。当前的实现是 Curator。

有关集群日志记录的更多信息,请参阅 OpenShift Container Platform 集群日志文档。

11.6.3. 关于 Telemetry

Telemetry 会向红帽发送一组精选的集群监控指标子集。这些指标会持续发送并描述:

  • OpenShift Container Platform 集群的大小
  • OpenShift Container Platform 组件的健康和状态
  • 正在进行的任何升级的健康和状态
  • 有关 OpenShift Container Platform 组件和功能的有限使用情况信息
  • 有关集群监控组件所报告的警报的摘要信息

红帽将使用这一持续数据流实时监控集群的健康,必要时将对影响客户的问题做出反应。同时还有助于红帽向客户推出 OpenShift Container Platform 升级,以便最大程度降低服务影响,持续改进升级体验。

这类调试信息将提供给红帽支持和工程团队,其访问限制等同于访问通过问题单报告的数据。红帽利用所有连接集群信息来帮助改进 OpenShift Container Platform,提高其易用性。所有这些信息都不会与第三方共享。

11.6.3.1. Telemetry 收集的信息

Telemetry 收集的主要信息包括:

  • 每个集群可用的更新数
  • 用于更新的频道和镜像仓库
  • 更新期间发生的错误数
  • 正在运行的更新的进度信息
  • 每个集群的机器数
  • 机器的 CPU 内核数和 RAM 大小
  • etcd 集群中的成员数,以及当前存储在 etcd 集群中的对象数
  • 每种机器类型(infra 或 master)使用的 CPU 内核数和 RAM 大小
  • 每个集群使用的 CPU 内核数和 RAM 大小
  • 集群中运行的虚拟机实例数量
  • 每个集群的 OpenShift Container Platform 框架组件的使用情况
  • OpenShift Container Platform 集群的版本
  • 集群上安装的任何 OpenShift Container Platform 框架组件(如 Cluster Version Operator、Cluster Monitoring、Image Registry、Elasticsearch for Logging)的健康、情况和状态。
  • 安装期间生成的随机的唯一标识符
  • OpenShift Container Platform 部署平台的名称,如 Amazon Web Services

Telemetry 不会收集任何身份识别的信息,如用户名、密码、用户资源的名称或地址。

11.6.4. CLI 故障排除和调试命令

如需 oc 客户端故障排除和调试命令列表,请参阅 OpenShift Container Platform CLI 工具文档。

11.7. 为红帽支持收集容器原生虚拟化数据

在提交问题单时同时提供您的集群信息,可以帮助红帽支持为您进行排除故障。

您可使用 must-gather 工具来收集有关 OpenShift Container Platform 集群的诊断信息,包括虚拟机和有关容器原生虚拟化的其他数据。

为了获得快速支持,请提供 OpenShift Container Platform 和容器原生虚拟化的诊断信息。

重要

容器原生虚拟化仅是一项技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

11.7.1. 关于 must-gather 工具

oc adm must-gather CLI 命令可收集最有助于解决问题的集群信息,如:

  • 资源定义
  • 审计日志
  • 服务日志

您在运行该命令时,可通过包含 --image 参数来指定一个或多个镜像。指定镜像后,该工具便会收集有关相应功能或产品的信息。

在运行 oc adm must-gather 时,集群上会创建一个新 pod。在该 pod 上收集数据,并保存至以 must-gather.local 开头的一个新目录中。此目录在当前工作目录中创建。

11.7.2. 关于收集容器原生虚拟化数据

您可使用 oc adm must-gather CLI 命令来收集有关集群的信息,包括与容器原生虚拟化关联的功能和对象:

  • Hyperconverged Cluster Operator 命名空间(及子对象)
  • 属于任何容器原生虚拟化资源的所有命名空间(及其子对象)
  • 所有容器原生虚拟化的自定义资源定义 (CRD)
  • 包含虚拟机的所有命名空间
  • 所有虚拟机定义

要使用 must-gather 来收集容器原生虚拟化数据,您必须指定容器原生虚拟化镜像:--image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel8

11.7.3. 收集有关特定功能的数据

您可通过将 oc adm must-gather CLI 命令与 --image--image-stream 参数结合使用来收集有关特定功能的调试信息。must-gather 工具支持多个镜像,这样您便可通过运行单个命令收集多个功能的数据。

注意

要收集除特定功能数据外的默认 must-gather 数据,请添加 --image-stream=openshift/must-gather 参数。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift Container Platform CLI (oc)。

流程

  1. 进入存储 must-gather 数据的目录。
  2. 使用一个或多个 --image--image-stream 参数运行 oc adm must-gather 命令。例如,使用以下命令可收集默认集群数据和 {VirtProductName} 特定信息:

    $ oc adm must-gather \
     --image-stream=openshift/must-gather \ 1
     --image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel8 2
    1
    默认 OpenShift Container Platform must-gather 镜像
    2
    {VirtProductName} 的 must-gather 镜像

    您可以将 must-gather 工具与额外参数搭配使用,以收集集群中与集群日志记录和 Cluster Logging Operator 特别相关的数据。对于集群日志记录,运行以下命令:

    $ oc adm must-gather --image=$(oc -n openshift-logging get deployment.apps/cluster-logging-operator \
     -o jsonpath='{.spec.template.spec.containers[?(@.name == "cluster-logging-operator")].image}')

    例 11.1. 集群日志记录 的 must-gather 输出示例

    ├── cluster-logging
    │  ├── clo
    │  │  ├── cluster-logging-operator-74dd5994f-6ttgt
    │  │  ├── clusterlogforwarder_cr
    │  │  ├── cr
    │  │  ├── csv
    │  │  ├── deployment
    │  │  └── logforwarding_cr
    │  ├── collector
    │  │  ├── fluentd-2tr64
    │  ├── curator
    │  │  └── curator-1596028500-zkz4s
    │  ├── eo
    │  │  ├── csv
    │  │  ├── deployment
    │  │  └── elasticsearch-operator-7dc7d97b9d-jb4r4
    │  ├── es
    │  │  ├── cluster-elasticsearch
    │  │  │  ├── aliases
    │  │  │  ├── health
    │  │  │  ├── indices
    │  │  │  ├── latest_documents.json
    │  │  │  ├── nodes
    │  │  │  ├── nodes_stats.json
    │  │  │  └── thread_pool
    │  │  ├── cr
    │  │  ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
    │  │  └── logs
    │  │     ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
    │  ├── install
    │  │  ├── co_logs
    │  │  ├── install_plan
    │  │  ├── olmo_logs
    │  │  └── subscription
    │  └── kibana
    │     ├── cr
    │     ├── kibana-9d69668d4-2rkvz
    ├── cluster-scoped-resources
    │  └── core
    │     ├── nodes
    │     │  ├── ip-10-0-146-180.eu-west-1.compute.internal.yaml
    │     └── persistentvolumes
    │        ├── pvc-0a8d65d9-54aa-4c44-9ecc-33d9381e41c1.yaml
    ├── event-filter.html
    ├── gather-debug.log
    └── namespaces
       ├── openshift-logging
       │  ├── apps
       │  │  ├── daemonsets.yaml
       │  │  ├── deployments.yaml
       │  │  ├── replicasets.yaml
       │  │  └── statefulsets.yaml
       │  ├── batch
       │  │  ├── cronjobs.yaml
       │  │  └── jobs.yaml
       │  ├── core
       │  │  ├── configmaps.yaml
       │  │  ├── endpoints.yaml
       │  │  ├── events
       │  │  │  ├── curator-1596021300-wn2ks.162634ebf0055a94.yaml
       │  │  │  ├── curator.162638330681bee2.yaml
       │  │  │  ├── elasticsearch-delete-app-1596020400-gm6nl.1626341a296c16a1.yaml
       │  │  │  ├── elasticsearch-delete-audit-1596020400-9l9n4.1626341a2af81bbd.yaml
       │  │  │  ├── elasticsearch-delete-infra-1596020400-v98tk.1626341a2d821069.yaml
       │  │  │  ├── elasticsearch-rollover-app-1596020400-cc5vc.1626341a3019b238.yaml
       │  │  │  ├── elasticsearch-rollover-audit-1596020400-s8d5s.1626341a31f7b315.yaml
       │  │  │  ├── elasticsearch-rollover-infra-1596020400-7mgv8.1626341a35ea59ed.yaml
       │  │  ├── events.yaml
       │  │  ├── persistentvolumeclaims.yaml
       │  │  ├── pods.yaml
       │  │  ├── replicationcontrollers.yaml
       │  │  ├── secrets.yaml
       │  │  └── services.yaml
       │  ├── openshift-logging.yaml
       │  ├── pods
       │  │  ├── cluster-logging-operator-74dd5994f-6ttgt
       │  │  │  ├── cluster-logging-operator
       │  │  │  │  └── cluster-logging-operator
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  └── cluster-logging-operator-74dd5994f-6ttgt.yaml
       │  │  ├── cluster-logging-operator-registry-6df49d7d4-mxxff
       │  │  │  ├── cluster-logging-operator-registry
       │  │  │  │  └── cluster-logging-operator-registry
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── cluster-logging-operator-registry-6df49d7d4-mxxff.yaml
       │  │  │  └── mutate-csv-and-generate-sqlite-db
       │  │  │     └── mutate-csv-and-generate-sqlite-db
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── curator-1596028500-zkz4s
       │  │  ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
       │  │  ├── elasticsearch-delete-app-1596030300-bpgcx
       │  │  │  ├── elasticsearch-delete-app-1596030300-bpgcx.yaml
       │  │  │  └── indexmanagement
       │  │  │     └── indexmanagement
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── fluentd-2tr64
       │  │  │  ├── fluentd
       │  │  │  │  └── fluentd
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── fluentd-2tr64.yaml
       │  │  │  └── fluentd-init
       │  │  │     └── fluentd-init
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── kibana-9d69668d4-2rkvz
       │  │  │  ├── kibana
       │  │  │  │  └── kibana
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── kibana-9d69668d4-2rkvz.yaml
       │  │  │  └── kibana-proxy
       │  │  │     └── kibana-proxy
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  └── route.openshift.io
       │     └── routes.yaml
       └── openshift-operators-redhat
          ├── ...
  3. 从工作目录中刚刚创建的 must-gather 目录创建一个压缩文件。例如,在使用 Linux 操作系统的计算机上运行以下命令:

    $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
    1
    务必将 must-gather-local.5421342344627712289/ 替换为实际目录名称。
  4. 红帽客户门户中为您的问题单附上压缩文件。

法律通告

Copyright © 2021 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.