K8s Liveness/Readiness/Startup 探针机制

news2024/11/25 6:59:26

k8s-cert

官方参考文档


目录

    • 前言
    • 一、默认健康检测
      • 1.1 restartPolicy
      • 1.2 测试案例
    • 二、Liveness
    • 三、Readiness
    • 四、Startup


前言

玩过 Docker Swarm 的应该都知道,有一种功能叫自愈功能,当集群检测到节点或服务故障时回进行自动故障转移,从而保障业务的可用性。而 K8s 集群相对于其他集群体系,其自愈能力更加强大,这也是 K8s 容器编排引擎的一重要特性。自愈从某种角度上来讲,其实现了以下几几种功能特性:

  • 零停机部署;
  • 避免无效镜像;
  • 实现滚动升级与回退。

K8s 有三种探针,分别是:存活(Liveness)就绪(Readiness)启动(Startup)

  • 存活(Liveness):kubelet 使用存活探针来确定什么时候要重启容器。 例如,存活探针可以探测到应用死锁(应用程序在运行,但是无法继续执行后面的步骤)情况。 重启这种状态下的容器有助于提高应用的可用性,即使其中存在缺陷。

  • 就绪(Readiness):kubelet 使用就绪探针可以知道容器何时准备好接受请求流量。当一个 Pod 内的所有容器都就绪时,才能认为该 Pod 就绪。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。 若 Pod 尚未就绪,会被从 Service 的负载均衡器中剔除。

  • 启动(Startup):kubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针,你就可以控制容器在启动成功后再进行存活性和就绪态检查, 确保这些存活、就绪探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被杀掉。

K8s 探针有三种探测方式,分别是:ExecActionHTTPGetActionTCPSocketAction

注意,这三种探测方式只能同时使用一种,不能两种或三种同时使用。

  • ExecAction:在容器中执行指定的命令,如果执行成功,退出码为0则探测成功。
  • HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康。
  • TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP连接,则表明容器健康。

探针探测的结果有以下值:

  • Success:表示通过检测。
  • Failure:表示未通过检测。
  • Unknown:表示检测没有正常进行。

一、默认健康检测

1.1 restartPolicy

了解 Docker 的都知道,每个容器启动时都会执行一个进程,该进程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果进程退出或返回状态码为非零时,则认为容器发生故障,这个时候 K8s 就会根据 restartPolicy 重启容器。restartPolicy 有三种重启策略:

  • Always

    Pod 中容器不论如何停止都将自动重启;

  • OnFailure
    Pod 中容器非正常停止会自动重启,正常停止不会重启;

  • Never
    Pod 中容器不论以任何方式停止,都不会自动重启。

K8s 的 restartPolicy 默认为 Always。如果探针超过失败重试的次数,则 Pod 就会根据 restartPolicy 策略进行选择是否重启。

1.2 测试案例

1、创建一个 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: healthcheck
  name: healthcheck
spec:
  restartPolicy: OnFailure
  containers:
  - name: healthcheck
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10;exit 1

2、观察 Pod 状态

这个容器启动 10s 后会发生故障,接下来执行 kubectl apply 创建 Pod,Pod Name 为 healthcheck。过几分钟后看看 Pod 的状态:

image-20221222110433382

可看到已经重启了三次,该案例中容器进程返回值为非零,k8s 则认为容器发生故障,需要重启。但可能有些情况下发生了故障进程不退出的现象,如访问 Web 服务器时返回 500 错误代码,这可能是系统负荷较大或资源锁死,此时 httpd 进程并没有异常退出,这种情况下可直接重启容器。而 K8s 的 Liveness 机制刚好能解决此类问题(即出现此类问题会直接 Kill 掉容器并重新启动)。

二、Liveness

Liveness 探针让用户可以自定义判断容器是否健康的条件,如果探测失败,K8s 就会重启容器,如下案例:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

在这个配置文件中,可以看到 Pod 中只有一个 ContainerperiodSeconds 字段指定了 kubelet 应该每 5 秒执行一次存活探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒(即 5 秒后才开始启动探针)。 kubelet 在容器内执行命令 cat /tmp/healthy 来进行探测。 如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的。 如果这个命令返回非 0 值,kubelet 会杀死这个容器并重新启动它。当容器启动时,会执行如下的命令:

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600"

这个容器生命的前 30 秒,/tmp/healthy 文件是存在的。 所以在这最开始的 30 秒内,执行命令 cat /tmp/healthy 会返回成功代码。 30 秒之后,执行命令 cat /tmp/healthy 就会返回失败代码。

执行 kubectl apply 创建 Pod 。

kubectl apply -f liveness.yml

查看 Pod 启动日志:

kubectl describe pod liveness-exec

前 30s /tmp/healthy 文件是存在的:

image-20221222113744208

35s 后检测到/tmp/healthy 文件已经不存在:

image-20221222114051362

再过十几秒后容器被重启:

image-20221222114308594

三、Readiness

除了可以自定义判断容器是否健康的条件外,用户也可以通过 Readiness 探针告诉 K8s 什么时候可以重启容器实现自愈,Readiness 探针则告诉 K8s 什么时候可以将容器加入到 Service 负载均衡池中,对外提供服务。就绪探针的配置和存活探针的配置相似。 唯一区别就是要使用 readinessProbe 字段,而不是 livenessProbe 字段。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness
  name: readiness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

看看启动日志,与 Liveness 探针类似

kubectl describe pod readiness-exec

image-20221222121220005

Probe 有很多配置字段,可以使用这些字段精确地控制启动、存活和就绪检测的行为:

  • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0。
  • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
  • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
  • successThreshold:探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
  • failureThreshold:当探测失败时,Kubernetes 的重试次数。 对存活探测而言,放弃就意味着重新启动容器。 对就绪探测而言,放弃意味着 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。

注意:存活探针 不等待 就绪性探针成功。如果要在执行存活探针之前等待就绪性探针,应该使用 initialDelaySecondsstartupProbe

四、Startup

Startup 是 k8s 1.16+ 版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果同时配置了 startuprobeLivenessprobeReadinessprobe,K8s 就会先禁用其他的探针,而首先使用 startuprobe 探测直到它成功为止,成功后将不再进行探测。

startupProbe 探针与另两种区别?

  • 如果三个探针同时存在,先执行startupProbe探针,其他两个探针将会被暂时禁用,直到pod满足startupProbe探针配置的条件,其他2个探针启动,如果不满足按照规则重启容器。

  • 另外两种探针在容器启动后,会按照配置,直到容器消亡才停止探测,而startupProbe探针只是在容器启动后按照配置满足一次后,不在进行后续的探测。

那 Startup 存在的意义又是什么呢?

试想一个问题,如果启动一个服务需要 1 分钟,如果没有 Startup 的情况下,且假设我们配置了 livenessProbe 探针,具体如下:

livenessProbe:
  httpGet:
    path: /test
    prot: 80
failureThreshold: 6
initialDelay:40
periodSeconds: 5

我们设置了失败重试次数为 6,每 5 秒探测一次,加上我们探测前等待的 40 秒,总时间就是:40 + 6 x 5 = 70s,这样 Pod 确实能够启动起来。那问题又来了,如果这个配置用于生产配置上,将会导致我们比较晚的收到服务不可用的情况,也就是说我的服务可能在 5s 时已经不可用,但是由于我们探测机制(有 6 次失败重试的机会),我们在至少 6 x 5 = 30s 才会发现服务不可用的情况,这在生产上一般是不被允许的。那该如何解决类似这样的问题呢?答案是 startupProbe

注意上面这个案例,如果 failureThreshold 设置为 1 或 2,那这个服务是永远起不起来的,因为你把 initialDelay 的时间算上也不足 1 分钟,因为我们说启动至少需要 1 分钟,那超过失败重试次数后,就会根据 Pod 的 restartPolicy 来重启容器。

接着我们引入 startupProbe,继续优化:

livenessProbe:
  httpGet:
    path: /test
    prot: 80
failureThreshold: 1
initialDelay:5
periodSeconds: 5

startupProbe:
  httpGet:
    path: /test
    prot: 80
failureThreshold: 60
initialDelay:5
periodSeconds: 5

前面说了,startupProbe 会在探测成功后停止探测,而其他两种探针则是随着 Pod 的生命周期一直在探测的。因此上面的配置功能就是:K8s 部署服务后会在 5s 后启动 startupProbe,在 5 x 60 = 300s 的时间内只要成功探测到服务则停止探测(否则需接受 Pod 的重启策略进行重启),并启用 livenessProbe 探针,此时livenessProbe 探针就会伴随着 Pod 的生命周期每 5s 检测一次,且我们只设置了 1 次失败重试的机会,这就意味着我们只需要在 1 x 5 = 5s 时间就可以发现服务不可用。因此,你配置了 startupProbe,那其他2种探针如果配置了initialDelaySeconds,建议时间就不要给太长。这就是 Startup 探针存在的意义。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python循环语句条件控制语句

一、while循环 1、条件为true,执行循环体;条件为false,退出循环体; while 判断条件: 执行语句 2、单纯的while语句 3、配合if条件句使用 4、配合else使用 二、for循环 即可迭代的对象; 如何判断对象是否可迭代&…

python之tkinter学习

python图形化界面导论为窗口命名(root.wm_title(""))label类(仅用来显示信息)仅有一个标签多标签按钮command绑定事件bind绑定事件为button设置属性pack的布局grid布局事件及其绑定bind函数中的事件类型解绑输入框菜单子…

SEO 基础知识遇上圣诞节

*2022年圣诞节到来啦,很高兴这次我们又能一起度过~ SEO 基础知识 文章目录 SEO 基础知识1、SEO是什么2、SEO工作内容3、网站排名的流程数据4、认识搜索引擎爬虫4.1 什么是爬虫4.2 模拟普通用户5、网络爬虫的管理规则6、用数据快速提升网络权重7、其他工具1、SEO是什么 SEO 即…

【Javassist】快速入门系列08 当检测到对象(不包括数组)创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

Docker Desktop 4.15 正式发布,这里是新功能

Docker Desktop 4.15 正式发布,这里是新功能 Docker Desktop 4.15现在可用于所有平台:Linux、Windows 和 macOS。它附带 Docker Compose v2.13.0、Containerd v1.6.10 和 Docker Hub Tool v0.4.5 2 主要亮点 VirtioFS 正式发布新的快速搜索功能在任何…

杨校老师课堂之JDK1.8下载、安装与环境变量配置

一、安装 1. 安装引导 2. 修改安装目录(路径) 3. 选择后的路径如下: 4. JRE的安装【可选】 5. 成功安装 二、配置 环境变量配置 1. 进行校验 win R 打开cmd窗口 在新建cmd内,输入javac,出现下列内容,即表示未配置成功。目前尚…

Eclipse 插件 ERMaster安装与使用

ERMaster 是什么? ERMaster是制作ER图(Entity Relationship Diagram,实体关系图)的Eclipse插件。 提供了从数据库导入、Excel表定义簿制作、图片输出、DDL输出等功能。支持的数据库包括: MySQLOraclePostgreSQLDB2HS…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间,这样会增大内核风险。相反,内核抽象出Handle给用户态,不管是文件、进程、线程等对象,通过Handle可以隐藏内核细节,统…

C++不知算法系列之解析回溯算法中的人文哲学

1. 前言 回溯算法让我想起“退一步海阔天空”的名言。当事情的发展到了绝境或是边缘时,可以试着后退一步,换一个方向、换一种策略,或许会看到新的出路或生机。 回溯算法的精髓:无所畏惧而不固执,善于在变通中迂回。故…

基于PyTorch的图像数据归一化min-max normalization和zero-mean normalization操作实践对比分析

本文紧接前文: 《python基于不同方法实现特征工程常用的归一化技术Normalization对比分析》 前文主要是讲解对于数值型特征数据在特征工程或者是数据处理阶段往往需要用到数据尺度归一化操作,基于原生的对象和numpy第三方库分别实现了按列归一化计算和…

一文告诉你什么是开源表单系统

熟悉市场的人都知道,传统的表单存在效率低的瓶颈,无法满足当前很多企业的业务需求。开源表单系统也是顺应时代发展需求应运而生的产物,在提升企业办公效率和协作效率,推动企业数字化转型方面意义重大。今天这篇文章就告诉大家什么…

《计算机网络》——第一章知识点

考试题型: 选择题填空题判断题简答题计算题ISP:因特网服务提供者/因特网服务提供商,是一个向广大用户综合提供互联网接入业务、信息业务、和增值业务的公司,如中国电信、中国联动、中国移动等。分为主干ISP、地区ISP和本地ISP。 计算机网络∶利用通信线…

前端的实例化是什么?

我们在用vue框架的时候,总是会看到各种各样的实例化或者说实例化对象(实例) 所以这篇文章就谈一下什么是实例化和实例化对象(实例),以及为什么要实例化的问题 前端的实例化是什么?vue的createApppinia的实例化为什么要实例化再一次回答上面这…

关于缓存问题的思考与总结

提到缓存,最容易想到的便是Redis了。Redis凭借其出色的性能表现,十分适合做缓存。那么为什么需要缓存这个东西以及缓存用在哪些地方呢? 一、基本原理 存储层次模型 注:也是背景来源 想要设计好的架构或者应用、程序&#xff0c…

Maven安装配置的保姆级教程

前言 下面是关于maven的一些介绍: maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等maven的好处在于可以将项目过程规范化、自动化、高效化以及…

C++程序设计——继承与派生

更多内容可以查看系列文章C语言入门全教程(持续更新) 目录 前言 一、继承的概念 1.楔子 2.派生类的定义 3.继承和派生的意义 4.案例1:派生类的定义 二、继承方式 1.公有继承(public) 2.保护继承(…

网络拓扑结构可视化呈现方案

随着数字化进程的加速,企业网络中设备的数量日益快速增长,网络规模逐渐庞大,组网结构、IT 环境变的无比复杂,需要花费大量的时间和资源去监测网络运行状态,诊断解决故障问题。面对不断趋向复杂化和多样化的网络规模和结…

Mac M1使用Docker报错 Failed to get D-Bus connection: No such file or directory的解决方案

0x00 前言 最近在Mac上安装docker的CentOS7镜像,打算开个sshd服务,使用命令: $ systemctl start sshd结果在启动sshd服务的时候提示报错: Failed to get D-Bus connection: No such file or directory0x01 运行环境 版本MacOS…

《Qt开发》基于QwtPolar的极坐标图绘制

QwtPolar绘制极坐标图 该示例包含以下功能: 使用QwtPolarPlot绘制极坐标曲线实现曲线的缩放和平移调整极坐标为顺时针顺序1. 创建项目 创建项目名称为QwtPolarDemo1,并添加一个Qt5Class类,命名为myPlot。 2. 配置项目 在项目——属性——C/C——常规…

【C++】——初识C++(一)

文章目录1. 进入C1.1 main()函数1.2 C注释1.3 C预处理器和iostream文件1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.6.1 控制符endl1.6.2 换行符1.6.3 使用cout进行拼接1.7 cin1.8 变量1.8.1 变量名1.9 常量1.10 关键字1. 进入C 第一个程序 // my…