就绪探针用于周期性监控应用程序是否准备好接收流量,尤其适用于Pod通过Service对外暴露的场景。Service代理Pod如图3-6所示。
图3-6 Service代理Pod
当用户访问Service时,该Service会将流量转发到后端Pod。思考一个问题:Service在什么情况下才会将流量转发给Pod?
答案是Pod为准备就绪状态时,即当“READY”值两侧相等时。
如果Pod准备就绪,但应用程序出现异常,那么用户将访问失败。为了避免这样的问题,可以为容器配置就绪探针,根据“探针结果”来决定Pod是否准备就绪,而不是单纯地根据“容器状态”来决定。
就绪探针配置如下:
在上述配置中,“readinessProbe”部分定义了就绪探针。kubelet组件将在容器启动10 s后发送第一个探针,该探针向地址“http://<Pod IP>:80/index.html”发送HTTP请求。如果响应的HTTP状态码不是200~400,则kubelet组件判定探针失败,并将该Pod标记为“未准备就绪”,这样Service就会自动从后端移除该Pod,而无须为其转发流量。随后,每间隔20 s执行一次就绪探针。
创建Pod资源:
[root@k8s-master ~]# kubectl apply -f pod-readiness.yaml
为该Pod创建一个Service:
[root@k8s-master ~]# kubectl expose pod pod-readiness --port=80 --target- port=80
查看Service IP地址:
集群中任意节点都可以通过IP地址“10.110.172.152”访问后端Pod。
查看Endpoints对象,确认Service后端关联的Pod:
Endpoints对象由Kubernetes自动创建,负责动态收集和管理与Service相关联的Pod IP和端口,以确保后端Pod的信息始终保持最新。
我们尝试模拟应用程序故障,删除“index.html”文件:
[root@k8s-master ~]# kubectl exec -it pod-readiness -- rm -f /usr/share/ nginx/html/index.html
随后,kubelet组件执行探针失败,该Pod被标记为“未准备就绪”。同时,Endpoints对象将移除该Pod。再次查看Endpoints对象,你可以看到“ENDPOINTS”列的值为空:
此时,Service将停止为该Pod转发流量。一旦探针成功,Endpoints对象就会自动添加该Pod,Service将重新开始为该Pod转发流量。