14.3. 监控


14.3.1. 监控概述

您可以使用以下工具监控集群和虚拟机 (VM) 的健康状况:

OpenShift Container Platform 集群检查框架

使用 OpenShift Container Platform 集群检查框架在集群中运行自动测试,以检查以下条件:

  • 附加到二级网络接口的两个虚拟机之间的网络连接和延迟
  • 运行带有零数据包丢失的 Data Plane Development Kit (DPDK) 工作负载的虚拟机
重要

OpenShift Container Platform 集群检查框架只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

Prometheus 对虚拟资源的查询
查询 vCPU、网络、存储和客户机内存交换使用情况和实时迁移进度。
VM 自定义指标
配置 node-exporter 服务,以公开内部虚拟机指标和进程。
xref:[VM health checks]
为虚拟机配置就绪度、存活度和客户机代理 ping 探测和 watchdog。
重要

客户机代理 ping 探测只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

14.3.2. OpenShift Container Platform 集群检查框架

OpenShift Virtualization 包括预定义的检查,可用于集群维护和故障排除。

重要

OpenShift Container Platform 集群检查框架只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

14.3.2.1. 关于 OpenShift Container Platform 集群检查框架

checkup 是一个自动测试工作负载,可让您验证特定的集群功能是否按预期工作。集群检查框架使用原生 Kubernetes 资源来配置和执行检查。

通过使用预定义的检查,集群管理员和开发人员可以提高集群可维护性,排除意外行为,最小化错误并节省时间。还可以检查结果并与专家分享,以进一步进行分析。供应商可以编写和发布它们所提供的功能或服务的检查,并验证其客户环境是否已正确配置。

在现有命名空间中运行预定义的检查涉及为检查设置服务帐户,为服务帐户创建 RoleRoleBinding 对象,启用检查权限,以及创建输入配置映射和检查作业。您可以多次运行检查。

重要

您必须始终:

  • 在应用之前,验证检查镜像是否来自可信源。
  • 在创建 RoleRoleBinding 对象前,查看检查权限。

14.3.2.2. 虚拟机延迟检查

您可以使用预定义的检查来验证附加到二级网络接口的两个虚拟机 (VM) 之间的网络连接和测量延迟。延迟检查使用 ping 工具。

您可以执行以下步骤来运行延迟检查:

  1. 创建服务帐户、角色和 rolebindings,以便为延迟检查提供集群访问权限。
  2. 创建配置映射以提供运行检查并存储结果的输入。
  3. 创建用于运行检查的作业。
  4. 查看配置映射中的结果。
  5. 可选: 要重新运行检查,请删除现有的配置映射和作业,然后创建新的配置映射和作业。
  6. 完成后,删除延迟检查资源。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 集群至少有两个 worker 节点。
  • Multus Container Network Interface (CNI) 插件已安装在集群中。
  • 为命名空间配置了网络附加定义。

流程

  1. 为延迟检查创建一个 ServiceAccountRoleRoleBinding 清单:

    例 14.1. 角色清单文件示例

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: vm-latency-checkup-sa
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: kubevirt-vm-latency-checker
    rules:
    - apiGroups: ["kubevirt.io"]
      resources: ["virtualmachineinstances"]
      verbs: ["get", "create", "delete"]
    - apiGroups: ["subresources.kubevirt.io"]
      resources: ["virtualmachineinstances/console"]
      verbs: ["get"]
    - apiGroups: ["k8s.cni.cncf.io"]
      resources: ["network-attachment-definitions"]
      verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: kubevirt-vm-latency-checker
    subjects:
    - kind: ServiceAccount
      name: vm-latency-checkup-sa
    roleRef:
      kind: Role
      name: kubevirt-vm-latency-checker
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: kiagnose-configmap-access
    rules:
    - apiGroups: [ "" ]
      resources: [ "configmaps" ]
      verbs: ["get", "update"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: kiagnose-configmap-access
    subjects:
    - kind: ServiceAccount
      name: vm-latency-checkup-sa
    roleRef:
      kind: Role
      name: kiagnose-configmap-access
      apiGroup: rbac.authorization.k8s.io
  2. 应用 ServiceAccountRoleRoleBinding 清单:

    $ oc apply -n <target_namespace> -f <latency_sa_roles_rolebinding>.yaml 1
    1
    <target_namespace> 是要运行检查的命名空间。这必须是 NetworkAttachmentDefinition 对象所在的现有命名空间。
  3. 创建包含检查的输入参数的 ConfigMap 清单:

    输入配置映射示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kubevirt-vm-latency-checkup-config
    data:
      spec.timeout: 5m
      spec.param.networkAttachmentDefinitionNamespace: <target_namespace>
      spec.param.networkAttachmentDefinitionName: "blue-network" 1
      spec.param.maxDesiredLatencyMilliseconds: "10" 2
      spec.param.sampleDurationSeconds: "5" 3
      spec.param.sourceNode: "worker1" 4
      spec.param.targetNode: "worker2" 5

    1
    NetworkAttachmentDefinition 对象的名称。
    2
    可选:虚拟机之间所需最大延迟(以毫秒为单位)。如果测量的延迟超过这个值,则检查会失败。
    3
    可选:延迟检查的持续时间,以秒为单位。
    4
    可选:指定时,延迟从此节点测量到目标节点。如果指定了源节点,spec.param.targetNode 字段将无法为空。
    5
    可选:指定时,延迟从源节点测量到这个节点。
  4. 应用目标命名空间中的配置映射清单:

    $ oc apply -n <target_namespace> -f <latency_config_map>.yaml
  5. 创建一个 Job 清单以运行检查:

    任务清单示例

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: kubevirt-vm-latency-checkup
    spec:
      backoffLimit: 0
      template:
        spec:
          serviceAccountName: vm-latency-checkup-sa
          restartPolicy: Never
          containers:
            - name: vm-latency-checkup
              image: registry.redhat.io/container-native-virtualization/vm-network-latency-checkup-rhel9:v4.13.0
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop: ["ALL"]
                runAsNonRoot: true
                seccompProfile:
                  type: "RuntimeDefault"
              env:
                - name: CONFIGMAP_NAMESPACE
                  value: <target_namespace>
                - name: CONFIGMAP_NAME
                  value: kubevirt-vm-latency-checkup-config
                - name: POD_UID
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.uid

  6. 应用 Job 清单:

    $ oc apply -n <target_namespace> -f <latency_job>.yaml
  7. 等待作业完成:

    $ oc wait job kubevirt-vm-latency-checkup -n <target_namespace> --for condition=complete --timeout 6m
  8. 运行以下命令,检查延迟检查的结果。如果测量的最大延迟大于 spec.param.maxDesiredLatencyMilliseconds 属性的值,则检查会失败并返回错误。

    $ oc get configmap kubevirt-vm-latency-checkup-config -n <target_namespace> -o yaml

    输出配置映射(成功)示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kubevirt-vm-latency-checkup-config
      namespace: <target_namespace>
    data:
      spec.timeout: 5m
      spec.param.networkAttachmentDefinitionNamespace: <target_namespace>
      spec.param.networkAttachmentDefinitionName: "blue-network"
      spec.param.maxDesiredLatencyMilliseconds: "10"
      spec.param.sampleDurationSeconds: "5"
      spec.param.sourceNode: "worker1"
      spec.param.targetNode: "worker2"
      status.succeeded: "true"
      status.failureReason: ""
      status.completionTimestamp: "2022-01-01T09:00:00Z"
      status.startTimestamp: "2022-01-01T09:00:07Z"
      status.result.avgLatencyNanoSec: "177000"
      status.result.maxLatencyNanoSec: "244000" 1
      status.result.measurementDurationSec: "5"
      status.result.minLatencyNanoSec: "135000"
      status.result.sourceNode: "worker1"
      status.result.targetNode: "worker2"

    1
    以纳秒为单位的最大测量延迟。
  9. 可选: 要在检查失败时查看详细作业日志,请使用以下命令:

    $ oc logs job.batch/kubevirt-vm-latency-checkup -n <target_namespace>
  10. 运行以下命令删除之前创建的作业和配置映射:

    $ oc delete job -n <target_namespace> kubevirt-vm-latency-checkup
    $ oc delete config-map -n <target_namespace> kubevirt-vm-latency-checkup-config
  11. 可选:如果您不计划运行另一个检查,请删除角色清单:

    $ oc delete -f <latency_sa_roles_rolebinding>.yaml

14.3.2.3. DPDK 检查

使用预定义的检查来验证 OpenShift Container Platform 集群节点是否可以运行带有零数据包丢失的 Data Plane Development Kit (DPDK) 工作负载的虚拟机 (VM)。DPDK 检查运行流量生成器 pod 和运行测试 DPDK 应用程序的虚拟机之间的流量。

您可以执行以下步骤来运行 DPDK 检查:

  1. 为 DPDK 检查创建服务帐户、角色和角色绑定,以及用于流量生成器 pod 的服务帐户。
  2. 为流量生成器 pod 创建安全性上下文约束资源。
  3. 创建配置映射以提供运行检查并存储结果的输入。
  4. 创建用于运行检查的作业。
  5. 查看配置映射中的结果。
  6. 可选: 要重新运行检查,请删除现有的配置映射和作业,然后创建新的配置映射和作业。
  7. 完成后,删除 DPDK 检查资源。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问集群。
  • 已安装 OpenShift CLI(oc)。
  • 您已将计算节点配置为在有零数据包丢失的虚拟机上运行 DPDK 应用程序。
重要

检查创建的流量生成器 pod 有升级的权限:

  • 它以 root 用户身份运行。
  • 它有一个绑定挂载到节点的文件系统。

流量生成器的容器镜像是从上游 Project Quay 容器 registry 中拉取的。

流程

  1. 为 DPDK 检查和流量生成器 pod 创建 ServiceAccountRoleRoleBinding 清单:

    例 14.2. 服务帐户、角色和 rolebinding 清单文件示例

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: dpdk-checkup-sa
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: kiagnose-configmap-access
    rules:
      - apiGroups: [ "" ]
        resources: [ "configmaps" ]
        verbs: [ "get", "update" ]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: kiagnose-configmap-access
    subjects:
      - kind: ServiceAccount
        name: dpdk-checkup-sa
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: kiagnose-configmap-access
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: kubevirt-dpdk-checker
    rules:
      - apiGroups: [ "kubevirt.io" ]
        resources: [ "virtualmachineinstances" ]
        verbs: [ "create", "get", "delete" ]
      - apiGroups: [ "subresources.kubevirt.io" ]
        resources: [ "virtualmachineinstances/console" ]
        verbs: [ "get" ]
      - apiGroups: [ "" ]
        resources: [ "pods" ]
        verbs: [ "create", "get", "delete" ]
      - apiGroups: [ "" ]
        resources: [ "pods/exec" ]
        verbs: [ "create" ]
      - apiGroups: [ "k8s.cni.cncf.io" ]
        resources: [ "network-attachment-definitions" ]
        verbs: [ "get" ]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: kubevirt-dpdk-checker
    subjects:
      - kind: ServiceAccount
        name: dpdk-checkup-sa
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: kubevirt-dpdk-checker
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: dpdk-checkup-traffic-gen-sa
  2. 应用 ServiceAccountRoleRoleBinding 清单:

    $ oc apply -n <target_namespace> -f <dpdk_sa_roles_rolebinding>.yaml
  3. 为流量生成器 pod 创建 SecurityContextConstraints 清单:

    安全性上下文约束清单示例

    apiVersion: security.openshift.io/v1
    kind: SecurityContextConstraints
    metadata:
      name: dpdk-checkup-traffic-gen
    allowHostDirVolumePlugin: true
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: false
    allowPrivilegedContainer: false
    allowedCapabilities:
    - IPC_LOCK
    - NET_ADMIN
    - NET_RAW
    - SYS_RESOURCE
    defaultAddCapabilities: null
    fsGroup:
      type: RunAsAny
    groups: []
    readOnlyRootFilesystem: false
    requiredDropCapabilities: null
    runAsUser:
      type: RunAsAny
    seLinuxContext:
      type: RunAsAny
    seccompProfiles:
    - runtime/default
    - unconfined
    supplementalGroups:
      type: RunAsAny
    users:
    - system:serviceaccount:dpdk-checkup-ns:dpdk-checkup-traffic-gen-sa

  4. 应用 SecurityContextConstraints 清单:

    $ oc apply -f <dpdk_scc>.yaml
  5. 创建包含检查的输入参数的 ConfigMap 清单:

    输入配置映射示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: dpdk-checkup-config
    data:
      spec.timeout: 10m
      spec.param.networkAttachmentDefinitionName: <network_name> 1
      spec.param.trafficGeneratorRuntimeClassName: <runtimeclass_name> 2
      spec.param.trafficGeneratorImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-traffic-gen:v0.1.1" 3
      spec.param.vmContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-vm:v0.1.1" 4

    1
    NetworkAttachmentDefinition 对象的名称。
    2
    流量生成器 pod 使用的 RuntimeClass 资源。
    3
    流量生成器的容器镜像。在本例中,镜像是从上游 Project Quay Container Registry 中拉取的。
    4
    虚拟机的容器磁盘镜像。在本例中,镜像是从上游 Project Quay Container Registry 中拉取的。
  6. 应用目标命名空间中的 ConfigMap 清单:

    $ oc apply -n <target_namespace> -f <dpdk_config_map>.yaml
  7. 创建一个 Job 清单以运行检查:

    任务清单示例

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: dpdk-checkup
    spec:
      backoffLimit: 0
      template:
        spec:
          serviceAccountName: dpdk-checkup-sa
          restartPolicy: Never
          containers:
            - name: dpdk-checkup
              image: registry.redhat.io/container-native-virtualization/kubevirt-dpdk-checkup-rhel9:v4.13.0
              imagePullPolicy: Always
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop: ["ALL"]
                runAsNonRoot: true
                seccompProfile:
                  type: "RuntimeDefault"
              env:
                - name: CONFIGMAP_NAMESPACE
                  value: <target-namespace>
                - name: CONFIGMAP_NAME
                  value: dpdk-checkup-config
                - name: POD_UID
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.uid

  8. 应用 Job 清单:

    $ oc apply -n <target_namespace> -f <dpdk_job>.yaml
  9. 等待作业完成:

    $ oc wait job dpdk-checkup -n <target_namespace> --for condition=complete --timeout 10m
  10. 运行以下命令,查看检查的结果:

    $ oc get configmap dpdk-checkup-config -n <target_namespace> -o yaml

    输出配置映射(成功)示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: dpdk-checkup-config
    data:
      spec.timeout: 1h2m
      spec.param.NetworkAttachmentDefinitionName: "mlx-dpdk-network-1"
      spec.param.trafficGeneratorRuntimeClassName: performance-performance-zeus10
      spec.param.trafficGeneratorImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-traffic-gen:v0.1.1"
      spec.param.vmContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-vm:v0.1.1"
      status.succeeded: true
      status.failureReason: " "
      status.startTimestamp: 2022-12-21T09:33:06+00:00
      status.completionTimestamp: 2022-12-21T11:33:06+00:00
      status.result.actualTrafficGeneratorTargetNode: worker-dpdk1
      status.result.actualDPDKVMTargetNode: worker-dpdk2
      status.result.dropRate: 0

  11. 运行以下命令删除之前创建的作业和配置映射:

    $ oc delete job -n <target_namespace> dpdk-checkup
    $ oc delete config-map -n <target_namespace> dpdk-checkup-config
  12. 可选:如果您不计划运行另一个检查,请删除 ServiceAccountRoleRoleBinding 清单:

    $ oc delete -f <dpdk_sa_roles_rolebinding>.yaml
14.3.2.3.1. DPDK 检查配置映射参数

下表显示了在运行集群 DPDK 就绪度检查时,您可以在输入 ConfigMap 清单的 data 小节中设置的强制参数和可选参数:

表 14.3. DPDK 检查配置映射参数
参数描述是必须的

spec.timeout

检查失败前的时间(以分钟为单位)。

True

spec.param.networkAttachmentDefinitionName

连接 SR-IOV NIC 的 NetworkAttachmentDefinition 对象的名称。

True

spec.param.trafficGeneratorRuntimeClassName

流量生成器 pod 使用的 RuntimeClass 资源。

True

spec.param.trafficGeneratorImage

流量生成器的容器镜像。默认值为 quay.io/kiagnose/kubevirt-dpdk-checkup-traffic-gen:main

False

spec.param.trafficGeneratorNodeSelector

要在其上调度流量生成器 pod 的节点。节点应配置为允许 DPDK 流量。

False

spec.param.trafficGeneratorPacketsPerSecond

每秒数据包数量,单位为(k)或500万(m)。默认值为 14m。

False

spec.param.trafficGeneratorEastMacAddress

连接到流量生成器 pod 或虚拟机的 NIC 的 MAC 地址。默认值为随机 MAC 地址,格式为 50:xx:xx:xx:xx:01

False

spec.param.trafficGeneratorWestMacAddress

连接到流量生成器 pod 或虚拟机的 NIC 的 MAC 地址。默认值为随机 MAC 地址,格式为 50:xx:xx:xx:xx:02

False

spec.param.vmContainerDiskImage

虚拟机的容器磁盘镜像。默认值为 quay.io/kiagnose/kubevirt-dpdk-checkup-vm:main

False

spec.param.DPDKLabelSelector

运行虚拟机的节点标签。节点应配置为允许 DPDK 流量。

False

spec.param.DPDKEastMacAddress

连接到虚拟机的 NIC 的 MAC 地址。默认值为随机 MAC 地址,格式为 60:xx:xx:xx:xx:01

False

spec.param.DPDKWestMacAddress

连接到虚拟机的 NIC 的 MAC 地址。默认值为随机 MAC 地址,格式为 60:xx:xx:xx:xx:02

False

spec.param.testDuration

流量生成器运行的持续时间(以分钟为单位)。默认值为 5 分钟。

False

spec.param.portBandwidthGB

SR-IOV NIC 的最大带宽。默认值为 10GB。

False

spec.param.verbose

当设置为 true 时,它会增加检查日志的详细程度。默认值为 false

False

14.3.2.3.2. 为 RHEL 虚拟机构建容器磁盘镜像

您可以使用 qcow2 格式构建自定义 Red Hat Enterprise Linux (RHEL) 8 OS 镜像,并使用它来创建容器磁盘镜像。您可以将容器磁盘镜像存储在集群中可访问的 registry 中,并在 DPDK 检查配置映射的 spec.param.vmContainerDiskImage 属性中指定镜像位置。

要构建容器镜像,您必须创建一个镜像构建器虚拟机 (VM)。镜像构建器虚拟机 是一个 RHEL 8 虚拟机,可用于构建自定义 RHEL 镜像。

先决条件

  • 镜像构建器虚拟机必须运行 RHEL 8.7,且必须至少在 /var 目录中有 2 个 CPU 内核、4 GiB RAM 和 20 GB 的可用空间。
  • 您已在虚拟机上安装了镜像构建器工具及其 CLI (composer-cli)。
  • 已安装 virt-customize 工具:

    # dnf install libguestfs-tools
  • 已安装 Podman CLI 工具 (podman)。

流程

  1. 验证您可以构建 RHEL 8.7 镜像:

    # composer-cli distros list
    注意

    要以非 root 身份运行 composer-cli 命令,请将您的用户添加到 weldrroot 组中:

    # usermod -a -G weldr user
    $ newgrp weldr
  2. 输入以下命令以 TOML 格式创建镜像蓝图文件,其中包含要安装的软件包、内核自定义和服务,以及在引导时要禁用的服务:

    $ cat << EOF > dpdk-vm.toml
    name = "dpdk_image"
    description = "Image to use with the DPDK checkup"
    version = "0.0.1"
    distro = "rhel-87"
    
    [[packages]]
    name = "dpdk"
    
    [[packages]]
    name = "dpdk-tools"
    
    [[packages]]
    name = "driverctl"
    
    [[packages]]
    name = "tuned-profiles-cpu-partitioning"
    
    [customizations.kernel]
    append = "default_hugepagesz=1GB hugepagesz=1G hugepages=8 isolcpus=2-7"
    
    [customizations.services]
    disabled = ["NetworkManager-wait-online", "sshd"]
    EOF
  3. 运行以下命令,将蓝图文件推送到镜像构建器工具中:

    # composer-cli blueprints push dpdk-vm.toml
  4. 通过指定蓝图名称和输出文件格式来生成系统镜像。在开始 compose 过程时,会显示镜像的通用唯一标识符(UUID)。

    # composer-cli compose start dpdk_image qcow2
  5. 等待 compose 进程完成。compose 状态必须先显示 FINISHED,然后才能继续下一步。

    # composer-cli compose status
  6. 输入以下命令通过指定其 UUID 来下载 qcow2 镜像文件:

    # composer-cli compose image <UUID>
  7. 运行以下命令来创建自定义脚本:

    $ cat <<EOF >customize-vm
    echo  isolated_cores=2-7 > /etc/tuned/cpu-partitioning-variables.conf
    tuned-adm profile cpu-partitioning
    echo "options vfio enable_unsafe_noiommu_mode=1" > /etc/modprobe.d/vfio-noiommu.conf
    EOF
    $ cat <<EOF >first-boot
    driverctl set-override 0000:06:00.0 vfio-pci
    driverctl set-override 0000:07:00.0 vfio-pci
    
    mkdir /mnt/huge
    mount /mnt/huge --source nodev -t hugetlbfs -o pagesize=1GB
    EOF
  8. 使用 virt-customize 工具自定义镜像构建器工具生成的镜像:

    $ virt-customize -a <UUID>.qcow2 --run=customize-vm --firstboot=first-boot --selinux-relabel
  9. 要创建包含构建容器镜像的所有命令的 Dockerfile,请输入以下命令:

    $ cat << EOF > Dockerfile
    FROM scratch
    COPY <uuid>-disk.qcow2 /disk/
    EOF

    其中:

    <uuid>-disk.qcow2
    qcow2 格式指定自定义镜像的名称。
  10. 运行以下命令构建并标记容器:

    $ podman build . -t dpdk-rhel:latest
  11. 运行以下命令,将容器磁盘镜像推送到集群可访问的 registry:

    $ podman push dpdk-rhel:latest
  12. 在 DPDK 检查配置映射中的 spec.param.vmContainerDiskImage 属性中提供容器磁盘镜像的链接。

14.3.2.4. 其他资源

14.3.3. Prometheus 对虚拟资源的查询

OpenShift Virtualization 提供用于监控集群基础架构资源消耗的指标,包括 vCPU、网络、存储和客户机内存交换。您还可以使用指标查询实时迁移状态。

使用 OpenShift Container Platform 监控仪表板查询虚拟化指标。

14.3.3.1. 先决条件

  • 要使用 vCPU 指标,必须将 schedstats=enable 内核参数应用到 MachineConfig 对象。此内核参数启用用于调试和性能调优的调度程序统计,并为调度程序添加较小的额外负载。如需更多信息,请参阅向节点添加内核参数
  • 要进行客户机内存交换查询以返回数据,必须在虚拟客户机上启用内存交换。

14.3.3.2. 查询指标

OpenShift Container Platform 监控仪表板可供您运行 Prometheus Query Language (PromQL) 查询来查看图表中呈现的指标。此功能提供有关集群以及要监控的任何用户定义工作负载的状态信息。

作为集群管理员,您可以查询所有 OpenShift Container Platform 核心项目和用户定义的项目的指标。

作为开发者,您必须在查询指标时指定项目名称。您必须具有所需权限才能查看所选项目的指标。

14.3.3.2.1. 以集群管理员身份查询所有项目的指标

作为集群管理员,或具有所有项目的查看权限的用户,您可以在 Metrics UI 中访问所有 OpenShift Container Platform 默认项目和用户定义的项目的指标。

先决条件

  • 您可以使用具有 cluster-admin 集群角色的用户访问集群,或者具有所有项目的查看权限。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 从 OpenShift Container Platform Web 控制台中的 Administrator 视角,选择 Observe Metrics
  2. 要添加一个或多个查询,请执行以下操作之一:

    选项描述

    创建自定义查询。

    将 Prometheus Query Language (PromQL) 查询添加到 Expression 字段中。

    当您输入 PromQL 表达式时,自动完成建议会出现在下拉列表中。这些建议包括功能、指标、标签和时间令牌。您可以使用键盘箭头选择其中一项建议的项目,然后按 Enter 将项目添加到您的表达式中。您还可以将鼠标指针移到建议的项目上,以查看该项目的简短描述。

    添加多个查询。

    选择 Add query

    复制现有的查询。

    选择查询旁边的 Options 菜单 kebab ,然后选择 Duplicate 查询

    禁用查询正在运行。

    选择查询旁边的 Options 菜单 kebab 并选择 Disable query

  3. 要运行您创建的查询,请选择 Run queries。图表中会直观呈现查询的指标。如果查询无效,则 UI 会显示错误消息。

    注意

    如果查询对大量数据进行运算,这可能会在绘制时序图时造成浏览器超时或过载。要避免这种情况,请选择 Hide graph 并且仅使用指标表来校准查询。然后,在找到可行的查询后,启用图表来绘制图形。

    注意

    默认情况下,查询表会显示一个展开的视图,列出每个指标及其当前值。您可以选择 ˅ 来最小化查询的展开视图。

  4. 可选:页面 URL 现在包含您运行的查询。要在以后再次使用这一组查询,请保存这个 URL。
  5. 探索视觉化指标。最初,图表中显示所有启用的查询中的所有指标。您可以通过执行以下操作来选择显示哪些指标:

    选项描述

    隐藏查询中的所有指标。

    点查询的 Options 菜单 kebab 并点 Hide all series

    隐藏特定指标。

    前往查询表,再点指标名称旁边的带颜色的方格。

    放大图表并更改时间范围。

    任一:

    • 点击图表并在水平方向上拖动,以可视化方式选择时间范围。
    • 使用左上角的菜单来选择时间范围。

    重置时间范围。

    选择 Reset zoom

    在特定时间点显示所有查询的输出。

    将鼠标光标悬停在图表上。弹出框中会显示查询输出。

    隐藏图表。

    选择 Hide graph

14.3.3.2.2. 以开发者身份查询用户定义的项目的指标

您可以以开发者或具有项目查看权限的用户身份访问用户定义项目的指标。

Developer 视角中, Metrics UI 包括所选项目的一些预定义 CPU、内存、带宽和网络数据包查询。您还可以对项目的 CPU、内存、带宽、网络数据包和应用程序指标运行自定义 Prometheus Query Language (PromQL) 查询。

注意

开发者只能使用 Developer 视角,而不能使用 Administrator 视角。作为开发者,您一次只能查询一个项目的指标。

先决条件

  • 对于您要查看指标的项目,您可以作为开发者或具有查看权限的用户访问集群。
  • 您已为用户定义的项目启用了监控。
  • 您已在用户定义的项目中部署了服务。
  • 您已为该服务创建了 ServiceMonitor 自定义资源定义(CRD),以定义如何监控该服务。

流程

  1. 在 OpenShift Container Platform web 控制台中的 Developer 视角中,选择 Observe Metrics
  2. Project: 列表中选择您要查看指标的项目。
  3. Select query 列表中选择查询,或者通过选择 Show PromQL 根据所选查询创建自定义 PromQL 查询。图表中会直观呈现查询的指标。

    注意

    在 Developer 视角中,您一次只能运行一个查询。

  4. 通过执行以下操作来探索视觉化的指标:

    选项描述

    放大图表并更改时间范围。

    任一:

    • 点击图表并在水平方向上拖动,以可视化方式选择时间范围。
    • 使用左上角的菜单来选择时间范围。

    重置时间范围。

    选择 Reset zoom

    在特定时间点显示所有查询的输出。

    将鼠标光标悬停在图表上。查询输出会出现在弹出窗口中。

14.3.3.3. 虚拟化指标

以下指标描述包括示例 Prometheus Query Language(PromQL)查询。这些指标不是 API,可能在不同版本之间有所变化。

注意

以下示例使用 topk 查询来指定时间段。如果在那个时间段内删除虚拟机,它们仍然会显示在查询输出中。

14.3.3.3.1. vCPU 指标

以下查询可以识别等待输入/输出 (I/O) 的虚拟机:

kubevirt_vmi_vcpu_wait_seconds
返回虚拟机的 vCPU 等待时间(以秒为单位)。类型:计数器。

高于"0" 的值表示 vCPU 要运行,但主机调度程序还无法运行它。无法运行代表 I/O 存在问题。

注意

要查询 vCPU 指标,必须首先将 schedstats=enable 内核参数应用到 MachineConfig 对象。此内核参数启用用于调试和性能调优的调度程序统计,并为调度程序添加较小的额外负载。

vCPU 等待时间查询示例

topk(3, sum by (name, namespace) (rate(kubevirt_vmi_vcpu_wait_seconds[6m]))) > 0 1

1
此查询会返回在六分钟内每次都等待 I/O 的 3 台虚拟机。
14.3.3.3.2. 网络指标

以下查询可以识别正在饱和网络的虚拟机:

kubevirt_vmi_network_receive_bytes_total
返回虚拟机网络中接收的流量总数(以字节为单位)。类型:计数器。
kubevirt_vmi_network_transmit_bytes_total
返回虚拟机网络上传输的流量总数(以字节为单位)。类型:计数器。

网络流量查询示例

topk(3, sum by (name, namespace) (rate(kubevirt_vmi_network_receive_bytes_total[6m])) + sum by (name, namespace) (rate(kubevirt_vmi_network_transmit_bytes_total[6m]))) > 0 1

1
此查询会返回每给定时间在六分钟内传输最多流量的 3 台虚拟机。
14.3.3.3.3. 存储指标
14.3.3.3.3.1. 与存储相关的流量

以下查询可以识别正在写入大量数据的虚拟机:

kubevirt_vmi_storage_read_traffic_bytes_total
返回虚拟机与存储相关的流量的总量(以字节为单位)。类型:计数器。
kubevirt_vmi_storage_write_traffic_bytes_total
返回虚拟机与存储相关的流量的存储写入总量(以字节为单位)。类型:计数器。

与存储相关的流量查询示例

topk(3, sum by (name, namespace) (rate(kubevirt_vmi_storage_read_traffic_bytes_total[6m])) + sum by (name, namespace) (rate(kubevirt_vmi_storage_write_traffic_bytes_total[6m]))) > 0 1

1
此查询会返回在六分钟内每给定时间执行最多存储流量的 3 台虚拟机。
14.3.3.3.3.2. 存储快照数据
kubevirt_vmsnapshot_disks_restored_from_source_total
返回从源虚拟机中恢复的虚拟机磁盘总数。类型:Gauge。
kubevirt_vmsnapshot_disks_restored_from_source_bytes
返回从源虚拟机恢复的字节空间量。类型:Gauge。

存储快照数据查询示例

kubevirt_vmsnapshot_disks_restored_from_source_total{vm_name="simple-vm", vm_namespace="default"} 1

1
此查询返回从源虚拟机恢复的虚拟机磁盘总数。
kubevirt_vmsnapshot_disks_restored_from_source_bytes{vm_name="simple-vm", vm_namespace="default"} 1
1
此查询返回源虚拟机恢复的空间大小,以字节为单位。
14.3.3.3.3.3. I/O 性能

以下查询可决定存储设备的 I/O 性能:

kubevirt_vmi_storage_iops_read_total
返回虚拟机每秒执行的写入 I/O 操作量。类型:计数器。
kubevirt_vmi_storage_iops_write_total
返回虚拟机每秒执行的读取 I/O 操作量。类型:计数器。

I/O 性能查询示例

topk(3, sum by (name, namespace) (rate(kubevirt_vmi_storage_iops_read_total[6m])) + sum by (name, namespace) (rate(kubevirt_vmi_storage_iops_write_total[6m]))) > 0 1

1
此查询返回在六分钟内每给定时间每秒执行最多 I/O 操作数的 3 台虚拟机。
14.3.3.3.4. 客户机内存交换指标

以下查询可识别启用了交换最多的客户端执行内存交换最多:

kubevirt_vmi_memory_swap_in_traffic_bytes_total
返回虚拟客户机交换的内存总量(以字节为单位)。类型:Gauge。
kubevirt_vmi_memory_swap_out_traffic_bytes_total
返回虚拟 guest 正在交换的内存总量(以字节为单位)。类型:Gauge。

内存交换查询示例

topk(3, sum by (name, namespace) (rate(kubevirt_vmi_memory_swap_in_traffic_bytes_total[6m])) + sum by (name, namespace) (rate(kubevirt_vmi_memory_swap_out_traffic_bytes_total[6m]))) > 0 1

1
此查询返回前 3 台虚拟机,其中客户机在六分钟内执行每个给定时间段内每个给定时间最多的内存交换。
注意

内存交换表示虚拟机面临内存压力。增加虚拟机的内存分配可以缓解此问题。

14.3.3.3.5. 实时迁移指标

可以查询以下指标来显示实时迁移状态:

kubevirt_migrate_vmi_data_processed_bytes
迁移到新虚拟机(VM)的客户机操作系统数据量。类型:Gauge。
kubevirt_migrate_vmi_data_remaining_bytes
要迁移的客户机操作系统数据量。类型:Gauge。
kubevirt_migrate_vmi_dirty_memory_rate_bytes
在客户端操作系统中达到脏的速率。脏内存是已更改但还没有写入磁盘的数据。类型:Gauge。
kubevirt_migrate_vmi_pending_count
待处理的迁移数量。类型:Gauge。
kubevirt_migrate_vmi_scheduling_count
调度迁移的数量。类型:Gauge。
kubevirt_migrate_vmi_running_count
正在运行的迁移数量。类型:Gauge。
kubevirt_migrate_vmi_succeeded
成功完成迁移的数量。类型:Gauge。
kubevirt_migrate_vmi_failed
失败的迁移数量。类型:Gauge。

14.3.3.4. 其他资源

14.3.4. 为虚拟机公开自定义指标

OpenShift Container Platform 包括一个预配置、预安装和自我更新的监控堆栈,可为核心平台组件提供监控。此监控堆栈基于 Prometheus 监控系统。Prometheus 是一个时间序列数据库和用于指标的规则评估引擎。

除了使用 OpenShift Container Platform 监控堆栈外,您还可以使用 CLI 启用对用户定义的项目的监控,并查询通过 node-exporter 服务为虚拟机公开的自定义指标。

14.3.4.1. 配置节点导出器服务

node-exporter 代理部署在您要从中收集指标的集群中的每个虚拟机上。将 node-exporter 代理配置为服务,以公开与虚拟机关联的内部指标和进程。

先决条件

  • 安装 OpenShift Container Platform CLI oc
  • 以具有 cluster-admin 权限的用户身份登录集群。
  • openshift-monitoring 项目中创建 cluster-monitoring-config ConfigMap 对象。
  • 通过将 enableUserWorkload 设置为 true,配置 openshift-user-workload-monitoring 项目中的 user-workload-monitoring-config ConfigMap 对象。

流程

  1. 创建 Service YAML 文件。在以下示例中,该文件名为 node-exporter-service.yaml

    kind: Service
    apiVersion: v1
    metadata:
      name: node-exporter-service 1
      namespace: dynamation 2
      labels:
        servicetype: metrics 3
    spec:
      ports:
        - name: exmet 4
          protocol: TCP
          port: 9100 5
          targetPort: 9100 6
      type: ClusterIP
      selector:
        monitor: metrics 7
    1
    从虚拟机公开指标的 node-exporter 服务。
    2
    创建服务的命名空间。
    3
    服务的标签。ServiceMonitor 使用此标签来匹配此服务。
    4
    提供给通过端口 9100 为 ClusterIP 服务公开指标的端口的名称。
    5
    node-exporter-service 用来侦听请求的目标端口。
    6
    配置有 monitor 标签的虚拟机的 TCP 端口号。
    7
    用于与虚拟机的 pod 匹配的标签。在本例中,任何具有标签 monitor,值为 metrics 的虚拟机的 pod 将被匹配。
  2. 创建 node-exporter 服务:

    $ oc create -f node-exporter-service.yaml

14.3.4.2. 配置使用节点 exporter 服务的虚拟机

node-exporter 文件下载到虚拟机。然后,创建一个在虚拟机引导时运行 node-exporter 服务的 systemd 服务。

先决条件

  • 该组件的 Pod 在 openshift-user-workload-monitoring 项目中运行。
  • 向需要监控此用户定义的项目的用户授予 monitoring-edit 角色。

流程

  1. 登录虚拟机。
  2. 使用应用到 node-exporter 文件的目录的路径,将 node-exporter 文件下载到虚拟机。

    $ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
  3. 提取可执行文件并将其放置在 /usr/bin 目录中。

    $ sudo tar xvf node_exporter-1.3.1.linux-amd64.tar.gz \
        --directory /usr/bin --strip 1 "*/node_exporter"
  4. 在此目录路径中创建 node_exporter.service 文件: /etc/systemd/system。此 systemd 服务文件在虚拟机重启时运行 node-exporter 服务。

    [Unit]
    Description=Prometheus Metrics Exporter
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    Restart=always
    RestartSec=1
    User=root
    ExecStart=/usr/bin/node_exporter
    
    [Install]
    WantedBy=multi-user.target
  5. 启用并启动 systemd 服务。

    $ sudo systemctl enable node_exporter.service
    $ sudo systemctl start node_exporter.service

验证

  • 验证 node-exporter 代理是否已报告虚拟机的指标。

    $ curl http://localhost:9100/metrics

    输出示例

    go_gc_duration_seconds{quantile="0"} 1.5244e-05
    go_gc_duration_seconds{quantile="0.25"} 3.0449e-05
    go_gc_duration_seconds{quantile="0.5"} 3.7913e-05

14.3.4.3. 为虚拟机创建自定义监控标签

要启用来自单个服务的多个虚拟机的查询,请在虚拟机的 YAML 文件中添加自定义标签。

先决条件

  • 安装 OpenShift Container Platform CLI oc
  • 以具有 cluster-admin 特权的用户身份登录。
  • 访问 web 控制台以停止和重启虚拟机。

流程

  1. 编辑虚拟机配置文件的模板 spec。在本例中,标签 monitor 具有值 metrics

    spec:
      template:
        metadata:
          labels:
            monitor: metrics
  2. 停止并重启虚拟机,以创建具有与 monitor 标签给定标签名称的新 pod。
14.3.4.3.1. 查询 node-exporter 服务以获取指标

指标通过 /metrics 规范名称下的 HTTP 服务端点公开。当您查询指标时,Prometheus 会直接从虚拟机公开的指标端点中提取指标,并展示这些指标来查看。

先决条件

  • 您可以使用具有 cluster-admin 特权或 monitoring-edit 角色的用户访问集群。
  • 您已通过配置 node-exporter 服务为用户定义的项目启用了监控。

流程

  1. 通过为服务指定命名空间来获取 HTTP 服务端点:

    $ oc get service -n <namespace> <node-exporter-service>
  2. 要列出 node-exporter 服务的所有可用指标,请查询 metrics 资源。

    $ curl http://<172.30.226.162:9100>/metrics | grep -vE "^#|^$"

    输出示例

    node_arp_entries{device="eth0"} 1
    node_boot_time_seconds 1.643153218e+09
    node_context_switches_total 4.4938158e+07
    node_cooling_device_cur_state{name="0",type="Processor"} 0
    node_cooling_device_max_state{name="0",type="Processor"} 0
    node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
    node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
    node_cpu_seconds_total{cpu="0",mode="idle"} 1.10586485e+06
    node_cpu_seconds_total{cpu="0",mode="iowait"} 37.61
    node_cpu_seconds_total{cpu="0",mode="irq"} 233.91
    node_cpu_seconds_total{cpu="0",mode="nice"} 551.47
    node_cpu_seconds_total{cpu="0",mode="softirq"} 87.3
    node_cpu_seconds_total{cpu="0",mode="steal"} 86.12
    node_cpu_seconds_total{cpu="0",mode="system"} 464.15
    node_cpu_seconds_total{cpu="0",mode="user"} 1075.2
    node_disk_discard_time_seconds_total{device="vda"} 0
    node_disk_discard_time_seconds_total{device="vdb"} 0
    node_disk_discarded_sectors_total{device="vda"} 0
    node_disk_discarded_sectors_total{device="vdb"} 0
    node_disk_discards_completed_total{device="vda"} 0
    node_disk_discards_completed_total{device="vdb"} 0
    node_disk_discards_merged_total{device="vda"} 0
    node_disk_discards_merged_total{device="vdb"} 0
    node_disk_info{device="vda",major="252",minor="0"} 1
    node_disk_info{device="vdb",major="252",minor="16"} 1
    node_disk_io_now{device="vda"} 0
    node_disk_io_now{device="vdb"} 0
    node_disk_io_time_seconds_total{device="vda"} 174
    node_disk_io_time_seconds_total{device="vdb"} 0.054
    node_disk_io_time_weighted_seconds_total{device="vda"} 259.79200000000003
    node_disk_io_time_weighted_seconds_total{device="vdb"} 0.039
    node_disk_read_bytes_total{device="vda"} 3.71867136e+08
    node_disk_read_bytes_total{device="vdb"} 366592
    node_disk_read_time_seconds_total{device="vda"} 19.128
    node_disk_read_time_seconds_total{device="vdb"} 0.039
    node_disk_reads_completed_total{device="vda"} 5619
    node_disk_reads_completed_total{device="vdb"} 96
    node_disk_reads_merged_total{device="vda"} 5
    node_disk_reads_merged_total{device="vdb"} 0
    node_disk_write_time_seconds_total{device="vda"} 240.66400000000002
    node_disk_write_time_seconds_total{device="vdb"} 0
    node_disk_writes_completed_total{device="vda"} 71584
    node_disk_writes_completed_total{device="vdb"} 0
    node_disk_writes_merged_total{device="vda"} 19761
    node_disk_writes_merged_total{device="vdb"} 0
    node_disk_written_bytes_total{device="vda"} 2.007924224e+09
    node_disk_written_bytes_total{device="vdb"} 0

14.3.4.4. 为节点 exporter 服务创建 ServiceMonitor 资源

您可以使用 Prometheus 客户端库和从 /metrics 端点中提取指标来访问和查看 node-exporter 服务公开的指标。使用 ServiceMonitor 自定义资源定义(CRD)来监控节点 exporter 服务。

先决条件

  • 您可以使用具有 cluster-admin 特权或 monitoring-edit 角色的用户访问集群。
  • 您已通过配置 node-exporter 服务为用户定义的项目启用了监控。

流程

  1. ServiceMonitor 资源配置创建一个 YAML 文件。在本例中,服务监控器与带有标签 metrics 的任意服务匹配,每 30 秒对 exmet 端口进行查询。

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        k8s-app: node-exporter-metrics-monitor
      name: node-exporter-metrics-monitor 1
      namespace: dynamation 2
    spec:
      endpoints:
      - interval: 30s 3
        port: exmet 4
        scheme: http
      selector:
        matchLabels:
          servicetype: metrics
    1
    ServiceMonitor 的名称。
    2
    创建 ServiceMonitor 的命名空间。
    3
    要查询端口的时间间隔。
    4
    每 30 秒查询的端口名称
  2. 为 node-exporter 服务创建 ServiceMonitor 配置。

    $ oc create -f node-exporter-metrics-monitor.yaml
14.3.4.4.1. 访问集群外的节点导出服务

您可以访问集群外的 node-exporter 服务,并查看公开的指标。

先决条件

  • 您可以使用具有 cluster-admin 特权或 monitoring-edit 角色的用户访问集群。
  • 您已通过配置 node-exporter 服务为用户定义的项目启用了监控。

流程

  1. 公开 node-exporter 服务。

    $ oc expose service -n <namespace> <node_exporter_service_name>
  2. 获取路由的 FQDN(全限定域名)。

    $ oc get route -o=custom-columns=NAME:.metadata.name,DNS:.spec.host

    输出示例

    NAME                    DNS
    node-exporter-service   node-exporter-service-dynamation.apps.cluster.example.org

  3. 使用 curl 命令显示 node-exporter 服务的指标。

    $ curl -s http://node-exporter-service-dynamation.apps.cluster.example.org/metrics

    输出示例

    go_gc_duration_seconds{quantile="0"} 1.5382e-05
    go_gc_duration_seconds{quantile="0.25"} 3.1163e-05
    go_gc_duration_seconds{quantile="0.5"} 3.8546e-05
    go_gc_duration_seconds{quantile="0.75"} 4.9139e-05
    go_gc_duration_seconds{quantile="1"} 0.000189423

14.3.4.5. 其他资源

14.3.5. 虚拟机健康检查

您可以通过在 VirtualMachine 资源中定义就绪度和存活度探测来配置虚拟机 (VM) 健康检查。

14.3.5.1. 关于就绪度和存活度探测

使用就绪度和存活度探测来检测和处理不健康的虚拟机 (VM)。您可以在虚拟机规格中包含一个或多个探测,以确保流量无法访问未就绪的虚拟机,并在虚拟机变得无响应时创建新虚拟机。

就绪度探测决定 VMI 是否准备好接受服务请求。如果探测失败,则 VMI 会从可用端点列表中移除,直到 VMI 就绪为止。

存活度探测决定 VMI 是否响应。如果探测失败,则会删除虚拟机并创建一个新的虚拟机来恢复响应性。

您可以通过设置 VirtualMachine 对象的 spec.readinessProbespec.livenessProbe 字段来配置就绪度和存活度探测。这些字段支持以下测试:

HTTP GET
该探测使用 Web hook 确定 VMI 的健康状况。如果 HTTP 响应代码介于 200 和 399 之间,则测试成功。您可以将 HTTP GET 测试用于在完全初始化时返回 HTTP 状态代码的应用程序。
TCP 套接字
该探测尝试为 VMI 打开一个套接字。只有在探测可以建立连接时,VMI 才被视为健康。对于在初始化完成前不会开始监听的应用程序,可以使用 TCP 套接字测试。
客户机代理 ping
该探测使用 guest-ping 命令来确定 QEMU 客户机代理是否在虚拟机上运行。
14.3.5.1.1. 定义 HTTP 就绪度探测

通过设置虚拟机配置的 spec.readinessProbe.httpGet 字段来定义 HTTP 就绪度探测。

流程

  1. 在虚拟机配置文件中包括就绪度探测的详细信息。

    使用 HTTP GET 测试就绪度探测示例

    # ...
    spec:
      readinessProbe:
        httpGet: 1
          port: 1500 2
          path: /healthz 3
          httpHeaders:
          - name: Custom-Header
            value: Awesome
        initialDelaySeconds: 120 4
        periodSeconds: 20 5
        timeoutSeconds: 10 6
        failureThreshold: 3 7
        successThreshold: 3 8
    # ...

    1
    执行的 HTTP GET 请求以连接 VM。
    2
    探测查询的虚拟机端口。在上例中,探测查询端口 1500。
    3
    在 HTTP 服务器上访问的路径。在上例中,如果服务器的 /healthz 路径的处理程序返回成功代码,则 VMI 被视为健康。如果处理程序返回失败代码,则虚拟机将从可用端点列表中移除。
    4
    虚拟机启动就绪度探测前的时间(以秒为单位)。
    5
    执行探测之间的延迟(以秒为单位)。默认延迟为 10 秒。这个值必须大于 timeoutSeconds
    6
    在不活跃的时间(以秒为单位)超过这个值时探测会超时,且假定 VM 失败。默认值为 1。这个值必须小于 periodSeconds
    7
    探测允许失败的次数。默认值为 3。在进行了指定数量的尝试后,pod 被标记为 Unready
    8
    在失败后,在探测报告成功的次数达到这个值时才能被视为成功。默认值为 1。
  2. 运行以下命令来创建虚拟机:

    $ oc create -f <file_name>.yaml
14.3.5.1.2. 定义 TCP 就绪度探测

通过设置虚拟机 (VM) 配置的 spec.readinessProbe.tcpSocket 字段来定义 TCP 就绪度探测。

流程

  1. 在虚拟机配置文件中包括 TCP 就绪度探测的详细信息。

    使用 TCP 套接字测试的就绪度探测示例

    # ...
    spec:
      readinessProbe:
        initialDelaySeconds: 120 1
        periodSeconds: 20 2
        tcpSocket: 3
          port: 1500 4
        timeoutSeconds: 10 5
    # ...

    1
    虚拟机启动就绪度探测前的时间(以秒为单位)。
    2
    执行探测之间的延迟(以秒为单位)。默认延迟为 10 秒。这个值必须大于 timeoutSeconds
    3
    要执行的 TCP 操作。
    4
    探测查询的虚拟机端口。
    5
    在不活跃的时间(以秒为单位)超过这个值时探测会超时,且假定 VM 失败。默认值为 1。这个值必须小于 periodSeconds
  2. 运行以下命令来创建虚拟机:

    $ oc create -f <file_name>.yaml
14.3.5.1.3. 定义 HTTP 存活度探测

通过设置虚拟机 (VM) 配置的 spec.livenessProbe.httpGet 字段来定义 HTTP 存活度探测。您可以按照与就绪度探测相同的方式为存活度探测定义 HTTP 和 TCP 测试。此流程使用 HTTP GET 测试配置示例存活度探测。

流程

  1. 在虚拟机配置文件中包括 HTTP 存活度探测的详细信息。

    使用 HTTP GET 测试的存活度探测示例

    # ...
    spec:
      livenessProbe:
        initialDelaySeconds: 120 1
        periodSeconds: 20 2
        httpGet: 3
          port: 1500 4
          path: /healthz 5
          httpHeaders:
          - name: Custom-Header
            value: Awesome
        timeoutSeconds: 10 6
    # ...

    1
    虚拟机启动存活度探测前的时间(以秒为单位)。
    2
    执行探测之间的延迟(以秒为单位)。默认延迟为 10 秒。这个值必须大于 timeoutSeconds
    3
    执行的 HTTP GET 请求以连接 VM。
    4
    探测查询的虚拟机端口。在上例中,探测查询端口 1500。VM 通过 cloud-init 在端口 1500 上安装并运行最小 HTTP 服务器。
    5
    在 HTTP 服务器上访问的路径。在上例中,如果服务器的 /healthz 路径的处理程序返回成功代码,则 VMI 被视为健康。如果处理程序返回失败代码,则会删除虚拟机并创建新虚拟机。
    6
    在不活跃的时间(以秒为单位)超过这个值时探测会超时,且假定 VM 失败。默认值为 1。这个值必须小于 periodSeconds
  2. 运行以下命令来创建虚拟机:

    $ oc create -f <file_name>.yaml

14.3.5.2. 定义 watchdog

您可以通过执行以下步骤来定义 watchdog 来监控客户端操作系统的健康状态:

  1. 为虚拟机配置 watchdog 设备。
  2. 在客户机上安装 watchdog 代理。

watchdog 设备监控代理,并在客户机操作系统不响应时执行以下操作之一:

  • poweroff :虚拟机立即关闭。如果 spec.running 设为 truespec.runStrategy 没有设置为 manual,则虚拟机将重启。
  • reset :虚拟机重新启动,客户机操作系统无法响应。

    注意

    重启时间可能会导致存活度探测超时。如果集群级别的保护检测到失败的存活度探测,则虚拟机可能会被强制重新调度,从而增加重启时间。

  • shutdown :通过停止所有服务来正常关闭虚拟机。
注意

watchdog 不适用于 Windows 虚拟机。

14.3.5.2.1. 为虚拟机配置 watchdog 设备

您可以为虚拟机配置 watchdog 设备。

先决条件

  • 虚拟机必须具有对 i6300esb watchdog 设备的内核支持。Red Hat Enterprise Linux (RHEL) 镜像支持 i6300esb

流程

  1. 创建包含以下内容的 YAML 文件:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm2-rhel84-watchdog
      name: <vm-name>
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm2-rhel84-watchdog
        spec:
          domain:
            devices:
              watchdog:
                name: <watchdog>
                i6300esb:
                  action: "poweroff" 1
    # ...
    1
    指定 poweroff, reset, 或 shutdown.

    上面的示例使用 poweroff 操作配置 RHEL8 虚拟机上的 i6300esb watchdog 设备,并将设备公开为 /dev/watchdog

    现在,watchdog 二进制文件可以使用这个设备。

  2. 运行以下命令,将 YAML 文件应用到集群:

    $ oc apply -f <file_name>.yaml
重要

此流程仅用于测试 watchdog 功能,且不得在生产环境中运行。

  1. 运行以下命令来验证虚拟机是否已连接到 watchdog 设备:

    $ lspci | grep watchdog -i
  2. 运行以下命令之一以确认 watchdog 处于活跃状态:

    • 触发内核 panic:

      # echo c > /proc/sysrq-trigger
    • 停止 watchdog 服务:

      # pkill -9 watchdog
14.3.5.2.2. 在客户机上安装 watchdog 代理

您可以在客户机上安装 watchdog 代理并启动 watchdog 服务。

流程

  1. 以 root 用户身份登录虚拟机。
  2. 安装 watchdog 软件包及其依赖项:

    # yum install watchdog
  3. /etc/watchdog.conf 文件中取消注释以下行并保存更改:

    #watchdog-device = /dev/watchdog
  4. 在引导时启用 watchdog 服务:

    # systemctl enable --now watchdog.service

14.3.5.3. 定义客户机代理 ping 探测

通过设置虚拟机 (VM) 配置的 spec.readinessProbe.guestAgentPing 字段来定义客户机代理 ping 探测。

重要

客户机代理 ping 探测只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

先决条件

  • 必须在虚拟机上安装并启用 QEMU 客户机代理。

流程

  1. 在虚拟机配置文件中包括客户机代理 ping 探测的详情。例如:

    客户机代理 ping 探测示例

    # ...
    spec:
      readinessProbe:
        guestAgentPing: {} 1
        initialDelaySeconds: 120 2
        periodSeconds: 20 3
        timeoutSeconds: 10 4
        failureThreshold: 3 5
        successThreshold: 3 6
    # ...

    1
    客户机代理 ping 探测以连接到虚拟机。
    2
    可选: VM 启动客户机代理探测前的时间(以秒为单位)。
    3
    可选:执行探测之间的延迟(以秒为单位)。默认延迟为 10 秒。这个值必须大于 timeoutSeconds
    4
    可选:在不活跃的时间(以秒为单位)超过这个值时探测会超时,且假定 VM 失败。默认值为 1。这个值必须小于 periodSeconds
    5
    可选:探测允许失败的次数。默认值为 3。在进行了指定数量的尝试后,pod 被标记为 Unready
    6
    可选:探测在失败后必须报告成功的次数,才被视为成功。默认值为 1。
  2. 运行以下命令来创建虚拟机:

    $ oc create -f <file_name>.yaml

14.3.5.4. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.