文章目录
- 一、探针介绍
- 二、探针类型
- 三、探针定义方式
- 四、探针实例
- 五、启动探针测试
- 六、存活探针测试
- 七、就绪探针测试
一、探针介绍
-
概念
在 Kubernetes 中 Pod 是最小的计算单元,而一个 Pod 又由多个容器组成,相当于每个容器就是一个应用,应用在运行期间,可能因为相关原因导致应用异常等。所以,我们需要对k8s进行健康检查,而我们可以通过探针配置运行状况检查,来确定每个 Pod 的状态。
二、探针类型
-
存活探针(Liveness Probe)
存活探针用于检测容器内应用程序的健康状态。如果存活探针失败(即应用程序不健康),k8s将会自动重启容器,以尝试恢复应用程序的健康状态。如果重启容器仍然无法解决问题,Kubernetes 可能会根据配置的重启策略进一步采取行动。重启策略包括:
- Always(默认):始终重启容器,无限次数地尝试恢复应用程序的健康状态。
- OnFailure:仅在容器失败(退出状态码非零)时重启容器,尝试恢复应用程序的健康状态。
- Never:永不重启容器,不会尝试恢复应用程序的健康状态。
-
就绪探针(Readiness Probe)
对于就绪探针(Readiness Probe):就绪探针用于检测容器是否已经准备好接收流量。如果就绪探针失败,Kubernetes 将从服务负载均衡的池中剔除该容器。这意味着新的流量将不会被路由到该容器,直到就绪探针成功为止。这可以确保只有健康的容器能够接收流量,避免将流量发送到尚未准备好的容器上。一旦就绪探针成功,Kubernetes 将再次将容器纳入服务负载均衡,并开始将新的流量路由到该容器。
-
启动探针(Startup Probe)
启动探针用于检测容器内应用程序是否已经启动成功。与存活探针和就绪探针不同,启动探针仅在容器启动时执行,并且只需检测一次。启动探针的结果不会影响容器的重启或负载均衡。它主要用于检测应用程序是否成功启动,并在启动过程中提供一定的等待时间。如果启动探针失败,Kubernetes 不会采取任何特殊行动。这是因为启动探针失败只意味着应用程序尚未成功启动,并且不会触发容器的重启或负载均衡操作。
三、探针定义方式
- 执行命令(Exec):通过在容器内执行特定的命令来检查应用程序的状态。如果命令的返回状态码是 0,探针被认为是成功的;否则,探针被认为是失败的。
- 发送 HTTP 请求(HTTP GET):通过发送 HTTP GET 请求到容器内的指定端点来检查应用程序的状态。如果返回的 HTTP 状态码在 2xx 或 3xx 范围内,探针被认为是成功的;否则,探针被认为是失败的。
- TCP 套接字(TCP Socket):通过尝试建立到容器内指定端口的 TCP 连接来检查应用程序的状态。如果连接成功建立,探针被认为是成功的;否则,探针被认为是失败的。
四、探针实例
- 查看我们coredns的探针配置:kubectl edit deploy coredns -n kube-system
五、启动探针测试
-
快速部署nginx的pod:kubectl create deployment nginx --image=nginx
-
测试nginx启动探针-http(层级参考第四点coredns的层级):kubectl edit deploy nginx
startupProbe: httpGet: path: /api/path port: 80 failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
startupProbe: #应用启动探针 httpGet: #使用http方式进行请求探测 path: /api/path #请求路径 port: 80 #请求端口 failureThreshold: 3 #失败次数达到多少次算失败 periodSeconds: 10 #间隔时间 successThreshold: 1 #成功次数达到多少次算成功 timeoutSeconds: 5 #请求的超时时间
查看:kubectl get pod
查看详情:kubectl describe pod nginx-569854844d-6dzxd
解:因为我们这边设置了启动探针,去访问/api/path。由于nginx没有这个路径,所以访问失败了,所以pod一直没有ready。可以将路径改为/index.html。
-
测试nginx启动探针-tcp:kubectl edit deploy nginx
startupProbe: tcpSocket: port: 80 failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
-
测试nginx启动探针-shell:kubectl edit deploy nginx
startupProbe: exec: command: - sh - -c - "echo 'success' > /inited;" failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
查看: kubectl exec -it nginx-576dc58bc8-scbv7 cat /inited
六、存活探针测试
-
测试nginx应用存活探针-http:kubectl edit deploy nginx
livenessProbe: httpGet: path: /started.html port: 80 failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
查看:kubectl describe pod nginx-65cdf95974-m8l2p
因为不存在/started.html文件,所以检测不到存活,将地址改为/index.html即可
七、就绪探针测试
-
测试nginx就绪探针-http:kubectl edit deploy nginx
readinessProbe: httpGet: path: /started.html port: 80 failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5
查看:kubectl describe pod nginx-5bd5c78bbd-tbzvb
因为不存在/started.html文件,所以无法就绪,将地址改为/index.html即可