×

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

了解健康检查

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

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

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

就绪性探针

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

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

存活性健康检查

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

例如,restartPolicyAlwaysOnFailure 的 Pod 上的存活性探针会终止并重新启动容器。

启动探针

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

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

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

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

  • HTTP GET:使用 HTTP GET 测试时,测试使用 Web 挂钩确定容器的健康状况。如果 HTTP 响应代码介于200399之间,则测试成功。

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

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

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

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

  • initialDelaySeconds:容器启动后探针可以调度之前的时间(以秒为单位)。默认为 0。

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

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

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

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

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

    • 对于就绪性探针,Pod 将标记为未就绪

    • 对于启动探针,容器将被终止,并受 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 互联网方案:HTTPHTTPS。默认值为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 指定HTTPHTTPS。未定义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 控制台中的**开发者**视角。

  • 您已使用**开发者**视角在 AWS 上的 Red Hat OpenShift Service 上创建并部署了一个应用程序。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

先决条件
  • 您已切换到 Web 控制台中的**开发者**视角。

  • 您已使用**开发者**视角在 AWS 上的 Red Hat OpenShift Service 上创建并部署了一个应用程序。

  • 您已将健康检查添加到您的应用程序。

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

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

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

    • 要编辑现有探针的参数

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

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

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

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

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

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

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

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

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

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

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

使用开发者视角监控健康检查故障

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

先决条件
  • 您已切换到 Web 控制台中的**开发者**视角。

  • 您已使用**开发者**视角在 AWS 上的 Red Hat OpenShift Service 上创建并部署了一个应用程序。

  • 您已将健康检查添加到您的应用程序。

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

  2. 点击观察选项卡以查看事件(警告)部分中的健康检查故障。

  3. 点击事件(警告)旁的下拉箭头以查看健康检查故障的详细信息。

更多资源