前言
应用程序也可能在不终止的情况下变得无响应。例如,一个有内存泄漏的 Java 应用程序最终开始 OutOfMemoryErrors,但它的 JVM 进程继续运行。理想情况下,Kubernetes 应该检测到这种错误并重新启动容器。
Probe-容器探针介绍
Probe 是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。有三种类型的处理程序
Probe的机制类型
- exec-ExecAction
在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功 - tcpSocket-TCPSocketAction
对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的 - httpGet-HTTPGetAction
对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的
三种结果
- Success(成功)
容器通过了诊断 - Failure(失败)
容器未通过诊断 - Unknown(未知)
诊断失败,因此不会采取任何行动
三种探针
针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应
- livenessProbe
用于判断容器是否存活(Running状态),如果LivessProbe探针探测到容器不健康,则kubelet将杀死该容器,并根据该容器的重启策略做相应的处理。如果一个容器不包含livenessProbe探针,那么kubelet认为该容器的livenessProbe探针返回的值永远是Success - readinessProbe
指示容器是否准备好为请求提供服务。如果就readinessProbe探针探测失败,端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该Pod的IP地址。 初始延迟之前的就绪态的状态值默认为Failure。 如果容器不提供readinessProbe探针,则默认状态为 Success,readinessProbe也是定期触发执行的,存在于Pod的整个生命周期中 - startupProbe
如果某些应用启动比较慢,可以使用startupProbe探针,该探针指示容器中的应用是否已经启动。如果提供了startupProbe探针,则所有其他探针都会被禁用,直到此探针成功为止。如果探测失败,kubelet将杀死容器,而容器依其重启策略进行重启。如果容器没有提供启动探测,则默认状态为Success
例子
- pod.yaml
# kubia-liveness.yaml apiVersion: v1 kind: Pod metadata: name: kubia-liveness spec: containers: - name: kubia image: luksa/kubia:1.0 ports: - name: http containerPort: 8080 livenessProbe: httpGet: path: / port: 8080 - name: envoy image: luksa/kubia-ssl-proxy:1.0 ports: - name: https containerPort: 8443 - name: admin containerPort: 9901 livenessProbe: httpGet: path: /ready port: admin initialDelaySeconds: 10 periodSeconds: 5 timeoutSeconds: 2 failureThreshold: 3
- apply pod
kubectl apply -f kubia-liveness.yaml
- port-forward
kubectl port-forward kubia-liveness 8080 8443 9901
- 查看探针日志
$ kubectl logs kubia-liveness -c kubia -f $ kubectl exec kubia-liveness -c envoy -- tail -f /var/log/envoy.admin.log