Kubernetes 对 Pod 的健康状态可以通过两类探针来检查:LivenessProbeReadinessProbekubelet 定期执行这两类探针来针对容器的健康状况。

  1. LivenessProbe探针:用于判断容器是否存活(Running状态),如果 LivenessProbe 探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是 Success。
  2. ReadinessProbe探针:用于判断容器服务是否可用(Ready状态),达到 Ready 状态的 Pod 才可以接收请求。对于被 Service 管理的 Pod,Service 与 Pod Endpoint 的关联关系也将基于 Pod 是否 Ready 进行设置。 如果在运行过程中 Ready 状态变为 False,则系统自动将其从 Service 的后端 Endpoint 列表中隔离出去,后续再把恢复到 Ready 状态的 Pod 加回后端 Endpoint 列表。这样就能保证客户端在访问 Service 时不会被转发到服务不可用的 Pod 实例上。

LivenessProbe 和 ReadinessProbe 均可配置以下三种实现方式。

  1. ExecAction:在容器内部执行一个命令,如果该命令的返回码为 0 ,则表明容器健康。

    下面的例子中,通过执行 cat /tmp/health 命令来判断一个容器运行是否正常。在该 Pod 运行后,将在创建/tmp/health 文件 10s 后删除该文件,而 LivenessProbe 健康检查的初识探测时间(initialDelaySeconds)为 15s,探测结果是 Fail,将导致 kubelet 杀掉该容器并重启它:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. test: liveness
  6. name: liveness-exec
  7. spec:
  8. containers:
  9. - name: liveness
  10. image: gcr.io/google_containers/busybox
  11. args:
  12. - /bin/sh
  13. - -c
  14. - echo ok > /tmp/health; sheep 10; rm -rf /tmp/health; sleep 600
  15. livelessProbe:
  16. exec:
  17. command:
  18. - cat
  19. - /tmp/health
  20. initialDelaySeconds: 15
  21. timeoutSeconds: 1
  1. TCPSocketAction:通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立 TCP 连接,则表明容器健康。

    在下面的例子中,通过与容器内的 localhost:80 建立 TCP 连接进行健康检查:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-with-healthcheck
  5. spec:
  6. containers:
  7. - name: nginx
  8. image: nginx
  9. ports:
  10. - containerPort: 80
  11. livelessProbe:
  12. tcpSocket:
  13. port: 80
  14. initialDelaySeconds: 30
  15. timeoutSeconds: 1
  1. HTTPGetAction:通过容器的 IP 地址、端口号 及路径调用 HTTP Get 方法,如果响应的状态码大于等于200 且小于400,则认为容器健康。

    在下面的例子中,kubelet 定时发送 HTTP 请求到 localhost:80/_status/healthz 来进行容器应用的健康检查:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-with-healthcheck
  5. spec:
  6. containers:
  7. - name: nginx
  8. image: nginx
  9. ports:
  10. - containerPort: 80
  11. livelessProbe:
  12. httpGet:
  13. path: /_status/healthz
  14. port: 80
  15. initialDelaySeconds: 30
  16. timeoutSeconds: 1

对于每种探针方式,都需要设置 initialDelaySecondstimeoutSeconds 两个参数,它们的含义分别如下:

  • initialDelaySeconds: 启动容器后进行首次健康的等待事件,单位为 s。
  • timeoutSeconds: 健康检查发送请求后等待响应的超时时间,单位为 s。当超时发生时,kubelet 会认为容器已经无法提供服务,将会重启该容器。

Kubernetes 的 ReadinessProbe 机制可能无法满足某些复杂应用对容器内服务可用状态的判断,所以 Kubernetes 从 1.11 版本开始,引入 Pod Ready++ 特性对 Readiness 探测机制进行扩展,在 1.14 版本时达到 GA 稳定版,称其为Pod Readiness Gates

通过 Pod Readiness Gates 机制,用户可以将自定义的 ReadinessProbe 探测方式设置在 Pod 上,辅助 Kubernetes 设置 Pod 何时到达服务可用状态(Ready)。

为了使自定义的 ReadinessProbe 生效,用户需要提供一个外部的控制器(Controller)来设置相应的 Condition 状态。

Pod 的 Readiness Gates 在 Pod 定义中的 ReadinessGate 字段进行设置。

下面的例子设置了一个类型为 www.example.com/feature-1 的新 Readiness Gate:

  1. Kind: Pod
  2. ....
  3. spec:
  4. readinessGates:
  5. - conditionType: "www.example.com/feature-1"
  6. status:
  7. conditions:
  8. - type: Ready # Kubernetes 系统内置的名为 Ready 的 Condition
  9. status: "True"
  10. lastProbeTime: null
  11. lastTransitionTime: 2018-01-01T00:00:00Z
  12. - type: "www.example.com/feature-1" # 用户自定义 Condition
  13. status: "False"
  14. lastProbeTime: null
  15. lastTransitionTime: 2019-03-01:T00:00:00Z
  16. containerStatuses:
  17. - containerID: docker:/abcd...
  18. ready: true
  19. .....

新增的自定义 Condition 的状态(status)将由用户自定义的外部控制器设置,默认值为 False。

Kubernetes 将在判断全部 readinessGates 条件都为 True 时,才设置 Pod 为服务可用状态(Ready 为 True)。

Pod 健康检查和服务可用性检查的更多相关文章

  1. kubernetes之pod健康检查

    目录 kubernetes之pod健康检查 1.概述和分类 2.LivenessProbe探针(存活性探测) 3.ReadinessProbe探针(就绪型探测) 4.探针的实现方式 4.1.ExecA ...

  2. Kubernetes 服务部署最佳实践(二) ——如何提高服务可用性

    引言 上一篇文章我们围绕如何合理利用资源的主题做了一些最佳实践的分享,这一次我们就如何提高服务可用性的主题来展开探讨. 怎样提高我们部署服务的可用性呢?K8S 设计本身就考虑到了各种故障的可能性,并提 ...

  3. nginx 健康检查和负载均衡机制分析

    nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖 于具体实现,各个实现定义不一样),不再往这 ...

  4. 分析NGINX 健康检查和负载均衡机制

    nginx 是优秀的反向代理服务器,这里主要讲它的健康检查和负载均衡机制,以及这种机制带来的问题.所谓健康检查,就是当后端出现问题(具体什么叫出现问题,依赖于具体实现,各个实现定义不一样),不再往这个 ...

  5. SLA服务可用性怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  6. LA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  7. SLA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  8. 数据一致性(consistency)、服务可用性(availability)、分区容错性(partition-tolerance)

    数据一致性(consistency).服务可用性(availability).分区容错性(partition-tolerance) 分布式系统理论基础 - CAP 2016-04-04 18:27 b ...

  9. Kubernetes Pod 健康检查

    参考文档: https://jimmysong.io/kubernetes-handbook/guide/configure-liveness-readiness-probes.html 一.Pod的 ...

随机推荐

  1. Jmeter系列(3) - 静默压测

    前言 Windows环境 简述 静默 : 脱离UI运⾏JMeter压测,用命令行方式运行性能测试脚本好处:命令运⾏更容易"搞事情"命令格式: jmeter –n –t $jmx_f ...

  2. Shell条件判断(6)- 多重条件判断

    多重条件判断 多个条件判断一起使用 测试选项 作用 判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真 判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真 ! ...

  3. 『PyTorch』屌丝的PyTorch玩法

    1. prefetch_generator 使用 prefetch_generator库 在后台加载下一batch的数据,原本PyTorch默认的DataLoader会创建一些worker线程来预读取 ...

  4. 我在学习Blazor当中踩的巨坑!Blazor WebAssembly调试

    最近嘛,看看Blazor已经蛮成熟的.顺便想在自家的框架里使用这个东西,毕竟我还是很念旧的,而且Blazor的技术栈也不麻烦.然后呢,在调试这一关我可是踩了大坑. 我的VS是2019,很早以前装的.然 ...

  5. 我决定!墙裂推荐高清无码Python电子书(文中福利)

    @ 目录 前言 视频网站学习的优点和缺点 Python基础 游戏 网站开发 前言 近几年学了Python,查阅了不少资料,如B站,慕课网,我要自学网等等,然后自己边看学书自己整理学习资料,想分享下如何 ...

  6. Windows环境下搭建Hadoop(2.6.0)+Hive(2.2.0)环境并连接Kettle(6.0)

    前提:配置JDK1.8环境,并配置相应的环境变量,JAVA_HOME 一.Hadoop的安装 1.1 下载Hadoop (2.6.0) http://hadoop.apache.org/release ...

  7. C++ IDE或编辑器安装

    IDE介绍 上节课我们讲了C++编译器,可是没有好的编辑器,只用记事本打代码,这谁受得了.Linux vim至少还有代码高亮(即我作文里经常会出现的"彩色的代码"),记事本连高亮都 ...

  8. 路由器的不同接口对WANsim的影响

    随着网络的快速发展,移动设备已经成为我们日常生活中不可或缺的一部分.人们习惯用手机看新闻.看视频.点外卖.打车.购物等等. 同时,广域网也为移动通讯带来了挑战.以视频流来举例,从用户终端到达服务器,这 ...

  9. pycharm中安装和使用sqlite过程详解

    创建Django项目,添加app 使用虚拟环境 项目创建默认使用的Django数据库是sqlite 配置静态文件 STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 S ...

  10. Spark RDD编程(博客索引,日常更新)

    本篇主要是记录自己在中解决RDD编程性能问题中查阅的论文博客,为我认为写的不错的建立索引方便查阅,我的总结会另立他篇 1)通过分区(Partitioning)提高spark性能https://blog ...