当前位置:   article > 正文

Kubernetes 健康检查之 Readiness 就绪检查_readiness probe failed: http probe failed with sta

readiness probe failed: http probe failed with statuscode: 404

 

Kubernetes三种探针


k8s支持存活livenessProbe和就绪readinessProbe两种探针,两种探针都支持以下三种方式

一、exec

通过执行shell命令的方式,判断退出状态码是否是0,示例:

  1. exec:
  2. command:
  3. - cat
  4. - /tmp/healthy

二、tcp

通过TCP请求的方式,是否能建立tcp连接,示例:

  1. tcpSocket:
  2. port: 8080
  3. initialDelaySeconds: 15
  4. periodSeconds: 20

三、httpGet

通过发起http请求,判断返回结果是否符合预期,示例:

  1. ...
  2. livenessProbe:
  3. httpGet:
  4. path: /healthz
  5. port: 8080
  6. httpHeaders:
  7. - name: X-Custom-Header
  8. value: Awesome
  9. initialDelaySeconds: 3
  10. periodSeconds: 3
  • initialDelaySeconds指定了容器启动后多少秒后进行探测
  • periodSeconds指定每隔多少秒进行探测

 

Readiness 探测


健康检查有以下两种类型:

• livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。

• readinessProbe(就绪检查):如果检查失败,Kubernetes会把Pod从service endpoints中剔除。(不会接收新的流量)

 • startupProbe(启动检查):

访问service的时候实际上会帮你转发到后面的pod当中。配置健康检查的目的,第一种存活性探测如果应用挂了,尝试帮你重启看能不能恢复。第二种就绪性检查会判断pod当中的应用程序是否准备就绪,如果没有准备就绪就直接在servcie这里摘除,service就像负载均衡一样转发到后端的3个pod,如果其中一个pod有问题,就需要将其摘除,这样再访问负载均衡器service就不会转发到后端有问题的pod上了,就绪健康检查就起到这么一个作用。

所以健康检查和就绪性检查时不同维度的

启动检查是来判断容器有没有启动好了,1.16版本之后支持的,这种使用不是特别多,使用上面两种足够满足大部分应用场景

 

除了 Liveness探测,Kubernetes Health Check 机制还包括 Readiness 探测。

用户通过 Liveness 探测可以告诉 Kubernetes 什么时候通过重启容器实现自愈。Readiness 探测则是告诉 Kubernetes 什么时候可以将容器加入到 Service 负载均衡池中,对外提供服务。

Readiness 探测的配置语法与 Liveness 探测完全一样,下面是个例子:

  1. [root@k8s-master ~]# cat readiness-pod.yml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: pod-readiness
  6. namespace: default
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: readiness
  12. template:
  13. metadata:
  14. labels:
  15. app: readiness
  16. spec:
  17. containers:
  18. - name: web-readniness
  19. image: nginx
  20. ports:
  21. - name: http
  22. containerPort: 80
  23. readinessProbe:
  24. httpGet:
  25. port: http
  26. path: /index.html
  27. initialDelaySeconds: 5
  28. periodSeconds: 5
  29. ---
  30. apiVersion: v1
  31. kind: Service
  32. metadata:
  33. name: webapp
  34. namespace: default
  35. spec:
  36. ports:
  37. - port: 80
  38. protocol: TCP
  39. targetPort: 80
  40. selector:
  41. app: readiness
  42. type: NodePort

这个配置文件只是将前面例子中的 liveness 替换为了 readiness,我们看看有什么不同的效果。

  1. [root@k8s-master ~]# kubectl apply -f readiness-pod.yml
  2. deployment.apps/pod-readiness created
  3. [root@k8s-master ~]# kubectl get pod
  4. NAME READY STATUS RESTARTS AGE
  5. pod-readiness-5f9486d555-8gx54 1/1 Running 0 4m30s
  6. pod-readiness-5f9486d555-9956t 1/1 Running 0 4m28s
  7. pod-readiness-5f9486d555-qp77t 1/1 Running 0 4m28s
  8. [root@k8s-master ~]# kubectl get svc
  9. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  10. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d
  11. webapp NodePort 10.98.80.3 <none> 80:30891/TCP 6m34s
  12. [root@k8s-master ~]# kubectl get ep
  13. NAME ENDPOINTS AGE
  14. kubernetes 192.168.179.102:6443 15d
  15. webapp 10.244.169.148:80,10.244.36.96:80,10.244.36.97:80 6m2s

 如果删除网页,那么就不会将pod关联到后端

  1. [root@k8s-master ~]# kubectl get ep -w
  2. NAME ENDPOINTS AGE
  3. kubernetes 192.168.179.102:6443 15d
  4. webapp 10.244.169.148:80,10.244.36.96:80,10.244.36.97:80 6m25s
  5. [root@k8s-master ~]# kubectl exec -it pod-readiness-5f9486d555-8gx54 -- sh
  6. # rm -rf /usr/share/nginx/html/index.html
  7. # exit
  8. #由于健康检查没有通过,所以pod处于未就绪状态
  9. [root@k8s-master ~]# kubectl get pod
  10. NAME READY STATUS RESTARTS AGE
  11. pod-readiness-5f9486d555-8gx54 0/1 Running 0 10m
  12. pod-readiness-5f9486d555-9956t 1/1 Running 0 10m
  13. pod-readiness-5f9486d555-qp77t 1/1 Running 0 10m
  14. [root@k8s-master ~]# kubectl describe pod pod-readiness-5f9486d555-8gx54
  15. Events:
  16. Type Reason Age From Message
  17. ---- ------ ---- ---- -------
  18. Normal Pulling 8h kubelet, k8s-node2 Pulling image "nginx"
  19. Normal Pulled 8h kubelet, k8s-node2 Successfully pulled image "nginx" in 34.499922944s
  20. Normal Created 8h kubelet, k8s-node2 Created container web-readniness
  21. Normal Started 8h kubelet, k8s-node2 Started container web-readniness
  22. Warning Unhealthy 8h (x23 over 8h) kubelet, k8s-node2 Readiness probe failed: HTTP probe failed with statuscode: 404
  23. #可以看到由于就绪健康检查没有通过,其中一个pod被踢出了service(这个时看到从service后端剔除,也就是从负载均衡里剔除)
  24. [root@k8s-master ~]# kubectl get ep -w
  25. NAME ENDPOINTS AGE
  26. kubernetes 192.168.179.102:6443 15d
  27. webapp 10.244.169.148:80,10.244.36.96:80,10.244.36.97:80 6m25s
  28. webapp 10.244.36.96:80,10.244.36.97:80 7m36s

 Pod readiness 的 READY 状态经历了如下变化:

  1. 刚被创建时,READY 状态为不可用。

  2. 10 秒后(initialDelaySeconds + periodSeconds),第一次进行 Readiness 探测并成功返回,设置 READY 为可用。

  3. 之后我们手动删除了index.html文件,连续 3 次 Readiness 探测均失败后,READY 被设置为不可用。

 通过 kubectl describe pod readiness 也可以看到 Readiness 探测失败的日志。

  1. [root@k8s-master ~]# kubectl describe pod pod-readiness-5f9486d555-8gx54
  2. Events:
  3. Type Reason Age From Message
  4. ---- ------ ---- ---- -------
  5. Normal Pulling 8h kubelet, k8s-node2 Pulling image "nginx"
  6. Normal Pulled 8h kubelet, k8s-node2 Successfully pulled image "nginx" in 34.499922944s
  7. Normal Created 8h kubelet, k8s-node2 Created container web-readniness
  8. Normal Started 8h kubelet, k8s-node2 Started container web-readniness
  9. Warning Unhealthy 8h (x23 over 8h) kubelet, k8s-node2 Readiness probe failed: HTTP probe failed with statuscode: 404

如果我们手动恢复一下之前删除的index.html再来看看会发生什么

  1. [root@k8s-master ~]# kubectl exec -it pod-readiness-5f9486d555-8gx54 -- sh
  2. # echo "" > /usr/share/nginx/html/index.html
  3. #健康检查通过加入service
  4. [root@k8s-master ~]# kubectl get ep -w
  5. NAME ENDPOINTS AGE
  6. kubernetes 192.168.179.102:6443 15d
  7. webapp 10.244.169.148:80,10.244.36.96:80,10.244.36.97:80 6m25s
  8. webapp 10.244.36.96:80,10.244.36.97:80 7m36s
  9. webapp 10.244.169.148:80,10.244.36.96:80,10.244.36.97:80 13m
  10. [root@k8s-master ~]# kubectl get pod
  11. NAME READY STATUS RESTARTS AGE
  12. pod-readiness-5f9486d555-8gx54 1/1 Running 0 16m
  13. pod-readiness-5f9486d555-9956t 1/1 Running 0 16m
  14. pod-readiness-5f9486d555-qp77t 1/1 Running 0 16m

可以看到进行 Readiness 探测并成功返回,设置 READY 为可用。

 

总结Liveness 和 Readiness


下面对 Liveness 探测和 Readiness 探测做个比较:

  1. Liveness 探测和 Readiness 探测是两种 Health Check 机制,如果不特意配置,Kubernetes 将对两种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零来判断探测是否成功。

  2. 两种探测的配置方法完全一样,支持的配置参数也一样。不同之处在于探测失败后的行为:Liveness 探测是重启容器;Readiness 探测则是将容器设置为不可用,不接收 Service 转发的请求。

  3. Liveness 探测和 Readiness 探测是独立执行的,二者之间没有依赖,所以可以单独使用,也可以同时使用。用 Liveness 探测判断容器是否需要重启以实现自愈,用 Readiness 探测判断容器是否已经准备好对外提供服务。

理解了 Liveness 探测和 Readiness 探测的原理,下一节我们会讨论如何在业务场景中使用 Health Check。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/247225
推荐阅读
相关标签
  

闽ICP备14008679号