springBoot健康检查与k8s探针

news2024/11/13 10:22:42

从springBoot健康检查到k8s探针的问题定位

环境:

k8s、springboot、mysql、flyway、Spring boot 2.0 Actuator健康检查组件等

问题:

项目中集成了flyway,当项目第一次启动时,都会初始化flyway文件,再加上各种组件的初始化,导致主服务启动的时间达到7分钟;

另外pod有时候会自动重启,如果在初始化flyway时中断重启,那么下次启动时程序会报flyway的问题,导致服务永远起不来;

查看pod状态,一直显示健康检查失败;

现象:

健康检查失败:

在这里插入图片描述

pod重启了3次,显示running状态,但是并没有ready;

程序日志:报flyway初始化异常;

排查过程:

1、服务启动慢,启动过程中突然中断,以为服务器内存不够或者cpu不够

给服务加内存:

resources:
  requests:
    memory: 6Gi
    cpu: 0.5
  limits:
    memory: 8Gi
    cpu: 1

在服务启动时,一直使用命令查看pod占用内存情况:

kubectl top pod

发现启动时,内存就只吃了几百兆,cpu也只用的500m左右;

2、经过步骤一的步骤排查,确定不是服务器环境问题;但是启动过程中老是中断,而且查看pod状态时,显示健康检查拒绝;服务就算不中断,启动起来也需要个六七分钟:

仔细看了看服务yaml的健康检查参数:

# 存活探针
livenessProbe:
  httpGet:
    path: /iot/sacp/actuator/health		# 健康检查接口
    port: sacp
    scheme: HTTP
  timeoutSeconds: 30			# 访问接口的超时时间
  initialDelaySeconds: 20		# 初始化延迟时间  即20s开始访问健康检查接口
  periodSeconds: 10				# 20s后 每10s访问一次健康检查接口 探测频率
  successThreshold: 1			# 探测至少成功1次,就认为pod是健康的
  failureThreshold: 20			# 探测连续失败20次,任务此pod是不健康的; 此时kubectl会重启pod
# 就绪探针
readinessProbe:
  failureThreshold: 20
  initialDelaySeconds: 20
  periodSeconds: 10
  successThreshold: 1
  tcpSocket:
    port: sacp
  timeoutSeconds: 30

总结起来就是:由于程序启动过慢,健康检查探测了20 + 20*10 = 220s;程序还没有起来;此时kubectl会自动重启容器;如果处于flyway文件初始化阶段,那么中断了初始化,程序就会一直起不来;如果重启之后能够正常起来,则pod状态仍然是健康检查失败,拒绝健康检查;

健康检查一直被拒绝、失败的原因是,因为pod一直起不来,健康检查接口访问不通,所以拒绝、失败;pod中断则是因为健康检查失败次数太多,kubectl依照重启策略进行了中断重启;

修复:

使用启动探针startupProbe:k8s在 v1.16 中添加了 startup 探针作为 Alpha 功能,并在 v1.18 中升级为 Beta;

当程序启动时,就开启动启动探针,然后开始探测,只要探测成功一次,就不在探测(说明程序启动成功),此时存活探针和就绪探针才会开始工作;通过将 failureThreshold * periodSeconds 参数设置为足够长的时间来应对糟糕情况下的启动时间;

startupProbe:
  httpGet:
    path: /iot/sacp/actuator/health
    port: sacp
    scheme: HTTP
  failureThreshold: 37		
  periodSeconds: 10

大概估一下程序启动的时间六七分钟;因此设置 37 * 10 = 370s; 这意味着当程序启动,有370s的启动时间,启动探针在这个过程中一直探测,只要程序探测成功一次,存活探针才会工作;那么我们的pod就不会再发生中断重启了;

环境组件的简单使用:

springBoot Actuator:
项目引入依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

只要加上了这個 maven dependency,SpringBoot 在运行时就会开放/actuator/health和/actuator/info这两个endpoint,我們就可以通过这两个 endpoint 查看当前 SpringBoot 运行的情況;

暴露和关闭端点简单配置:
# 开放所有端点endpoints(不包含shutdown端点)
management.endpoints.web.exposure.include=*
 
# 指定开放某些端点
management.endpoints.web.exposure.include=beans,mappings
 
# exclude用来关闭端点
# exclude通常会跟include一起用,就是先include了全部,然后再exclude /actuator/beans这个endpoint
management.endpoints.web.exposure.exclude=beans
management.endpoints.web.exposure.include=*
 
# 如果要开放/actuator/shutdown,要在额外加上这一行
management.endpoint.shutdown.enabled=true
k8s 探针:
启动探针:startupProbe

使用启动探针保护慢启动容器;有时候,会有一些现有的应用在启动时需要较长的初始化时间,在这种情况下,如果没有配置启动探针,而直接配置存活探针,可能容器在启动过程中,健康检查长时间没有响应,达到存活探针的失败次数,会中断启动而重新启动容器;

在一些情况下,往往只是新的Pod完成自身初始化,系统尚未完成EndPoint、负载均衡器等外部可达的访问信息刷新,老得Pod就立即被删除,最终造成服务短暂的额不可用,这对于生产来说是不可接受的;

存活探针:livenessProbe

readiness 探针可以让 kubelet 知道应用程序何时准备接受新流量,如果应用程序在进程启动后需要一些时间来初始化状态,要配置 readiness 探针让 Kubernetes 在发送新流量之前进行等待;

就绪探针:readinessProbe

Liveness 探针liveness 探针用于重新启动不健康的容器。Kubelet 会定期地 ping liveness 探针,以确定健康状况,并在 liveness 检查不通过的情况下杀死 Pod。liveness 检查可以帮助应用程序从死锁中恢复。如果不进行 liveness 检查,Kubernetes 会认为死锁中的 Pod 处于健康状态,因为从 Kubernetes 的角度来看,Pod 的子进程仍在运行,是健康的。通过配置 liveness 探针,kubelet 可以检测到应用程序处于不健康状态,并重新启动 Pod 以恢复可用性;

三种探针共有配置:
  • initialDelaySeconds:启动 liveness、readiness 探针前要等待的秒数。
  • periodSeconds:检查探针的频率。
  • timeoutSeconds:将探针标记为超时(未通过运行状况检查)之前的秒数。
  • successThreshold:探针需要通过的最小连续成功检查数量。
  • failureThreshold:将探针标记为失败之前的重试次数。对于 liveness 探针,这将导致 Pod重新启动。对于 readiness 探针,将标记 Pod 为未就绪(unready);

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

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

相关文章

水文模型有哪些?SWAT模型、VIC模型、HEC模型、HSPF模型、HYPE模型、SWMM模型、FVCOM模型、Delft3D模型等应用

目录 ㈠ 从小白到精通SWAT模型学习建模方法、实例应用、高级进阶 ㈡ RVIC模型融合实践技术应用及未来气候变化模型预测 ㈢ HEC-RAS一维、二维建模方法及实践技术应用 ㈣ HEC-HMS水文模型实践技术应用 ㈤ HSPF 模型应用 ㈥ HYPE分布式水文模型建模方法与案例分析 ㈦ 基于…

raspberry安装ffmpeg以及扩展了解

文章目录ffmpeg简介使用ffmpegffplay播放控制命令播放滤镜处理参数选项ffprobeffmpeg sudo apt-get install ffmpeg简介 FFmpeg的名称来自MPEG视频编码标准&#xff0c;前面的“FF”代表“Fast Forward”&#xff0c;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0…

Godot Engine 4.0横空出世,Vulkan大怪兽加持,画质提升简直亮瞎眼

【CSDN 编者按】经历了漫长的等待&#xff0c;万众瞩目的 Godot Engine 4.0 正式版在其 3.0 版本发布 5 年以后&#xff0c;终于带着海量令人兴奋的新功能横空出世&#xff01; 整理 | 开发游戏的老王 责编 | 王子彧 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09…

优思学院|盘点,精益生产25个工具!【必需收藏】

精益生产方法需要一种全面的方法才能有效实施。精益这个概念是每个接触产品供应链的人都要实践的&#xff0c;无论是在计划方面还是在分析方面。 精益生产工具有助于持续改进生产效率和产品或服务质量。精益工具是要减少 Muda &#xff08;浪费&#xff09;&#xff0c;从生产过…

内存清理、动画制作、CPU检测等五款实用软件推荐

人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1.内存清理软件——MemReduct MemReduct是一款内存清理软件&#xff0c;现在越来越多的软件由于硬件的普遍发展&#xff0c;对内存的使用都开始肆无忌惮起来&…

【C++】list的使用和基本迭代器框架的实现 vs和g++下string结构的说明

真正的成熟应该并不是追求完美&#xff0c;而是直面自己的缺憾&#xff0c;这才是生活的本质。 文章目录一、初见list1.list的迭代器失效和基本使用2.list的operations操作接口&#xff08;看起来挺不错的接口&#xff0c;但可惜不怎么实用&#xff09;3.vector和list的排序性能…

Linux系统基础命令(二)

一、浏览和切换目录 ls命令&#xff1a;列出文件和目录&#xff0c;主要用于列出文件和目录 CentOS的终端默认是有颜色标注的。一般来说&#xff1a;蓝色--->目录&#xff1b;绿色-->可执行文件&#xff1b;红色--->压缩文件&#xff1b;浅蓝色--->链接文件&#…

Java并发类库提供的线程池有哪几种? 分别有什么特点?

第21讲 | Java并发类库提供的线程池有哪几种&#xff1f; 分别有什么特点&#xff1f; 我在专栏第 17 讲中介绍过线程是不能够重复启动的&#xff0c;创建或销毁线程存在一定的开销&#xff0c;所以利用线程池技术来提高系统资源利用效率&#xff0c;并简化线程管理&#xff0c…

计算机网络总结

第一章 互联网 互连网&#xff1a;局部范围互连起来的计算机网络&#xff0c;与网络相连的计算机常称为主机。 互联网&#xff1a;当今世界上最大的计算机网络&#xff0c;Internet 两个基本特点 连通性&#xff0c;资源共享(信息&#xff0c;软件&#xff0c;硬件) 计算…

Ubuntu18安装新版本PCL-1.13,并和ROS自带PCL-1.8共存

文章目录1.安装新版本PCL-1.132.在工程中使用新版本的PCL-1.133.pcl-1.13误装到/usr/local/下如何卸载1.安装新版本PCL-1.13 下载PCL-1.13代码&#xff1a; 修改CMakeLists.txt文件&#xff0c;不编译vtk相关的代码&#xff1a;vtk的问题比较难解决&#xff0c;但是一般我们安…

科技大势怎么看 2023怎么干?

2023年&#xff0c;科技的走向依旧是世界各国的关注重点&#xff0c;各国在纷纷设立自己的科技战略目标外&#xff0c;还在潜心研究不同技术领域的科技趋势&#xff0c;试图通过科技占据国际竞争的制高点。 随着我国深入实施创新驱动发展战略&#xff0c;推动产业结构优化升级&…

数据结构1——概念与程序复杂度

翻陈年老底翻到了之前的数据结构笔记&#xff0c;由于当时刚开始使用电脑记笔记&#xff0c;markdown语法用的还是不是很熟&#xff0c;以及技术上比较欠缺&#xff0c;望多多海涵。 来都来了&#xff0c;点个赞呗~ 数据结构大体框架 早期>>数值计算>>计算机元素…

配置主机名与ip的映射关系

本次进行简单的小实验 通过在windows上配置主机名与IP地址的映射关系&#xff0c;达到我们在xshell或其他远程连接设备上&#xff0c;不用IP地址登陆&#xff0c;只需要用主机名就能实现登陆的效果 配置 首先 需要查看自己虚拟机的IP地址&#xff0c;找到ens33或者ens160…

[项目] Boost搜索引擎

目录 1.项目相关背景 2.项目宏观原理 3.技术栈和项目环境 4.正排索引&&倒排索引 5.去标签与数据清洗 6.构建索引模块Index 6.1正排索引 6.2 建立倒排 jiebacpp使用 建立分词 7.搜索引擎模块Searcher Jsoncpp -- 通过jsoncpp进行序列化和反序列化 处理Cont…

Vscode中Vue文件保存格式化、 ElementUI、Font Awesome俩大插件使用

Vscode中Vue文件老一片红色出现格式错误&#xff1f;&#xff1f;如何运行别人的项目&#xff08;没有node_modules文件&#xff09;&#xff1f;&#xff1f;选用组件与图标&#xff1f;&#xff1f; 解决问题一 前提有&#xff1a;Prettier ESLint插件、ESLint插件 1.打开s…

Git图解-常用命令操作-可视化

目录 一、前言 二、初始化仓库 2.1 设置用户名与邮箱 2.2 初始化仓库 三、添加文件 四、查看文件状态 五、查看提交日志 六、查看差异 七、版本回退 八、删除文件 九、分支管理 9.1 创建分支 9.2 切换分支 9.3 查看分支 9.4 合并分支 十、文件冲突 十一、转视…

ROS从入门到精通系列(二十九)-- linux封装ROS 自启动脚本及可执行程序App

机器人分布式处理架构ROS分布式架构,HiBot架构主要使用C/S架构,其中HibotServer为服务器,Muqutte为消息服务器中间件,HiBotClient为运行在机器人上的客户端。主要实现了机器人任务的远程部署、监控、控制三大功能,机器人平台依赖于ROS。其架构如下图所示 Img Src: https:/…

第53篇-某商城sign参数分析-webpack【2023-03-07】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…

【NLP相关】XLNET原理以及案例

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

类成员的方法

初识对象 生活中或是程序中&#xff0c;我们都可以使用设计表格、生产表格、填写表格的形式组织数据进行对比&#xff0c;在程序中&#xff1a; 设计表格&#xff0c;称之为&#xff1a;设计类&#xff08;class&#xff09; 打印表格&#xff0c;称之为&#xff1a;创建对象 …