Kubernetes三种探针


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

一、exec

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

      exec:command:- cat- /tmp/healthy

二、tcp

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

      tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20

三、httpGet

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

...
livenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: X-Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 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 探测完全一样,下面是个例子:

[root@k8s-master ~]# cat readiness-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: pod-readinessnamespace: default
spec:replicas: 3selector:matchLabels:app: readinesstemplate:metadata:labels:app: readinessspec:containers:- name: web-readninessimage: nginxports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 5periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:name: webappnamespace: default
spec:ports:- port: 80       protocol: TCP  targetPort: 80 selector:app: readiness     type: NodePort

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

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

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

[root@k8s-master ~]# kubectl get ep -w
NAME         ENDPOINTS                                             AGE
kubernetes   192.168.179.102:6443                                  15d
webapp       10.244.169.148:80,10.244.36.96:80,10.244.36.97:80     6m25s[root@k8s-master ~]# kubectl exec -it pod-readiness-5f9486d555-8gx54 -- sh
#  rm -rf /usr/share/nginx/html/index.html
# exit#由于健康检查没有通过,所以pod处于未就绪状态
[root@k8s-master ~]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
pod-readiness-5f9486d555-8gx54   0/1     Running   0          10m
pod-readiness-5f9486d555-9956t   1/1     Running   0          10m
pod-readiness-5f9486d555-qp77t   1/1     Running   0          10m[root@k8s-master ~]# kubectl describe pod pod-readiness-5f9486d555-8gx54
Events:Type     Reason     Age               From                Message----     ------     ----              ----                -------Normal   Pulling    8h                kubelet, k8s-node2  Pulling image "nginx"Normal   Pulled     8h                kubelet, k8s-node2  Successfully pulled image "nginx" in 34.499922944sNormal   Created    8h                kubelet, k8s-node2  Created container web-readninessNormal   Started    8h                kubelet, k8s-node2  Started container web-readninessWarning  Unhealthy  8h (x23 over 8h)  kubelet, k8s-node2  Readiness probe failed: HTTP probe failed with statuscode: 404#可以看到由于就绪健康检查没有通过,其中一个pod被踢出了service(这个时看到从service后端剔除,也就是从负载均衡里剔除)
[root@k8s-master ~]# kubectl get ep -w
NAME         ENDPOINTS                                             AGE
kubernetes   192.168.179.102:6443                                  15d
webapp       10.244.169.148:80,10.244.36.96:80,10.244.36.97:80     6m25swebapp       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 探测失败的日志。

[root@k8s-master ~]# kubectl describe pod pod-readiness-5f9486d555-8gx54
Events:Type     Reason     Age               From                Message----     ------     ----              ----                -------Normal   Pulling    8h                kubelet, k8s-node2  Pulling image "nginx"Normal   Pulled     8h                kubelet, k8s-node2  Successfully pulled image "nginx" in 34.499922944sNormal   Created    8h                kubelet, k8s-node2  Created container web-readninessNormal   Started    8h                kubelet, k8s-node2  Started container web-readninessWarning  Unhealthy  8h (x23 over 8h)  kubelet, k8s-node2  Readiness probe failed: HTTP probe failed with statuscode: 404

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

[root@k8s-master ~]# kubectl exec -it pod-readiness-5f9486d555-8gx54 -- sh
# echo "" > /usr/share/nginx/html/index.html#健康检查通过加入service
[root@k8s-master ~]# kubectl get ep -w
NAME         ENDPOINTS                                             AGE
kubernetes   192.168.179.102:6443                                  15d
webapp       10.244.169.148:80,10.244.36.96:80,10.244.36.97:80     6m25swebapp       10.244.36.96:80,10.244.36.97:80                       7m36swebapp       10.244.169.148:80,10.244.36.96:80,10.244.36.97:80     13m[root@k8s-master ~]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
pod-readiness-5f9486d555-8gx54   1/1     Running   0          16m
pod-readiness-5f9486d555-9956t   1/1     Running   0          16m
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。

Kubernetes 健康检查之 Readiness 就绪检查相关推荐

  1. 5分钟搞懂如何使用探针检查Kubernetes健康

    Kubernetes是一种开源容器编排平台,大大简化了应用程序的创建和管理. Kubernetes之类的分布式系统可能很难管理,原因是涉及许多活动组件,所有这些组件必须正常工作,整个系统才能顺畅运行. ...

  2. kubernetes健康检查配置解析

    一.健康检查种类 在kubernetes中,经常会看到健康检查相关的配置.一般有两种健康检查方式:存活性健康检查和可用性健康检查,也叫做存活探针(livenessProbe)或者就绪探针(readin ...

  3. java assert可以检查exception吗_检查胃病一定要做胃镜吗?这五种检查也可以筛查胃病疾病...

    胃肠镜检查是很多人打内心拒绝的.很多做过的人表示检查10分钟像是过一个世纪那么漫长. 确实,胃镜真的很不舒服.做之前紧张管子进去痛得掉眼泪,做完检查后痛不在肠道里变成嗓子痛了,真是太难受了. 检查胃部 ...

  4. 检查异常和非检查异常 有空你去学一下检查异常和非检查异常

    https://blog.csdn.net/weixin_39220472/article/details/81056647 Java检查异常和非检查异常,运行时异常和非运行时异常的区别 灰太狼_cx ...

  5. java的未检查异常有哪些_Java:检查异常与未检查异常

    一.异常的介绍 Throwable 是 Java 中所有错误和异常的超类.Java 虚拟机仅抛出属于此类(或其子类之一)的实例对象,或者是 throw 语句也可以抛出该对象.同样,catch 子句中的 ...

  6. Java检查异常、非检查异常、运行时异常、非运行时异常的区别

    Java检查异常.非检查异常.运行时异常.非运行时异常的区别 参考文章: (1)Java检查异常.非检查异常.运行时异常.非运行时异常的区别 (2)https://www.cnblogs.com/ou ...

  7. java assert可以检查exception吗_PETCT检查可以排查大肠癌吗?

    PETCT由PET(正电子发射型断层)和CT组成,众所周知CT检查通过显示人体病变的大小.位置.形态等解剖学特征来诊断疾病,PET是功能代谢显像的分子影像学检查,通过分析病变并摄取PET显像剂,确定病 ...

  8. JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名

    JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名 安全域名列表 var DomainArray=['run ...

  9. 计算机软件安装检查工具,正版软件检查工具部署应用培训.pptx

    正版软件检查工具部署应用培训;正版软件检查工具的功能正版软件检查工具的作用正版软件检查工具的安装使用方法 ;正版软件检查工具的功能规;正版软件检查工具的作用规;检查工具网络版安装环境规;1.打开&qu ...

最新文章

  1. Microbiome:根系分泌物驱动土壤记忆抵御植物病原菌
  2. Linux网络服务-Web Service之【HTTP协议简介】(一)
  3. [转]WINDOWS服务器安全加固实战(WINDOWS SERVER 2008 R2和WINDOWS SERVER 2012)
  4. 量产车发布前夕,乐视在美汽车工厂被传欠薪停工
  5. 启动模式 和 任务栈
  6. java mapper.readtree_Java ObjectMapper.readTree方法代码示例
  7. matlab基本矩阵运算,matlab的矩阵基本运算问题已知A=[a,b,c;d,e,f;h,I,j],B=[l,m,n;x,y,z;q,o,p]...
  8. AD 组策略应用与排错(1应用)
  9. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...
  10. 4 拼接_3个孩子,64㎡小户型内“镶嵌”4室一厅,餐桌还能随意拼接
  11. Arduion 底层原理之 Uart函数 串口收发 串口协议解析
  12. BigGAN、BiGAN、BigBiGAN简单介绍
  13. 地理坐标系转换工具,支持WGS84/GCJ02/BD09等常用坐标系互转
  14. 【opencv-ml】支持向量机简介
  15. 冬训成果何在?林丹无缘新赛季首冠状态成迷
  16. 互联网日报 | 4月14日 星期三 | 贾跃亭被终身禁入证券市场;天猫4月19日起降低开店门槛;小米正式迈入游戏手机细分赛道...
  17. day2:牛客网 糖果俱乐部
  18. Django框架 (一)———基本简介+基本认知
  19. TeamViewer远程的三种访问模式 (最方便的模式无需输入密码)
  20. 滴滴 webapp 5.0 Vue 2.0 重构经验分享

热门文章

  1. 【Python】Pandas Excel file format cannot be determined, you must specify an engine manually.报错【已解决】
  2. 通讯录vcf生成工具
  3. Visual Studio 2010安装、配置及使用
  4. RxJava入门之生命周期管理
  5. PS学习笔记--操作篇
  6. php gd库 缩小图片_【源码分享】PHP中GD库实现图片等比例缩放
  7. hook系统调用(一):爬取MSDN官网上的API调用并改为自己的API(c++正则表达式的应用)
  8. Python之基本数据类型
  9. png的计算机储存图片的格式吗,我电脑打不开png格式的图片,如何解决?
  10. anemometer mysql 500_Anemometer MySQL 慢查询日志监控平台