一、什么是 Kubernetes 中的探测器
由于多种原因,应用程序可能变得不可靠。您需要确保应用程序处于所需状态。Kubernetes 提供了一种检查容器运行状况的方法。这种健康诊断称为探针。
二、探测容器的方法
kubelet 使用以下方法之一在其容器上完成探测:
2.1、执行
Kubelet 在容器内执行命令。结果取决于命令的退出代码。退出代码 0 表示诊断成功。
2.2、 httpget
Kubelet 向容器 IP 地址的指定端口发送请求。介于 200 和 400(含)之间的响应代码表示诊断成功。GET
2.3、tcp 套接字
Kubelet 尝试在容器 IP 地址的指定端口上建立 TCP 连接。已建立的连接表示诊断成功。
三、探头类型
Kubernetes 中有三种类型的探测器:
- 活体探头
- 就绪情况探测
- 启动探针
启动探测器是此列表中最近添加的,本文不对其进行讨论。
四、活体探头
活动探测器检测容器是否处于活动状态。这用于确保 Pod 的可用性。如果存活探测成功,kubelet 不会执行任何操作,因为容器已处于所需状态。如果失败,kubelet 会杀死容器,进一步的操作过程取决于容器的指定重启策略。
4.1、为什么要使用活体探针?
Kubelet 通过查看容器的状态来检查容器的运行状况。问题是 的状态不反映容器子进程的运行状况。如果您有单个进程容器,则无需指定活动探测器。否则,应使用活动探测器。PID 1
PID 1
五、就绪情况探测
就绪情况探测检测容器是否已准备好为传入的网络请求提供服务。您不希望将流量发送到尚未准备好运行的 Pod。如果就绪探测失败,控制窗格将停止发往容器的网络流量。在容器上运行第一个就绪情况探测之前,默认就绪状态设置为就绪情况探测在其整个生命周期内定期在容器上运行。Failure
5.1、为什么使用就绪情况探测?
所有子进程启动后,应将网络流量发送到容器。如果没有就绪探测,Kubernetes 会在启动后立即将网络流量发送到容器。这并不意味着子进程已启动。在此状态下向容器发送网络流量可能会导致错误。每次容器重新启动或创建应用程序的新实例时,应用程序都会遇到错误。PID 1
六、如何在 Kubernetes 中配置探测
在场内定义探测器。每个探头都有以下五个参数:pods.spec.containers
- initialDelaySeconds:这指定容器启动后等待探测器运行的时间(以秒为单位)。默认值为 0。
- 周期秒:指定每个周期探测器之间的时间间隔。默认值为 10。
- timeoutSeconds:指定每个探测器必须等待才能获得响应的时间。默认值为 0。
- 成功阈值:指定指示诊断成功的成功探测计数。默认值为 1。
- 失败阈值:指定指示诊断失败的失败探测器计数。默认值为 3。
所有这些参数都用于配置探测器。要遵循本指南,您需要配置一个 Kubernetes 集群和 kubectl 客户端。您可以使用Vultr Kubernetes Engine在云中部署 Kubernetes 集群并测试探针。在您的计算机上进行配置并按照操作。kubectl
6.1、创建活动探测器
查看以下配置文件:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-demo
spec:
containers:
- name: basic-container
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 1000
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
此配置创建单个容器 Pod 并定义活动探测。该探头用于执行诊断。创建容器后,执行命令。此命令将:exec
touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 100
- 创建文件
/tmp/healthy
- 等待 20 秒。
- 删除文件。
/tmp/healthy
- 使容器再保持活动状态 1000 秒。
请注意字段下的字段。这是定义活动探测器的位置。在这里,活体探测器将在创建容器后等待 5 秒,以 10 秒的时间间隔开始定期诊断。它使用 exec 方式执行探测。如果命令返回 0,则探测成功。livenessProbe
containers
cat /tmp/healthy
创建容器:
kubectl apply -f config.yaml
检查容器的事件:
kubectl describe liveness-demo
在输出的末尾,您可以看到类似以下内容:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 25s default-scheduler Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec
Normal Pulling 25s kubelet Pulling image "registry.k8s.io/busybox"
Normal Pulled 22s kubelet Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s
Normal Created 22s kubelet Created container basic-container
Normal Started 22s kubelet Started container basic-container
到目前为止,豆荚是健康且正在运行的。25 秒后,再次检查容器的事件:
kubectl apply -f config.yaml
您可以期望看到类似以下内容:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 56s default-scheduler Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec
Normal Pulling 55s kubelet Pulling image "registry.k8s.io/busybox"
Normal Pulled 52s kubelet Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s
Normal Created 52s kubelet Created container basic-container
Normal Started 52s kubelet Started container basic-container
Warning Unhealthy 5s (x3 over 25s) kubelet Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Normal Killing 5s kubelet Container basic-container failed liveness probe, will be restarted
从输出中可以看到,5 秒前,存活探测失败,提示 kubectl 重启容器。现在,检查容器的状态:
kubectl get pod liveness-demo
预期产出:
NAME READY STATUS RESTARTS AGE
liveness-demo 1/1 Running 1 (4s ago) 85s
请注意,“重新启动”字段显示确认容器已重新启动。1
6.2、配置就绪探测
配置就绪情况探测类似于配置活动探测。可以通过在配置文件中的字段下添加以下内容来创建类似的准备情况检查探测器。pods.spec.containers
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
七、结论
本文介绍了 Kubernetes 的活跃性和就绪性探测、它们的使用以及如何配置它们。若要了解详细信息,请参阅在 kubernetes.io 配置活动、就绪和启动探测。