×

在软件系统中,组件可能会由于瞬态问题(例如临时连接丢失、配置错误或外部依赖项问题)而变得不健康。OpenShift Dedicated 应用程序有多种选项可用于检测和处理不健康的容器。

理解健康检查

健康检查会定期使用就绪性、存活性以及启动健康检查的任意组合对正在运行的容器执行诊断。

您可以在包含要执行健康检查的容器的 Pod 的规范中包含一个或多个探针。

如果要向现有 Pod 添加或编辑健康检查,则必须编辑 Pod 的 `DeploymentConfig` 对象或使用 Web 控制台中的**开发者**视角。您不能使用 CLI 向现有 Pod 添加或编辑健康检查。

就绪性探针

就绪性探针确定容器是否已准备好接受服务请求。如果容器的就绪性探针失败,则 kubelet 会将 Pod 从可用服务端点列表中移除。

失败后,探针将继续检查 Pod。如果 Pod 变为可用,则 kubelet 会将 Pod 添加到可用服务端点列表。

存活性健康检查

存活性探针确定容器是否仍在运行。如果存活性探针由于死锁等情况而失败,则 kubelet 会终止容器。然后,Pod 会根据其重启策略做出响应。

例如,具有 `restartPolicy` 为 `Always` 或 `OnFailure` 的 Pod 上的存活性探针会终止并重启容器。

启动探针

启动探针指示容器内的应用程序是否已启动。在启动成功之前,所有其他探针都将被禁用。如果启动探针在指定的时间段内未成功,则 kubelet 会终止容器,并且容器将受 Pod 的 `restartPolicy` 约束。

某些应用程序在其第一次初始化时可能需要额外的启动时间。您可以将启动探针与存活性或就绪性探针一起使用,以使用 `failureThreshold` 和 `periodSeconds` 参数将该探针延迟足够长的时间以处理冗长的启动时间。

例如,您可以向存活性探针添加一个启动探针,其 `failureThreshold` 为 30 次失败,`periodSeconds` 为 10 秒(30 * 10 秒 = 300 秒),最多 5 分钟。启动探针第一次成功后,存活性探针将接管。

您可以使用以下任何类型的测试配置存活性、就绪性和启动探针

  • HTTP `GET`:使用 HTTP `GET` 测试时,测试会使用 Webhook 来确定容器的健康状况。如果 HTTP 响应代码介于 `200` 和 `399` 之间,则测试成功。

    您可以将 HTTP `GET` 测试与在完全初始化时返回 HTTP 状态码的应用程序一起使用。

  • 容器命令:使用容器命令测试时,探针会在容器内执行命令。如果测试以 `0` 状态退出,则探针成功。

  • TCP 套接字:使用 TCP 套接字测试时,探针会尝试打开到容器的套接字。只有在探针能够建立连接时,容器才被认为是健康的。您可以将 TCP 套接字测试与直到初始化完成才开始侦听的应用程序一起使用。

您可以配置多个字段来控制探针的行为

  • `initialDelaySeconds`:容器启动后探针可以被调度的秒数。默认为 0。

  • `periodSeconds`:执行探针之间的延迟(秒)。默认为 `10`。此值必须大于 `timeoutSeconds`。

  • `timeoutSeconds`:探针超时且容器被认为已失败之前的非活动秒数。默认为 `1`。此值必须小于 `periodSeconds`。

  • `successThreshold`:探针在失败后必须报告成功的次数才能将容器状态重置为成功。对于存活性探针,该值必须为 `1`。默认为 `1`。

  • `failureThreshold`:允许探针失败的次数。默认为 3。在指定的尝试次数后

    • 对于存活性探针,容器将重启

    • 对于就绪性探针,Pod 将被标记为 `Unready`

    • 对于启动探针,容器将被终止,并受 Pod 的 `restartPolicy` 约束

探针示例

以下是不同探针在对象规范中的示例。

Pod 规范中带有容器命令就绪性探针的就绪性探针示例
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: health-check
  name: my-application
# ...
spec:
  containers:
  - name: goproxy-app (1)
    args:
    image: registry.k8s.io/goproxy:0.1 (2)
    readinessProbe: (3)
      exec: (4)
        command: (5)
        - cat
        - /tmp/healthy
# ...
1 容器名称。
2 要部署的容器镜像。
3 就绪性探针。
4 容器命令测试。
5 要在容器上执行的命令。
Pod规范中使用容器命令测试的示例容器命令启动探针和存活探针
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: health-check
  name: my-application
# ...
spec:
  containers:
  - name: goproxy-app (1)
    args:
    image: registry.k8s.io/goproxy:0.1 (2)
    livenessProbe: (3)
      httpGet: (4)
        scheme: HTTPS (5)
        path: /healthz
        port: 8080 (6)
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
    startupProbe: (7)
      httpGet: (8)
        path: /healthz
        port: 8080 (9)
      failureThreshold: 30 (10)
      periodSeconds: 10 (11)
# ...
1 容器名称。
2 指定要部署的容器镜像。
3 存活探针。
4 HTTP `GET` 测试。
5 网络方案:`HTTP` 或 `HTTPS`。默认值为 `HTTP`。
6 容器监听的端口。
7 启动探针。
8 HTTP `GET` 测试。
9 容器监听的端口。
10 失败后尝试探针的次数。
11 执行探针的秒数。
Pod规范中使用超时时间的容器命令测试的示例存活探针
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: health-check
  name: my-application
# ...
spec:
  containers:
  - name: goproxy-app (1)
    args:
    image: registry.k8s.io/goproxy:0.1 (2)
    livenessProbe: (3)
      exec: (4)
        command: (5)
        - /bin/bash
        - '-c'
        - timeout 60 /opt/eap/bin/livenessProbe.sh
      periodSeconds: 10 (6)
      successThreshold: 1 (7)
      failureThreshold: 3 (8)
# ...
1 容器名称。
2 指定要部署的容器镜像。
3 存活探针。
4 探针类型,此处为容器命令探针。
5 在容器内执行的命令行。
6 以秒为单位执行探针的频率。
7 失败后需要连续成功的次数才能显示成功。
8 失败后尝试探针的次数。
部署中使用TCP套接字测试的示例就绪探针和存活探针
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    test: health-check
  name: my-application
spec:
# ...
  template:
    spec:
      containers:
        - resources: {}
          readinessProbe: (1)
            tcpSocket:
              port: 8080
            timeoutSeconds: 1
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: ruby-ex
          livenessProbe: (2)
            tcpSocket:
              port: 8080
            initialDelaySeconds: 15
            timeoutSeconds: 1
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
# ...
1 就绪探针。
2 存活探针。

使用CLI配置健康检查

要配置就绪、存活和启动探针,请向包含要执行健康检查的容器的Pod规范中添加一个或多个探针。

如果要向现有 Pod 添加或编辑健康检查,则必须编辑 Pod 的 `DeploymentConfig` 对象或使用 Web 控制台中的**开发者**视角。您不能使用 CLI 向现有 Pod 添加或编辑健康检查。

步骤

为容器添加探针

  1. 创建一个`Pod`对象以添加一个或多个探针。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: health-check
      name: my-application
    spec:
      containers:
      - name: my-container (1)
        args:
        image: registry.k8s.io/goproxy:0.1 (2)
        livenessProbe: (3)
          tcpSocket:  (4)
            port: 8080 (5)
          initialDelaySeconds: 15 (6)
          periodSeconds: 20 (7)
          timeoutSeconds: 10 (8)
        readinessProbe: (9)
          httpGet: (10)
            host: my-host (11)
            scheme: HTTPS (12)
            path: /healthz
            port: 8080 (13)
        startupProbe: (14)
          exec: (15)
            command: (16)
            - cat
            - /tmp/healthy
          failureThreshold: 30 (17)
          periodSeconds: 20 (18)
          timeoutSeconds: 10 (19)
    1 指定容器名称。
    2 指定要部署的容器镜像。
    3 可选:创建存活探针。
    4 指定要执行的测试,此处为TCP套接字测试。
    5 指定容器监听的端口。
    6 指定容器启动后探针可以被调度的秒数。
    7 指定执行探针的秒数。默认为`10`。此值必须大于`timeoutSeconds`。
    8 指定探针被认为失败之前的无活动秒数。默认为`1`。此值必须小于`periodSeconds`。
    9 可选:创建就绪探针。
    10 指定要执行的测试类型,此处为HTTP测试。
    11 指定主机IP地址。未定义`host`时,使用`PodIP`。
    12 指定`HTTP`或`HTTPS`。未定义`scheme`时,使用`HTTP`方案。
    13 指定容器监听的端口。
    14 可选:创建启动探针。
    15 指定要执行的测试类型,此处为容器执行探针。
    16 指定要在容器上执行的命令。
    17 指定失败后尝试探针的次数。
    18 指定执行探针的秒数。默认为`10`。此值必须大于`timeoutSeconds`。
    19 指定探针被认为失败之前的无活动秒数。默认为`1`。此值必须小于`periodSeconds`。

    如果`initialDelaySeconds`值小于`periodSeconds`值,则由于计时器问题,第一个就绪探针将在两个周期之间的某个时间点发生。

    `timeoutSeconds`值必须小于`periodSeconds`值。

  2. 创建`Pod`对象

    $ oc create -f <file-name>.yaml
  3. 验证健康检查Pod的状态

    $ oc describe pod my-application
    示例输出
    Events:
      Type    Reason     Age   From                                  Message
      ----    ------     ----  ----                                  -------
      Normal  Scheduled  9s    default-scheduler                     Successfully assigned openshift-logging/liveness-exec to ip-10-0-143-40.ec2.internal
      Normal  Pulling    2s    kubelet, ip-10-0-143-40.ec2.internal  pulling image "registry.k8s.io/liveness"
      Normal  Pulled     1s    kubelet, ip-10-0-143-40.ec2.internal  Successfully pulled image "registry.k8s.io/liveness"
      Normal  Created    1s    kubelet, ip-10-0-143-40.ec2.internal  Created container
      Normal  Started    1s    kubelet, ip-10-0-143-40.ec2.internal  Started container

    以下是导致容器重启的失败探针的输出

    带有不健康容器的示例存活检查输出
    $ oc describe pod pod1
    示例输出
    ....
    
    Events:
      Type     Reason          Age                From                                               Message
      ----     ------          ----               ----                                               -------
      Normal   Scheduled       <unknown>                                                             Successfully assigned aaa/liveness-http to ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj
      Normal   AddedInterface  47s                multus                                             Add eth0 [10.129.2.11/23]
      Normal   Pulled          46s                kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Successfully pulled image "registry.k8s.io/liveness" in 773.406244ms
      Normal   Pulled          28s                kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Successfully pulled image "registry.k8s.io/liveness" in 233.328564ms
      Normal   Created         10s (x3 over 46s)  kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Created container liveness
      Normal   Started         10s (x3 over 46s)  kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Started container liveness
      Warning  Unhealthy       10s (x6 over 34s)  kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Liveness probe failed: HTTP probe failed with statuscode: 500
      Normal   Killing         10s (x2 over 28s)  kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Container liveness failed liveness probe, will be restarted
      Normal   Pulling         10s (x3 over 47s)  kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Pulling image "registry.k8s.io/liveness"
      Normal   Pulled          10s                kubelet, ci-ln-37hz77b-f76d1-wdpjv-worker-b-snzrj  Successfully pulled image "registry.k8s.io/liveness" in 244.116568ms

使用开发人员视角监控应用程序健康状况

您可以使用**开发人员**视角为您的容器添加三种类型的健康探针,以确保您的应用程序处于健康状态。

  • 使用就绪探针检查容器是否已准备好处理请求。

  • 使用存活探针检查容器是否正在运行。

  • 使用启动探针检查容器中的应用程序是否已启动。

您可以在创建和部署应用程序时或应用程序部署后添加健康检查。

使用开发人员视角添加健康检查

您可以使用**拓扑**视图向已部署的应用程序添加健康检查。

前提条件
  • 您已在Web控制台中切换到**开发人员**视角。

  • 您已使用**开发人员**视角在OpenShift Dedicated上创建并部署了一个应用程序。

步骤
  1. 在**拓扑**视图中,单击应用程序节点以查看侧面板。如果容器未添加健康检查,则会显示带有添加健康检查链接的**健康检查**通知。

  2. 在显示的通知中,单击**添加健康检查**链接。

  3. 或者,您也可以单击**操作**列表并选择**添加健康检查**。请注意,如果容器已具有健康检查,则会看到**编辑健康检查**选项,而不是添加选项。

  4. 在**添加健康检查**表单中,如果您部署了多个容器,请使用**容器**列表确保选择了相应的容器。

  5. 单击所需的健康探针链接以将其添加到容器中。健康检查的默认数据已预先填充。您可以使用默认数据添加探针,也可以进一步自定义值,然后添加它们。例如,要添加一个检查容器是否已准备好处理请求的就绪探针

    1. 单击**添加就绪探针**,将看到包含探针参数的表单。

    2. 单击**类型**列表以选择要添加的请求类型。例如,在此情况下,选择**容器命令**以选择将在容器内执行的命令。

    3. 在**命令**字段中,添加参数`cat`,类似地,您可以为检查添加多个参数,例如,添加另一个参数`/tmp/healthy`。

    4. 根据需要保留或修改其他参数的默认值。

      `超时`值必须小于`周期`值。`超时`默认值为`1`。`周期`默认值为`10`。

    5. 单击表单底部的复选标记。将显示**已添加就绪探针**消息。

  6. 单击**添加**以添加健康检查。您将被重定向到**拓扑**视图,并且容器将被重启。

  7. 在侧面板中,通过单击**Pod**部分下的已部署Pod来验证是否已添加探针。

  8. 在**Pod详细信息**页面中,单击**容器**部分中列出的容器。

  9. 在**容器详细信息**页面中,验证是否已将就绪探针 - **Exec 命令** `cat` `/tmp/healthy`添加到容器中。

使用开发人员视角编辑健康检查

您可以使用**拓扑**视图编辑添加到应用程序的健康检查、修改它们或添加更多健康检查。

前提条件
  • 您已在Web控制台中切换到**开发人员**视角。

  • 您已使用**开发人员**视角在OpenShift Dedicated上创建并部署了一个应用程序。

  • 您已向您的应用程序添加了健康检查。

步骤
  1. 在**拓扑**视图中,右键单击您的应用程序并选择**编辑健康检查**。或者,在侧面板中,单击**操作**下拉列表并选择**编辑健康检查**。

  2. 在**编辑健康检查**页面中

    • 要删除先前添加的健康探针,请单击其旁边的**删除**图标。

    • 要编辑现有探针的参数

      1. 单击先前添加的探针旁边的**编辑探针**链接以查看探针的参数。

      2. 根据需要修改参数,然后单击复选标记以保存更改。

    • 要除了现有健康检查之外添加新的健康探针,请单击添加探针链接。例如,要添加一个检查容器是否正在运行的存活探针

      1. 单击**添加存活探针**,将看到包含探针参数的表单。

      2. 根据需要编辑探针参数。

        `超时`值必须小于`周期`值。`超时`默认值为`1`。`周期`默认值为`10`。

      3. 单击表单底部的复选标记。将显示**已添加存活探针**消息。

  3. 单击**保存**以保存您的修改并将附加探针添加到您的容器。您将被重定向到**拓扑**视图。

  4. 在侧面板中,通过单击**Pod**部分下的已部署Pod来验证是否已添加探针。

  5. 在**Pod详细信息**页面中,单击**容器**部分中列出的容器。

  6. 容器详情页面中,请验证是否已向容器添加了存活性探针 - HTTP Get 10.129.4.65:8080/,以及之前已存在的探针。

使用开发者视角监控健康检查失败

如果应用程序健康检查失败,您可以使用拓扑视图来监控这些健康检查违规。

前提条件
  • 您已在Web控制台中切换到**开发人员**视角。

  • 您已使用**开发人员**视角在OpenShift Dedicated上创建并部署了一个应用程序。

  • 您已向您的应用程序添加了健康检查。

步骤
  1. 拓扑视图中,单击应用程序节点以查看侧面板。

  2. 单击观察选项卡,在事件(警告)部分查看健康检查失败。

  3. 单击事件(警告)旁的下箭头以查看健康检查失败的详细信息。

其他资源