14.4. OpenShift Virtualization 上托管集群故障排除
当您对 OpenShift Virtualization 上的托管集群进行故障排除时,从顶层 HostedCluster
和 NodePool
资源开始,然后关闭堆栈,直到找到根本原因。以下步骤可帮助您发现常见问题的根本原因。
14.4.1. HostedCluster 资源处于部分状态 复制链接链接已复制到粘贴板!
如果因为 HostedCluster
资源处于待处理而没有完全在线托管的 control plane,请通过检查先决条件、资源条件和节点和 Operator 状态来识别问题。
流程
- 确保您满足 OpenShift Virtualization 上托管集群的所有先决条件。
-
查看
HostedCluster
和NodePool
资源的条件,以了解防止进度的验证错误。 通过使用托管集群的
kubeconfig
文件,检查托管集群的状态:-
查看
oc get clusteroperators
命令的输出,以查看哪些集群 Operator 处于待处理状态。 -
查看
oc get nodes
命令的输出,以确保 worker 节点已就绪。
-
查看
14.4.2. 没有注册 worker 节点 复制链接链接已复制到粘贴板!
如果托管 control plane 没有注册 worker 节点而无法完全在线,请通过检查托管 control plane 的不同部分的状态来识别问题。
流程
-
查看带有故障的
HostedCluster
和NodePool
条件,以指示问题可能是什么。 输入以下命令查看
NodePool
资源的 KubeVirt worker 节点虚拟机 (VM) 状态:oc get vm -n <namespace>
$ oc get vm -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果虚拟机处于 provisioning 状态,请输入以下命令查看 VM 命名空间中的 CDI 导入 pod,以说明导入程序 pod 没有被完成的原因:
oc get pods -n <namespace> | grep "import"
$ oc get pods -n <namespace> | grep "import"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果虚拟机处于 start 状态,请输入以下命令查看 virt-launcher pod 的状态:
oc get pods -n <namespace> -l kubevirt.io=virt-launcher
$ oc get pods -n <namespace> -l kubevirt.io=virt-launcher
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 virt-launcher pod 处于待处理状态,请调查不调度 pod 的原因。例如,可能没有足够的资源来运行 virt-launcher pod。
- 如果虚拟机正在运行,但没有注册为 worker 节点,请使用 Web 控制台获取受影响虚拟机的 VNC 访问权限。VNC 输出指示是否应用了 ignition 配置。如果虚拟机在启动时无法访问托管的 control plane ignition 服务器,则无法正确置备虚拟机。
- 如果应用了 ignition 配置,但虚拟机仍然没有注册为节点,请参阅 识别问题:访问虚拟机控制台日志 以了解如何在启动过程中访问虚拟机控制台日志。
14.4.3. worker 节点处于 NotReady 状态 复制链接链接已复制到粘贴板!
在集群创建过程中,节点在推出网络堆栈时临时进入 NotReady
状态。该流程的这一部分是正常的。但是,如果进程的这部分时间超过 15 分钟,请通过调查节点对象和 pod 来识别问题。
流程
输入以下命令查看节点对象中的条件,并确定节点未就绪的原因:
oc get nodes -o yaml
$ oc get nodes -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令查找集群中的 pod 失败:
oc get pods -A --field-selector=status.phase!=Running,status,phase!=Succeeded
$ oc get pods -A --field-selector=status.phase!=Running,status,phase!=Succeeded
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4.4. Ingress 和控制台集群 operator 没有在线 复制链接链接已复制到粘贴板!
如果托管的 control plane 没有完全在线,因为 Ingress 和控制台集群 Operator 没有在线,请检查通配符 DNS 路由和负载均衡器。
流程
如果集群使用默认的 Ingress 行为,请输入以下命令来确保在托管虚拟机的 OpenShift Container Platform 集群上启用了通配符 DNS 路由:
oc patch ingresscontroller -n openshift-ingress-operator \ default --type=json -p \ '[{ "op": "add", "path": "/spec/routeAdmission", "value": {wildcardPolicy: "WildcardsAllowed"}}]'
$ oc patch ingresscontroller -n openshift-ingress-operator \ default --type=json -p \ '[{ "op": "add", "path": "/spec/routeAdmission", "value": {wildcardPolicy: "WildcardsAllowed"}}]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将自定义基域用于托管的 control plane,请完成以下步骤:
- 确保负载均衡器正确以虚拟机 pod 为目标。
- 确保通配符 DNS 条目以负载均衡器 IP 地址为目标。
14.4.5. 托管集群的负载均衡器服务不可用 复制链接链接已复制到粘贴板!
如果托管的 control plane 没有完全在线,因为负载均衡器服务不可用,请检查事件、详情和 Kubernetes 集群配置管理器(KCCM) pod。
流程
- 查找与托管集群中的负载均衡器服务关联的事件和详情。
默认情况下,托管集群的负载均衡器由托管的 control plane 命名空间中的 kubevirt-cloud-controller-manager 处理。确保 KCCM pod 在线,并查看其日志以查找错误或警告。要识别托管的 control plane 命名空间中的 KCCM pod,请输入以下命令:
oc get pods -n <hosted_control_plane_namespace> \ -l app=cloud-controller-manager
$ oc get pods -n <hosted_control_plane_namespace> \ -l app=cloud-controller-manager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4.6. 托管的集群 PVC 不可用 复制链接链接已复制到粘贴板!
如果托管的 control plane 没有被完全在线,因为托管集群的持久性卷声明 (PVC) 不可用,请检查 PVC 事件和详情,以及组件日志。
流程
- 查找与 PVC 关联的事件和详情,以了解发生的错误。
如果 PVC 无法附加到 pod,请查看托管集群中 kubevirt-csi-node
daemonset
组件的日志,以进一步调查问题。要识别每个节点的 kubevirt-csi-node pod,请输入以下命令:oc get pods -n openshift-cluster-csi-drivers -o wide \ -l app=kubevirt-csi-driver
$ oc get pods -n openshift-cluster-csi-drivers -o wide \ -l app=kubevirt-csi-driver
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 PVC 无法绑定到持久性卷 (PV),查看托管 control plane 命名空间中的 kubevirt-csi-controller 组件的日志。要识别托管的 control plane 命名空间中的 kubevirt-csi-controller pod,请输入以下命令:
oc get pods -n <hcp namespace> -l app=kubevirt-csi-driver
$ oc get pods -n <hcp namespace> -l app=kubevirt-csi-driver
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4.7. VM 节点没有正确加入集群 复制链接链接已复制到粘贴板!
如果托管的 control plane 无法完全在线,因为 VM 节点没有正确加入集群,访问 VM 控制台日志。
流程
14.4.8. RHCOS 镜像镜像失败 复制链接链接已复制到粘贴板!
对于在断开连接的环境中的 OpenShift Virtualization 上托管的 control plane,oc-mirror
无法自动将 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像镜像到内部 registry。当您创建第一个托管集群时,Kubevirt 虚拟机无法引导,因为引导镜像在内部 registry 中不可用。
要解决这个问题,请手动将 RHCOS 镜像镜像到内部 registry。
流程
运行以下命令来获取内部 registry 名称:
oc get imagecontentsourcepolicy -o json \ | jq -r '.items[].spec.repositoryDigestMirrors[0].mirrors[0]'
$ oc get imagecontentsourcepolicy -o json \ | jq -r '.items[].spec.repositoryDigestMirrors[0].mirrors[0]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来获取有效负载镜像:
oc get clusterversion version -ojsonpath='{.status.desired.image}'
$ oc get clusterversion version -ojsonpath='{.status.desired.image}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提取
0000_50_installer_coreos-bootimages.yaml
文件,该文件包含来自托管集群上的有效负载镜像的引导镜像。将<payload_image>
替换为有效负载镜像的名称。运行以下命令:oc image extract \ --file /release-manifests/0000_50_installer_coreos-bootimages.yaml \ <payload_image> --confirm
$ oc image extract \ --file /release-manifests/0000_50_installer_coreos-bootimages.yaml \ <payload_image> --confirm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来获取 RHCOS 镜像:
cat 0000_50_installer_coreos-bootimages.yaml | yq -r .data.stream \ | jq -r '.architectures.x86_64.images.kubevirt."digest-ref"' | jq -r '.architectures.x86_64.images.kubevirt."digest-ref"'
$ cat 0000_50_installer_coreos-bootimages.yaml | yq -r .data.stream \ | jq -r '.architectures.x86_64.images.kubevirt."digest-ref"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 RHCOS 镜像镜像(mirror)到内部 registry。将
<rhcos_image>
替换为您的 RHCOS 镜像,例如quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:d9643ead36b1c026be664c9c65c11433c6cdf71bfd93ba229141d134a4a6dd94
。将<internal_registry>
替换为内部 registry 的名称;例如,virthost.ostest.test.metalkube.org:5000/localimages/ocp-v4.0-art-dev
。运行以下命令:oc image mirror <rhcos_image> <internal_registry>
$ oc image mirror <rhcos_image> <internal_registry>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
rhcos-boot-kubevirt.yaml
的 YAML 文件,该文件定义ImageDigestMirrorSet
对象。请参见以下示例配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令应用
rhcos-boot-kubevirt.yaml
文件来创建ImageDigestMirrorSet
对象:oc apply -f rhcos-boot-kubevirt.yaml
$ oc apply -f rhcos-boot-kubevirt.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4.9. 将非裸机集群返回到后向绑定池 复制链接链接已复制到粘贴板!
如果您在没有 BareMetalHosts
的情况下使用后绑定受管集群,您必须完成额外的手动步骤来删除后绑定集群,并将节点返回到 Discovery ISO。
对于没有 BareMetalHosts
的绑定受管集群,删除集群信息不会自动将所有节点返回到 Discovery ISO。
流程
要使用后绑定非裸机节点,请完成以下步骤:
- 删除集群信息。如需更多信息,请参阅从管理中删除集群。
- 清理根磁盘。
- 使用 Discovery ISO 手动重新引导。