K8S:三种探针
在 Kubernetes(k8s)中,探针(Probe)是用于检查容器状态的一种机制。k8s 提供了三种探针来确保应用程序容器的健康状态,并根据探测结果采取相应的动作。这三种探针是:存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe),每一种探针都有其特定的用途和配置场景。
存活探针(Liveness Probe)
存活探针主要用于检查容器是否还处于健康状态。若探测失败,Kubernetes 会根据策略重新启动该容器。这种探针通常用于检测长期运行的进程是否进入了无响应或死锁状态。
例如,如果应用进程进入了死循环、挂起,或者由于内存泄漏导致服务无法响应,但容器本身并未崩溃,此时存活探针就会发挥作用。K8s 会通过探针判断该容器已经无法恢复,并执行容器重启以恢复服务。
存活探针可以通过以下几种方式进行配置:
- HTTP GET 请求:K8s 会向容器内的某个 HTTP 端点发送 GET 请求,响应码为 2xx 或 3xx 表示健康。
- TCP 检查:K8s 会尝试通过 TCP 连接到指定端口,能连接上则表示健康。
- Exec 命令:K8s 会在容器内执行一条命令,根据命令的返回值判断健康状态。
就绪探针(Readiness Probe)
就绪探针用于判断容器是否已经准备好对外提供服务。与存活探针不同,就绪探针并不负责重启容器,而是用于确定容器是否应当加入到服务的负载均衡中。就绪探针探测失败时,容器仍然存活,但它不会接收新的请求。
通常,应用程序启动后可能需要进行一些初始化操作,比如加载配置文件、数据库连接建立、缓存准备等。在这些操作完成之前,应用可能还没有准备好处理请求。此时,可以通过就绪探针来控制容器何时被标记为“Ready”,并确保流量只在容器真正准备好时才被引导至该容器。
就绪探针的配置方式与存活探针类似,也支持 HTTP GET 请求、TCP 检查和 Exec 命令。
启动探针(Startup Probe)
启动探针是 Kubernetes 1.16 版本新增的功能,用于检测容器的启动状态。启动探针的作用是在容器启动时为其提供额外的宽限时间,以避免在初始化较慢的情况下被过早地重启。启动探针探测成功后,K8s 会停止对其执行启动探测,改为执行存活探测。
启动探针特别适合用于那些启动时间较长的应用程序。如果容器启动时间较长,而存活探针配置的检测间隔较短,则容器可能在完全启动前就被重启。通过配置启动探针,可以延长检测容器启动过程的时间窗口。
与其他探针一样,启动探针也可以通过 HTTP GET、TCP 检查或 Exec 命令进行配置。
对一个Nginx 服务使用探针
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.10
ports:
- containerPort: 80
livenessProbe: # livenessProbe通过向/healthz端点发起HTTP GET 请求来检测Nginx 的健康状态。
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe: # readinessProbe通过对根路径 / 进行 HTTP GET请求进行检查。
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
startupProbe:
httpGet:
path: /startup # startupProbe通过 HTTP GET请求 /startup 端点检查启动状态,
port: 80
initialDelaySeconds: 5
failureThreshold: 30
periodSeconds: 10