13.3. 故障排除


OpenShift Virtualization 为虚拟机 (VM) 和虚拟化组件故障排除提供工具和日志。

您可以使用 web 控制台中提供的工具或使用 oc CLI 工具排除 OpenShift Virtualization 组件的问题。

13.3.1. 事件

OpenShift Container Platform 事件是重要生命周期信息的记录,有助于监控虚拟机、命名空间和资源问题。

  • VM 事件 :进入 web 控制台中的 VirtualMachine 详情页的 Events 选项卡。

    命名空间事件

    您可以运行以下命令来查看命名空间事件:

    $ oc get events -n <namespace>

    有关特定事件的详情,请查看事件列表

    资源事件

    您可以运行以下命令来查看资源事件:

    $ oc describe <resource> <resource_name>

13.3.2. Pod 日志

您可以使用 Web 控制台或 CLI 查看 OpenShift Virtualization pod 的日志。您还可以在 web 控制台中使用 LokiStack 查看 聚合的日志

13.3.2.1. 配置 OpenShift Virtualization pod 日志详细程度

您可以通过编辑 HyperConverged 自定义资源 (CR) 来配置 OpenShift Virtualization pod 日志的详细程度。

流程

  1. 要为特定组件设置日志详细程度,请运行以下命令在默认文本编辑器中打开 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 通过编辑 spec.logVerbosityConfig 小节,为一个或多个组件设置日志级别。例如:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      logVerbosityConfig:
        kubevirt:
          virtAPI: 5 1
          virtController: 4
          virtHandler: 3
          virtLauncher: 2
          virtOperator: 6
    1
    日志详细程度值必须是范围 1-9 中的一个整数,其中较高的数字表示更详细的日志。在本例中,如果优先级级别为 5 或更高版本,则 virtAPI 组件日志会公开。
  3. 通过保存并退出编辑器来应用您的更改。

13.3.2.2. 使用 web 控制台查看 virt-launcher pod 日志

您可以使用 OpenShift Container Platform web 控制台查看虚拟机的 virt-launcher pod 日志。

流程

  1. 进入到 Virtualization VirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. General 标题中,点 pod 名称打开 Pod 详情页面。
  4. Logs 选项卡查看日志。

13.3.2.3. 使用 CLI 查看 OpenShift Virtualization pod 日志

您可以使用 oc CLI 工具查看 OpenShift Virtualization pod 的日志。

流程

  1. 运行以下命令,查看 OpenShift Virtualization 命名空间中的 pod 列表:

    $ oc get pods -n openshift-cnv

    例 13.1. 输出示例

    NAME                               READY   STATUS    RESTARTS   AGE
    disks-images-provider-7gqbc        1/1     Running   0          32m
    disks-images-provider-vg4kx        1/1     Running   0          32m
    virt-api-57fcc4497b-7qfmc          1/1     Running   0          31m
    virt-api-57fcc4497b-tx9nc          1/1     Running   0          31m
    virt-controller-76c784655f-7fp6m   1/1     Running   0          30m
    virt-controller-76c784655f-f4pbd   1/1     Running   0          30m
    virt-handler-2m86x                 1/1     Running   0          30m
    virt-handler-9qs6z                 1/1     Running   0          30m
    virt-operator-7ccfdbf65f-q5snk     1/1     Running   0          32m
    virt-operator-7ccfdbf65f-vllz8     1/1     Running   0          32m
  2. 运行以下命令来查看 pod 日志:

    $ oc logs -n openshift-cnv <pod_name>
    注意

    如果 pod 无法启动,您可以使用 --previous 选项查看最后一次尝试的日志。

    要实时监控日志输出,请使用 -f 选项。

    例 13.2. 输出示例

    {"component":"virt-handler","level":"info","msg":"set verbosity to 2","pos":"virt-handler.go:453","timestamp":"2022-04-17T08:58:37.373695Z"}
    {"component":"virt-handler","level":"info","msg":"set verbosity to 2","pos":"virt-handler.go:453","timestamp":"2022-04-17T08:58:37.373726Z"}
    {"component":"virt-handler","level":"info","msg":"setting rate limiter to 5 QPS and 10 Burst","pos":"virt-handler.go:462","timestamp":"2022-04-17T08:58:37.373782Z"}
    {"component":"virt-handler","level":"info","msg":"CPU features of a minimum baseline CPU model: map[apic:true clflush:true cmov:true cx16:true cx8:true de:true fpu:true fxsr:true lahf_lm:true lm:true mca:true mce:true mmx:true msr:true mtrr:true nx:true pae:true pat:true pge:true pni:true pse:true pse36:true sep:true sse:true sse2:true sse4.1:true ssse3:true syscall:true tsc:true]","pos":"cpu_plugin.go:96","timestamp":"2022-04-17T08:58:37.390221Z"}
    {"component":"virt-handler","level":"warning","msg":"host model mode is expected to contain only one model","pos":"cpu_plugin.go:103","timestamp":"2022-04-17T08:58:37.390263Z"}
    {"component":"virt-handler","level":"info","msg":"node-labeller is running","pos":"node_labeller.go:94","timestamp":"2022-04-17T08:58:37.391011Z"}

13.3.3. 客户端系统日志

查看虚拟机客户机的引导日志可帮助诊断问题。您可以配置对客户机日志的访问,并使用 OpenShift Container Platform Web 控制台或 oc CLI 查看它们。

此功能默认为禁用。如果虚拟机没有明确启用或禁用此设置,它会继承集群范围的默认设置。

重要

如果凭据或其他个人可识别信息(PI)等敏感信息被写入串行控制台,则会使用所有其他可见文本记录。红帽建议使用 SSH 发送敏感数据,而不是串行控制台。

13.3.3.1. 使用 web 控制台启用对虚拟机客户机系统日志的默认访问

您可以使用 Web 控制台启用对虚拟机客户机系统日志的默认访问。

流程

  1. 在侧边菜单中点 Virtualization Overview
  2. Settings 选项卡。
  3. Cluster Guest Management
  4. 设置 Enable guest system log access 为 on。

13.3.3.2. 使用 CLI 启用虚拟机客户机系统日志的默认访问

您可以通过编辑 HyperConverged 自定义资源 (CR) 来启用对虚拟机客户端系统日志的默认访问。

流程

  1. 运行以下命令,在默认编辑器中打开 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. 更新 disableSerialConsoleLog 值。例如:

    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      virtualMachineOptions:
        disableSerialConsoleLog: true 1
    #...
    1
    如果您希望默认启用串口控制台访问,请将 disableSerialConsoleLog 的值设置为 false

13.3.3.3. 使用 Web 控制台为单个虚拟机设置客户机系统日志访问

您可以使用 Web 控制台为单个虚拟机配置对虚拟机客户机系统日志的访问。此设置优先于集群范围的默认配置。

流程

  1. 在侧边菜单中点 Virtualization VirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Configuration 选项卡。
  4. Guest system log access 设置为 on 或 off。

13.3.3.4. 使用 CLI 为单个虚拟机设置客户机系统日志访问

您可以通过编辑 VirtualMachine CR 来为单个虚拟机配置对虚拟机客户机系统日志的访问。此设置优先于集群范围的默认配置。

流程

  1. 运行以下命令来编辑虚拟机清单:

    $ oc edit vm <vm_name>
  2. 更新 logSerialConsole 字段的值。例如:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
    spec:
      template:
        spec:
          domain:
            devices:
              logSerialConsole: true 1
    #...
    1
    要启用对客户机的串行控制台日志的访问,请将 logSerialConsole 值设置为 true
  3. 运行以下命令,将新配置应用到虚拟机:

    $ oc apply vm <vm_name>
  4. 可选:如果您编辑了正在运行的虚拟机,重启虚拟机以应用新配置。例如:

    $ virtctl restart <vm_name> -n <namespace>

13.3.3.5. 使用 Web 控制台查看客户机系统日志

您可以使用 web 控制台查看虚拟机(VM)客户机的串行控制台日志。

先决条件

  • 启用客户机系统日志访问。

流程

  1. 在侧边菜单中点 Virtualization VirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Diagnostics 选项卡。
  4. Guest system logs 以加载串行控制台。

13.3.3.6. 使用 CLI 查看客户机系统日志

您可以通过运行 oc logs 命令来查看虚拟机客户机的串行控制台日志。

先决条件

  • 启用客户机系统日志访问。

流程

  • 运行以下命令来查看日志,使用您的值替换 <namespace><vm_name>

    $ oc logs -n <namespace> -l kubevirt.io/domain=<vm_name> --tail=-1 -c guest-console-log

13.3.4. 日志聚合

您可以通过聚合和过滤日志来促进故障排除。

13.3.4.1. 使用 LokiStack 查看聚合的 OpenShift Virtualization 日志

您可以使用 web 控制台中的 LokiStack 查看 OpenShift Virtualization pod 和容器的聚合日志。

先决条件

  • 您已部署了 LokiStack。

流程

  1. 在 web 控制台中进入 Observe Logs
  2. 从日志类型列表中选择 应用程序,对于 virt-launcher pod 日志或基础架构,为 OpenShift Virtualization control plane pod 和容器选择应用程序。
  3. Show Query 以显示查询字段。
  4. 在查询字段中输入 LogQL 查询,然后点 Run Query 以显示过滤的日志。

13.3.4.2. OpenShift Virtualization LogQL 查询

您可以通过在 web 控制台的 Observe Logs 页面中运行 Loki Query Language (LogQL) 查询来查看和过滤 OpenShift Virtualization 组件的聚合日志。

默认日志类型是 infrastructurevirt-launcher 日志类型是 application

可选: 您可以使用行过滤器表达式来包含或排除字符串或正则表达式。

注意

如果查询与大量日志匹配,查询可能会超时。

表 13.3. OpenShift Virtualization LogQL 示例查询
组件LogQL 查询

All

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"

cdi-apiserver

cdi-deployment

cdi-operator

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|kubernetes_labels_app_kubernetes_io_component="storage"

hco-operator

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|kubernetes_labels_app_kubernetes_io_component="deployment"

kubemacpool

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|kubernetes_labels_app_kubernetes_io_component="network"

virt-api

virt-controller

virt-handler

virt-operator

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|kubernetes_labels_app_kubernetes_io_component="compute"

ssp-operator

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|kubernetes_labels_app_kubernetes_io_component="schedule"

Container

{log_type=~".+",kubernetes_container_name=~"<container>|<container>"} 1
|json|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
1
指定一个或多个以管道分开的容器 (|)。

virt-launcher

在运行此查询前,您必须从日志类型列表中选择 应用程序

{log_type=~".+", kubernetes_container_name="compute"}|json
|!= "custom-ga-command" 1
1
|!= "custom-ga-command" 排除包含字符串 custom-ga-command 的 libvirt 日志。(BZ#2177684)

您可以使用行过滤器表达式过滤日志行使其包含或排除字符串或正则表达式。

表 13.4. 行过滤器表达式
行过滤器表达式描述

|= "<string>"

日志行包含字符串

!= "<string>"

日志行不包含字符串

|~ "<regex>"

日志行包含正则表达式

!~ "<regex>"

日志行不包含正则表达式

行过滤器表达式示例

{log_type=~".+"}|json
|kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster"
|= "error" != "timeout"

LokiStack 和 LogQL 的其他资源

13.3.5. 常见错误消息

OpenShift Virtualization 日志中可能会出现以下出错信息:

ErrImagePullImagePullBackOff
表示引用镜像的部署配置或问题。

13.3.6. 数据卷故障排除

您可以检查 DataVolume 对象的 ConditionsEvents 部分,以分析并解决问题。

13.3.6.1. 关于数据卷条件和事件

您可以通过检查命令生成的 ConditionsEvents 部分的输出来诊断数据卷的问题:

$ oc describe dv <DataVolume>

Conditions 部分显示以下 类型

  • Bound
  • Running
  • Ready

Events 部分提供以下额外信息:

  • 事件类型
  • 日志原因
  • 事件
  • 包含其他诊断信息的消息

oc describe 的输出并不总是包含 Events

StatusReasonMessage 改变时会产生一个事件。条件和事件均响应数据卷状态的变化。

例如,在导入操作中错误拼写了 URL,则导入会生成 404 信息。该消息的更改会生成一个带有原因的事件。Conditions 部分中的输出也会更新。

13.3.6.2. 分析数据卷条件和事件

通过检查 describe 命令生成的 ConditionsEvents 部分,您可以确定与 PVC相关的数据卷的状态,以及某个操作是否正在主动运行或完成。您可能还会收到信息,它们提供了有关数据卷状态的特定详情,以及如何处于当前状态。

有多种条件的组合。对每个条件组合的评估都必须其特定的环境下进行。

下面是各种组合的例子。

  • Bound - 本示例中会显示成功绑定 PVC。

    请注意, TypeBound,所以 StatusTrue。如果 PVC 没有绑定,StatusFalse

    当 PVC 被绑定时,会生成一个事件声明 PVC 已被绑定。在本例中, ReasonBoundStatusTrueMessage 指明了哪个 PVC 拥有数据卷。

    Events 部分,Message 提供了更多详细信息,包括 PVC 被绑定的时间(Age)和它的源(From),在本例中是 datavolume-controller:

    输出示例

    Status:
      Conditions:
        Last Heart Beat Time:  2020-07-15T03:58:24Z
        Last Transition Time:  2020-07-15T03:58:24Z
        Message:               PVC win10-rootdisk Bound
        Reason:                Bound
        Status:                True
        Type:                  Bound
    ...
      Events:
        Type     Reason     Age    From                   Message
        ----     ------     ----   ----                   -------
        Normal   Bound      24s    datavolume-controller  PVC example-dv Bound

  • Running - 在本例中,请注意 TypeRunningStatusFalse。这表示发生事件导致尝试的操作失败,将 Status 从 True 改为 False

    然而,请注意 ReasonCompletedMessage 显示 Import Complete

    Events 部分,ReasonMessage 包含有关失败操作的额外故障排除信息。在这个示例中,Message 显示因为 404 无法连接,这在 Events 部分的第一个 Warning 中列出。

    根据这些信息,您认为导入操作正在运行,并为试图访问数据卷的其他操作创建竞争:

    输出示例

    Status:
      Conditions:
        Last Heart Beat Time:  2020-07-15T04:31:39Z
        Last Transition Time:  2020-07-15T04:31:39Z
        Message:               Import Complete
        Reason:                Completed
        Status:                False
        Type:                  Running
    ...
      Events:
        Type     Reason       Age                From                   Message
        ----     ------       ----               ----                   -------
        Warning  Error        12s (x2 over 14s)  datavolume-controller  Unable to connect
        to http data source: expected status code 200, got 404. Status: 404 Not Found

  • Ready - 如果 TypeReadyStatusTrue,则代表数据卷已就绪,如下例所示。如果数据卷未就绪,则 StatusFalse:

    输出示例

    Status:
      Conditions:
        Last Heart Beat Time: 2020-07-15T04:31:39Z
        Last Transition Time:  2020-07-15T04:31:39Z
        Status:                True
        Type:                  Ready

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.