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 杀掉该容器并重启它:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: gcr.io/google_containers/busybox
args:
- /bin/sh
- -c
- echo ok > /tmp/health; sheep 10; rm -rf /tmp/health; sleep 600
livelessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 15
timeoutSeconds: 1
  1. TCPSocketAction:通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立 TCP 连接,则表明容器健康。

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

    在下面的例子中,kubelet 定时发送 HTTP 请求到 localhost:80/_status/healthz 来进行容器应用的健康检查:
apiVersion: v1
kind: Pod
metadata:
name: pod-with-healthcheck
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livelessProbe:
httpGet:
path: /_status/healthz
port: 80
initialDelaySeconds: 30
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:

Kind: Pod
....
spec:
readinessGates:
- conditionType: "www.example.com/feature-1"
status:
conditions:
- type: Ready # Kubernetes 系统内置的名为 Ready 的 Condition
status: "True"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
- type: "www.example.com/feature-1" # 用户自定义 Condition
status: "False"
lastProbeTime: null
lastTransitionTime: 2019-03-01:T00:00:00Z
containerStatuses:
- containerID: docker:/abcd...
ready: true
.....

新增的自定义 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. symfony2已有数据表导入实体时报错 Doctrine does not support reverse engineering from tables that don't have a primary key

    先在配置文件 app/config/config.yml中配置 schema_filter: /^(?!(tablename))/ 即可,或者在出现问题表都加上一个id 然后再使用命令 php app ...

  2. dedecms内页调用内容当中第一张图片

    在includes/extend.func.php末尾添加方法: //取第一张图地址 function firstimg($str_pic) { $str_sub=substr($str_pic,0, ...

  3. Java基础系列(7)- 标识符和关键字

    关键字 标识符 Java所有的组成部分都需要名字.类名.变量名.方法名都称为标识符 首字母以字母(A-Z或者a-z),美元符号($),或者下划线(_)开头 首字母之后可以用字母.美元符号.下划线.数字 ...

  4. Docker系列(20)- 数据卷容器

    数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...

  5. python刷题第二周

    1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...

  6. js模块化开发 AMD CMD Commonjs

    在es6全面实行开来之前  js实现模块开发方案有: 1.AMD 异步模块开发定义  依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...

  7. vue 主次页面区分

    1.路由设定,增加meta参数 { path: '/', name: 'Home', component: Home, meta: { index: 0, showFooter: true //由这个 ...

  8. 从产业链、架构和技术三个层面,看元宇宙与RPA的发展关系

    你可能还不知道,元宇宙也将带动RPA高速发展 一文读懂RPA如何赋能元宇宙,虚拟空间更需要RPA无处不在 三个层面,解读元宇宙如何利好RPA行业发展 从产业链.架构和技术三个层面,看元宇宙与RPA的发 ...

  9. SDOI2015 排序

    SDOI2015 排序 今天看到这道题,没有一点思路,暴力都没的打...还是理解错题意了,操作不同位置不是说改不同的区间,而是不同操作的顺序...考场上如果知道这个的话最少暴力拿一半啊,因为正解本来就 ...

  10. webRTC中语音降噪模块ANS细节详解(一)

    ANS(adaptive noise suppression) 是webRTC中音频相关的核心模块之一,为众多公司所使用.从2015年开始,我在几个产品中使用了webRTC的3A(AEC/ANS/AG ...