论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
容器及微服务
›
容器及微服务
›
kubernetes健康检查liveness readiness startupProbe探 ...
kubernetes健康检查liveness readiness startupProbe探针
锦通
论坛元老
|
2023-4-4 14:14:52
|
显示全部楼层
|
阅读模式
楼主
主题
1581
|
帖子
1581
|
积分
4743
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
由于历史项目跑在kubernetes中 出现了一些如下问题
程序发布的时候 新版本的pod还没有启动成功 老版本的pod就已经停止了 ,这就导致部分请求访问到了新pod,由于新pod内程序还没有启动成功,所有这部分请求就以失败告终。还有可能新pod 启动失败了 就会出现pod一直在重启 然而服务又不可用。
运行中的pod 因为网络或者某种原因导致服务暂时不可用,对于kubernetes来说pod是状态是正常的,这时候的业务流量也可能会分发在次pod中,也是会报错误失败。
如何让kubernetes定义pod是否健康 是否启动成功?
健康检查
当前的kubernetes版本为 v1.19 提供了三种健康检查。
存活探针 livenessProbe:通过检测容器响应是否正常来决定是否
重启
如果此探针检查失败 会重启容器
就绪探针 readinessProbe: 用来确定容器是否已经就绪可以
接受请求
如果配置了就绪探针 只有通过探针检查后 才会认为pod具备访问的能力,kubernetes才会把ip port 加入到service中的endpoint中去,反之失败也会从endpoint中移除,这样流量就不会被分配到没有准备好的容器中去。
启动探针 startupProbe: 检测容器内应用是否
已经启动
v1.18+才支持
启动探针在没有探测成功之前 livenessProbe、readinessProbe 探针会处于禁用状态。基于此特性 就可以避免livenessProbe由于一直失败 一直重启容器的死锁问题。
这3种探针都分别提供3种探测方式
exec 执行命令行检查 如果返回值为0,则认为容器健康。
httpGet HTTP请求检查 如果状态码为200~400之间,则认为容器健康
tcpSocket TCP端口检查 如果端口是通的就认为容器健康。
由于项目使用SpringBoot 2.2.6项目 就自然使用到了spring-boot-starter-actuator包,
注意
这里不同的Boot版本有点区别 如1.x,2.2.x和2.3 配置暴露指标的访问有些不一样。
springboot2.3+版本 还有提供 可读就绪指标/actuator/health/readiness 和 存活指标/actuator/health/liveness接口 可以直接分别用于kubernetes的就绪探针和存活探针。由于这里使用的2.2.6就都使用/actuator/health指标。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
配置暴露health指标
management.endpoints.web.base-path=/actuator
management.endpoints.web.exposure.include=health
复制代码
配置启动探针检查 理论是只有应用启动成功之后 才能对外提供服务 所以配置了httpGet探针来探测容器内 ip:port/actuator/health地址 如能成功返回200则认为是启动成功。
startupProbe: # 启动探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 30
复制代码
这里额外配置了一些指标参数。三种探针 startupProbe 、livenessProbe、readinessProbe 都是一样的配置 这也是kubernetes在健康检查的配置上做得比较优秀的地方。
periodSeconds 检查周期(s) 多少秒去检查一次
initialDelaySeconds 延迟时间 (s) pod启动后 延迟多少时间 (s)后再去检查
timeoutSeconds 超时时间 (s) 访问探测方式的超时时间 如上面访问 ip:port/actuator/health如果5秒还没有返回则认为是超时失败。
successThreshold 成功阈值 (次数) 默认情况下 只要有1次访问成功 就算成功
failureThreshold 最大失败次数 如上面配置的30次 30次都尝试都失败就表示Pod启动失败。这里可以配合periodSeconds参数来控制某些程序启动耗费时间太长的问题 如上面配置30*10=300s都没有成功的话 就失败。
配置存活探针 其目的是为了探测保证程序假死的情况
livenessProbe: # 存活探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 10
复制代码
配置就绪探针 其目的是为了探测保证程序随时都可用 如果就绪探针出现不可用的时候 会剔除service中的endpoint的ip port。保证流量只分发到可用的容器中去。
readinessProbe: # 就绪探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 10
复制代码
这3中探针并不是必须都要配置, 需要视情况配置,如果不配置的情况下 默认按照Pod状态读取。如果Pod状态是成功 那么就认为是存活的、就绪的。
遇到的问题
刚开始只配置了存活探针和就绪探针。导致启动的时候 存活探针一直失败达到了重启的条件。就出现一直重启pod的情况。后面加了启动探针 保证启动时间周期内不触发就绪探针。尽可能的配置failureThreshold * periodSeconds 来包容最坏情况下的启动耗时。
部分服务出现deadline的情况
context deadline exceeded (Client.Timeout exceeded while awaiting headers) Back-off restarting failed container
可以把timeoutSeconds 配置调节大几秒钟。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
锦通
论坛元老
这个人很懒什么都没写!
楼主热帖
漏洞利用
快速入手node.js
vue3 - 最新详细实现 “拖曳式课程表“ ...
奇怪,为什么ArrayList初始化容量大小 ...
医院HIS体系厂家统计
如何成为一位人心所向的管理者?我的经 ...
Kubernetes(k8s)pod详解
理解MVCC
如何在文章中设置灰色文本框(正文底色 ...
Vue实现复制粘贴功能
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Mysql
数据仓库与分析
IOS
开源技术
Oracle
公有云
物联网
快速回复
返回顶部
返回列表