×

关于就绪探针和存活探针

使用就绪探针和存活探针来检测和处理不健康的虚拟机 (VM)。您可以在 VM 的规范中包含一个或多个探针,以确保流量不会到达尚未准备好接收流量的 VM,并在 VM 变得无响应时创建一个新的 VM。

就绪探针确定 VM 是否已准备好接受服务请求。如果探针失败,则 VM 将从可用端点列表中移除,直到 VM 准备好为止。

存活探针确定 VM 是否有响应。如果探针失败,则会删除 VM 并创建一个新的 VM 来恢复响应。

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

HTTP GET

探针使用 Webhook 确定 VM 的健康状况。如果 HTTP 响应代码在 200 到 399 之间,则测试成功。对于在完全初始化后返回 HTTP 状态码的应用程序,您可以使用 HTTP GET 测试。

TCP 套接字

探针尝试打开到 VM 的套接字。只有当探针能够建立连接时,VM 才被认为是健康的。对于直到初始化完成才开始侦听的应用程序,您可以使用 TCP 套接字测试。

客户机代理 ping

探针使用guest-ping命令来确定 QEMU 客户机代理是否在虚拟机上运行。

定义 HTTP 就绪探针

通过设置虚拟机 (VM) 配置的spec.readinessProbe.httpGet字段来定义 HTTP 就绪探针。

步骤
  1. 在 VM 配置文件中包含就绪探针的详细信息。

    使用 HTTP GET 测试的示例就绪探针
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      annotations:
      name: fedora-vm
      namespace: example-namespace
    # ...
    spec:
      template:
        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 要执行以连接到 VM 的 HTTP GET 请求。
    2 探针查询的 VM 端口。在上面的示例中,探针查询端口 1500。
    3 要在 HTTP 服务器上访问的路径。在上面的示例中,如果服务器的 /healthz 路径的处理程序返回成功代码,则 VM 被认为是健康的。如果处理程序返回失败代码,则 VM 将从可用端点列表中移除。
    4 VM 启动后启动就绪探针之前的秒数。
    5 执行探针之间的延迟(秒)。默认延迟为 10 秒。此值必须大于timeoutSeconds
    6 探针超时且 VM 被认为已失败之前的非活动秒数。默认值为 1。此值必须小于periodSeconds
    7 允许探针失败的次数。默认为 3。在指定的尝试次数后,pod 将被标记为Unready
    8 在失败后,探针必须报告成功的次数才能被认为成功。默认为 1。
  2. 运行以下命令创建 VM:

    $ oc create -f <file_name>.yaml

定义 TCP 就绪探针

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

步骤
  1. 在 VM 配置文件中包含 TCP 就绪探针的详细信息。

    使用 TCP 套接字测试的示例就绪探针
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      annotations:
      name: fedora-vm
      namespace: example-namespace
    # ...
    spec:
      template:
        spec:
          readinessProbe:
            initialDelaySeconds: 120 (1)
            periodSeconds: 20 (2)
            tcpSocket: (3)
              port: 1500 (4)
            timeoutSeconds: 10 (5)
    # ...
    1 VM 启动后启动就绪探针之前的秒数。
    2 执行探针之间的延迟(秒)。默认延迟为 10 秒。此值必须大于timeoutSeconds
    3 要执行的 TCP 操作。
    4 探针查询的 VM 端口。
    5 探针超时且 VM 被认为已失败之前的非活动秒数。默认值为 1。此值必须小于periodSeconds
  2. 运行以下命令创建 VM:

    $ oc create -f <file_name>.yaml

定义 HTTP 存活探针

通过设置虚拟机 (VM) 配置的spec.livenessProbe.httpGet字段来定义 HTTP 存活探针。您可以像就绪探针一样定义 HTTP 和 TCP 测试作为存活探针。此步骤配置使用 HTTP GET 测试的示例存活探针。

步骤
  1. 在 VM 配置文件中包含 HTTP 存活探针的详细信息。

    使用 HTTP GET 测试的示例存活探针
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      annotations:
      name: fedora-vm
      namespace: example-namespace
    # ...
    spec:
      template:
        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 VM 启动后启动存活探针之前的秒数。
    2 执行探针之间的延迟(秒)。默认延迟为 10 秒。此值必须大于timeoutSeconds
    3 要执行以连接到 VM 的 HTTP GET 请求。
    4 探针查询的 VM 端口。在上面的示例中,探针查询端口 1500。VM 通过 cloud-init 在端口 1500 上安装并运行一个最小的 HTTP 服务器。
    5 要在 HTTP 服务器上访问的路径。在上面的示例中,如果服务器的/healthz路径的处理程序返回成功代码,则 VM 被认为是健康的。如果处理程序返回失败代码,则会删除 VM 并创建一个新的 VM。
    6 探针超时且 VM 被认为已失败之前的非活动秒数。默认值为 1。此值必须小于periodSeconds
  2. 运行以下命令创建 VM:

    $ oc create -f <file_name>.yaml

定义看门狗

您可以通过执行以下步骤来定义看门狗以监控客户机操作系统的运行状况:

  1. 为虚拟机 (VM) 配置看门狗设备。

  2. 在客户机上安装看门狗代理。

如果客户机操作系统无响应,看门狗设备将监控代理并执行以下操作之一:

  • poweroff:VM 立即关闭电源。如果spec.running设置为truespec.runStrategy未设置为manual,则 VM 将重新启动。

  • reset:VM 原地重新启动,客户机操作系统无法响应。

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

  • shutdown:VM 通过停止所有服务来优雅地关闭电源。

Windows VM 不支持看门狗。

为虚拟机配置看门狗设备

您可以为虚拟机 (VM) 配置看门狗设备。

先决条件
  • VM 必须具有对i6300esb看门狗设备的内核支持。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 指定poweroffresetshutdown

    以上示例在RHEL8虚拟机上配置i6300esb看门狗设备,执行poweroff操作,并将设备公开为/dev/watchdog

    看门狗二进制文件现在可以使用此设备。

  2. 运行以下命令将YAML文件应用于您的集群

    $ oc apply -f <file_name>.yaml
验证

此过程仅用于测试看门狗功能,不得在生产机器上运行。

  1. 运行以下命令以验证虚拟机是否已连接到看门狗设备

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

    • 触发内核恐慌

      # echo c > /proc/sysrq-trigger
    • 停止看门狗服务

      # pkill -9 watchdog

在虚拟机上安装看门狗代理

您需要在虚拟机上安装看门狗代理并启动watchdog服务。

步骤
  1. 以root用户身份登录虚拟机。

  2. 安装watchdog包及其依赖项

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

    #watchdog-device = /dev/watchdog
  4. 启用watchdog服务以便在启动时启动

    # systemctl enable --now watchdog.service