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. 腾讯云与 Grafana Labs 达成深度合作, 推出全新 Grafana 托管服务

    9 月 23 日,腾讯云宣布与业界领先的开源数据可视化公司 Grafana Labs 达成深度合作协议,共同开发和验证全新的 Grafana 托管服务,通过 Grafana Labs 开源软件与腾讯云 ...

  2. Jmeter目录分析

    通讯协议 最重要的基础知识. 性能测试的原理?通过协议模拟压力 jmeter目录结果解析 bin docs,文档 lib,存放库文件,所依赖的jar包 ext jmeter自己的jar包 jmeter ...

  3. javascript 字符串反转 strip_tags 字符串常用的自定义函数,加载css etc.

    字符串反转 String.prototype.reverse = function() { var a = this.split(''); for (var i = 0, j = a.length-1 ...

  4. 使用Postman做接口测试(学生信息的6个接口)

    使用postman做接口测试,案例中涉及到接口有:获取学生信息.登录.添加学生信息.学生金币充值.获取所有学生信息.文件上传. 一.获取学生信息(get请求) 请求方式选择:get 直接在访问地址栏中 ...

  5. P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

    正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个\(n*m\)的矩形\(A\),然后给出一个\((n-1)*(m-1)\)的矩形\(B\) ...

  6. JuiceFS v0.17 发布,通过 1270 项 LTP 测试!

    小伙伴们大家好,JuiceFS v0.17 在国庆小长假来临之际如期发布了!这是我们在 2021 年秋季推出的第二个版本,让我们直奔主题,看看都有哪些新变化吧. 本次更新累计 80+ 提交,共有 9 ...

  7. salesforce零基础学习(一百零八)MFA

    本篇参考:https://security.salesforce.com/mfa https://sfdc.co/bvtuQT  (MFA官方研讨会的文档) https://sfdc.co/iwiQK ...

  8. Java-多态(上)

    什么是多态 同一方法可以根据发送对象的不同而采取多种不同的行为方式 一个对象实际类型是确定的 但指向其引用类型却有很多 注意事项 多态是方法的多态 属性没有多态 父类和子类 有联系 类型转换异常 Cl ...

  9. 峰值利用率80%+,视频云离线转码自研上云TKE实践

    作者 刘兆瑞,腾讯云高级研发工程师,负责腾讯明眸极速高清,画质重生等产品.专注于codec优化,画质增强等技术. 背景和问题 随着流量资费的降低和带宽的增加,视频成为人们获取信息越来越重要的方式,随之 ...

  10. iframe、SameSite与CEF

    iframe.SameSite与CEF 背景 本人使用CEF(或是Chrome)来加载开发的前端页面,其中使用iframe嵌入了第三方页面,在第三方页面中需要发送cookie到后端,然而加载会报错,第 ...