如何使用Kubernetes的Readiness Probes检测应用的准备状态?
1 Kubernetes的Readiness Probes介绍
Kubernetes的Readiness Probes是用于检测应用程序是否准备就绪的一个特性,它允许您精确的控制服务是否该可用于负载均衡,否则负载均衡器可能会将流量发送到未准备就绪的应用程序或容器。
2 Readiness Probes实现方式
2.1 基于HTTP(S)请求
Kubernetes可以创建基于HTTP(S)请求的Readiness Probes。当需要检测容器的时候,每隔一段时间,Kubernetes会向容器内的特定端口发起一个HTTP或HTTPS请求,如果请求的响应状态码在200-399范围内,那么就可以判断容器已就绪;否则容器仍未就绪,Kubernetes仍然继续发送请求,直到Readiness Probe处于容器就绪的状态,并将来自负载均衡器的数据发送给它。
2.2 基于TCP Socket请求
Kubernetes还可以在容器内发起TCP Socket请求,如果套接字建立成功,则表明容器已经就绪,可以处理负载均衡器发送的数据;否则,Kubernetes将继续发起请求,直到容器处于就绪状态。
2.3 基于命令行检测
Kubernetes也支持直接通过检测容器可以执行的命令来检测容器的Readiness。只要Kubernetes在容器内该命令的执行结果能返回0,即表明容器已经就绪,负载均衡器可以通过负载均衡器发送数据到该容器。
3 如何使用Readiness Probes
可以通过在Kubernetes Deployment配置文件中添加相应的参数来使用Readiness Probes,由于Kubernetes的Deployment分为两个阶段,分别为Pod启动阶段和应用准备就绪阶段,因此可以分别为Pod启动阶段和应用准备就绪阶段配置不同的Readiness Probes,以下是Kubernetes Deployment配置文件的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
selector:
matchLabels:
app: hello
replicas: 10
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: nginx
imagePullPolicy: Always
readinessProbe:
failureThreshold: 5
httpGet:
path: /readiness
port: 80
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
livenessProbe:
failureThreshold: 2
httpGet:
path: /liveness
port: 80
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
通过上面示例,Kubernetes在Pod启动阶段会发起一个HTTP GET请求,访问/liveness接口,HTTP请求的超时时间为1秒,重试间隔为10秒,失败次数为2次;在应用准备就绪阶段会发起另外一个HTTP请求,访问/readiness接口,HTTP请求的超时时间为1秒,重试间隔为5秒,失败次数为5次,只有满足全部请求的要求,才能将Pod标记为就绪状态,完成其任务。