第 6 章 监控应用程序的健康状态
在软件系统中,组件可能会变得不健康,原因可能源自连接暂时丢失、配置错误或外部依赖项相关问题等临时问题。OpenShift Container Platform 应用程序具有若干选项来探测和处理不健康的容器。
6.1. 了解健康检查
探测(probe)是一种 Kubernetes 操作,它会定期对运行中的容器执行诊断。目前有两种类型的探测,分别满足不同的目的。
- 就绪度(Readiness)探测
- 就绪度检查确定在其中调度这个操作的容器是否已准备好满足请求。如果某一容器的就绪度探测失败,则端点控制器将确保从所有服务的端点中移除该容器的 IP 地址。就绪度探测也可用于向端点控制器发送信号,即使有容器在运行它也不应从代理接收任何流量。
例如,就绪度检查可以控制要使用哪些 Pod。如果 Pod 尚未就绪,它会被移除。
- 存活度(Liveness)探测
- 存活度检查确定在其中调度这个操作的容器是否仍然在运行。如果存活度探测因为死锁等某种状况而失败,kubelet 会终止容器。容器而后根据其重启策略做出响应。
例如,restartPolicy
为 Always
或 OnFailure
的节点上的存活度探测可以终止并重启该节点上的容器。
存活度检查示例
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
不健康容器存活度检查输出结果示例
$ 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 套接字检查是理想的选择。