第 6 章 监控应用程序的健康状态

在软件系统中,组件可能会变得不健康,原因可能源自连接暂时丢失、配置错误或外部依赖项相关问题等临时问题。OpenShift Container Platform 应用程序具有若干选项来探测和处理不健康的容器。

6.1. 了解健康检查

探测(probe)是一种 Kubernetes 操作,它会定期对运行中的容器执行诊断。目前有两种类型的探测,分别满足不同的目的。

就绪度(Readiness)探测
就绪度检查确定在其中调度这个操作的容器是否已准备好满足请求。如果某一容器的就绪度探测失败,则端点控制器将确保从所有服务的端点中移除该容器的 IP 地址。就绪度探测也可用于向端点控制器发送信号,即使有容器在运行它也不应从代理接收任何流量。

例如,就绪度检查可以控制要使用哪些 Pod。如果 Pod 尚未就绪,它会被移除。

存活度(Liveness)探测
存活度检查确定在其中调度这个操作的容器是否仍然在运行。如果存活度探测因为死锁等某种状况而失败,kubelet 会终止容器。容器而后根据其重启策略做出响应。

例如,restartPolicyAlwaysOnFailure 的节点上的存活度探测可以终止并重启该节点上的容器。

存活度检查示例

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness-http
    image: k8s.gcr.io/liveness 1
    args:
    - /server
    livenessProbe: 2
      httpGet:   3
        # host: my-host
        # scheme: HTTPS
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 15  4
      timeoutSeconds: 1   5
    name: liveness   6

1
指定用于存活度探测的镜像。
2
指定健康检查的类型。
3
指定存活度检查的类型:
  • HTTP 检查。指定 httpGet
  • 容器执行检查。指定 exec
  • TCP 套接字检查。指定 tcpSocket
4
指定容器启动后执行第一个探测前的秒数。
5
指定探测之间的秒数。

不健康容器存活度检查输出结果示例

$ oc describe pod pod1

....

FirstSeen LastSeen    Count   From            SubobjectPath           Type        Reason      Message
--------- --------    -----   ----            -------------           --------    ------      -------
37s       37s     1   {default-scheduler }                            Normal      Scheduled   Successfully assigned liveness-exec to worker0
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Pulling     pulling image "k8s.gcr.io/busybox"
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Pulled      Successfully pulled image "k8s.gcr.io/busybox"
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Created     Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Started     Started container with docker id 86849c15382e
2s        2s      1   {kubelet worker0}   spec.containers{liveness}   Warning     Unhealthy   Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory

6.1.1. 了解健康检查的类型

存活度检查和就绪度检查可以通过三种方式进行配置:

HTTP 检查
kubelet 使用 Web hook 来确定容器的健康状态。如果 HTTP 响应代码介于 200 和 399 之间,则检查被认定为成功。

对于在完全初始化后返回 HTTP 状态代码的应用程序,HTTP 检查是理想的选择。

容器执行检查
kubelet 在容器内执行一个命令。退出检查时状态为 0 被视为成功。
TCP 套接字检查
kubelet 尝试向容器打开一个套接字。只有检查能够建立连接,容器才被视为健康。对于只有初始化完毕后才开始侦听的应用程序,TCP 套接字检查是理想的选择。