13.3. 故障排除
OpenShift Virtualization 提供用于对虚拟机和虚拟化组件进行故障排除的工具和日志。
您可以使用 web 控制台中提供的工具 或使用 oc
CLI 工具排除 OpenShift Virtualization 组件。
13.3.1. 事件
OpenShift Container Platform 事件是重要生命周期信息的记录,有助于监控虚拟机、命名空间和资源问题。
13.3.2. 日志
您可以查看以下日志进行故障排除:
13.3.2.1. 使用 web 控制台查看虚拟机日志
您可以使用 OpenShift Container Platform web 控制台查看虚拟机日志。
流程
-
进入到 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
- 在 Details 标签页中,点 pod 名称以打开 Pod 详情页面。
- 点 Logs 选项卡查看日志。
13.3.2.2. 查看 OpenShift Virtualization pod 日志
您可以使用 oc
CLI 工具查看 OpenShift Virtualization pod 的日志。
您可以通过编辑 HyperConverged
自定义资源 (CR) 来配置日志的详细程度。
13.3.2.2.1. 使用 CLI 查看 OpenShift Virtualization pod 日志
您可以使用 oc
CLI 工具查看 OpenShift Virtualization pod 的日志。
流程
运行以下命令,查看 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
运行以下命令来查看 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.2.2.2. 配置 OpenShift Virtualization pod 日志详细程度
您可以通过编辑 HyperConverged
自定义资源 (CR) 来配置 OpenShift Virtualization pod 日志的详细程度。
流程
要为特定组件设置日志详细程度,请运行以下命令在默认文本编辑器中打开
HyperConverged
CR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
通过编辑
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
组件日志会公开。
- 通过保存并退出编辑器来应用您的更改。
13.3.2.2.3. 常见错误消息
OpenShift Virtualization 日志中可能会出现以下出错信息:
ErrImagePull
或ImagePullBackOff
- 表示引用镜像的部署配置或问题。
13.3.2.3. 使用 LokiStack 查看聚合的 OpenShift Virtualization 日志
您可以使用 web 控制台中的 LokiStack 查看 OpenShift Virtualization pod 和容器的聚合日志。
先决条件
- 您已部署了 LokiStack。
流程
-
在 web 控制台中进入 Observe
Logs。 -
从日志类型列表中选择 应用程序,对于
virt-launcher
pod 日志或基础架构,为 OpenShift Virtualization control plane pod 和容器选择应用程序。 - 点 Show Query 以显示查询字段。
- 在查询字段中输入 LogQL 查询,然后点 Run Query 以显示过滤的日志。
13.3.2.3.1. OpenShift Virtualization LogQL 查询
您可以通过在 web 控制台的 Observe
默认日志类型是 infrastructure。virt-launcher
日志类型是 application。
可选: 您可以使用行过滤器表达式来包含或排除字符串或正则表达式。
如果查询与大量日志匹配,查询可能会超时。
组件 | LogQL 查询 |
---|---|
All |
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |
|
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |kubernetes_labels_app_kubernetes_io_component="storage" |
|
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |kubernetes_labels_app_kubernetes_io_component="deployment" |
|
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |kubernetes_labels_app_kubernetes_io_component="network" |
|
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |kubernetes_labels_app_kubernetes_io_component="compute" |
|
{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"
|
| 在运行此查询前,您必须从日志类型列表中选择 应用程序。 {log_type=~".+", kubernetes_container_name="compute"}|json
|!= "custom-ga-command" 1
|
您可以使用行过滤器表达式过滤日志行使其包含或排除字符串或正则表达式。
行过滤器表达式 | 描述 |
---|---|
| 日志行包含字符串 |
| 日志行不包含字符串 |
| 日志行包含正则表达式 |
| 日志行不包含正则表达式 |
行过滤器表达式示例
{log_type=~".+"}|json |kubernetes_labels_app_kubernetes_io_part_of="hyperconverged-cluster" |= "error" != "timeout"
LokiStack 和 LogQL 的其他资源
- 关于日志存储
- 部署 Lokistack
- Grafana 文档中的 LogQL 日志查询
13.3.3. 数据卷故障排除
您可以检查 DataVolume
对象的 Conditions
和 Events
部分,以分析并解决问题。
13.3.3.1. 关于数据卷条件和事件
您可以通过检查命令生成的 Conditions
和 Events
部分的输出来诊断数据卷的问题:
$ oc describe dv <DataVolume>
Conditions
部分显示以下 类型
:
-
Bound
-
Running
-
Ready
Events
部分提供以下额外信息:
-
事件
类型
-
日志
原因
-
事件
源
-
包含其他诊断信息的
消息
。
oc describe
的输出并不总是包含 Events
。
当 Status
、Reason
或 Message
改变时会产生一个事件。条件和事件均响应数据卷状态的变化。
例如,在导入操作中错误拼写了 URL,则导入会生成 404 信息。该消息的更改会生成一个带有原因的事件。Conditions
部分中的输出也会更新。
13.3.3.2. 分析数据卷条件和事件
通过检查 describe
命令生成的 Conditions
和 Events
部分,您可以确定与 PVC相关的数据卷的状态,以及某个操作是否正在主动运行或完成。您可能还会收到信息,它们提供了有关数据卷状态的特定详情,以及如何处于当前状态。
有多种条件的组合。对每个条件组合的评估都必须其特定的环境下进行。
下面是各种组合的例子。
Bound
- 本示例中会显示成功绑定 PVC。请注意,
Type
是Bound
,所以Status
为True
。如果 PVC 没有绑定,Status
为False
。当 PVC 被绑定时,会生成一个事件声明 PVC 已被绑定。在本例中,
Reason
为Bound
,Status
为True
。Message
指明了哪个 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
- 在本例中,请注意Type
是Running
,Status
为False
。这表示发生事件导致尝试的操作失败,将 Status 从True
改为False
。然而,请注意
Reason
是Completed
,Message
显示Import Complete
。在
Events
部分,Reason
和Message
包含有关失败操作的额外故障排除信息。在这个示例中,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
- 如果Type
是Ready
,Status
为True
,则代表数据卷已就绪,如下例所示。如果数据卷未就绪,则Status
为False
:输出示例
Status: Conditions: Last Heart Beat Time: 2020-07-15T04:31:39Z Last Transition Time: 2020-07-15T04:31:39Z Status: True Type: Ready