Kubernetes 健康检查机制详解:三类探针与三种探测方法落地实践

发布时间:2026/9/28 15:50:29

Kubernetes 健康检查机制详解:三类探针与三种探测方法落地实践 Kubernetes 健康检查机制详解三类探针与三种探测方法落地实践Kubernetes Health Check环境准备Health CheckProbe TypeChecking MethodsHTTP Checks-httpGetlivenessProbereadinessProbeExecution Checks-execTCP Socket Checks-tcpSocketHealth Check CaseHealth Check 在 Scale Up 中的应用Health Check 在滚动更新中的应用如果没有配置Health Check 会出现怎样的情况环境清理Kubernetes Health Check摘要本文全面介绍了 Kubernetes 中的健康检查机制包括三种探针类型LivenessProbe、ReadinessProbe、StartupProbe和三种检查方法HTTP Checks、Execution Checks、TCP Socket Checks。通过实际示例演示了如何配置和使用这些探针并探讨了健康检查在 Scale Up 和滚动更新等场景中的应用价值。文章还提供了环境准备和清理的完整操作指南帮助读者深入理解 Kubernetes 如何通过健康检查确保应用的高可用性。学习参考配置存活、就绪和启动探针环境准备rootmaster30:~# kubectl create ns healthrootmaster30:~# kubectl config set-context --current --namespace healthHealth Check应用可能会因为各种问题变的unhealthy例如临时连接断开配置错误应用本身错误。kubelet 使用probes探针周期性地监控容器中应用是否为healthy状态进一步决定什么时候要重启容器。 例如当存活探针可以探测到应用死锁应用在运行但是无法继续执行后面的步骤情况进而重启pod有助于提高应用的可用性即使其中存在缺陷。没有探测的情况看一个例子# 创建一个普通 podrootmaster30:~# kubectl run web --imagehub.laoma.cloud/library/httpd --image-pull-policyIfNotPresent[rootlaoma20 health]# kubectl describe pod web|grep ^IP:IP:10.224.73.16 rootmaster30:~# curl 10.224.73.16htmlbodyh1It works!/h1/body/html# 删除主页文件即使pod中应用数据丢失pod状态依然为Runningrootmaster30:~# kubectl exec web -- rm -f htdocs/index.html# 查看主页内容rootmaster30:~# curl 10.224.73.16!DOCTYPE HTML PUBLIC-//W3C//DTD HTML 3.2 Final//ENhtmlheadtitleIndex of //title/headbodyh1Index of //h1ul/ul/body/htmlrootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web1/1 Running051s# 清理环境rootmaster30:~# kubectl delete pod web --forceProbe Typekubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针存活探针和就绪探针成功之前不会重启确保这些探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测避免它们在启动运行之前就被杀掉。LivenessProbe用于确定pod中应用是否处于healthy状态。如果liveness probe检测的状态为unhealthy则控制器将重新启动pod。ReadinessProbe用于确定pod中应用是否可以提供服务。如果返回失败状态则**服务将从endpoints 中删除容器ip地址。**即使容器处于运行状态也不接受代理发过来的请求。StartupProbe用于确定pod是否成功初始化。 如果指定则在成功完成之前不会执行其他探测。如果此探测失败Pod 将重新启动就像 livenessProbe 失败一样。 这可用于在 Pod 生命周期开始时提供不同的探测参数此时加载数据或预热缓存可能需要比稳态操作期间更长的时间。 这无法更新。我们这里不深入讨论StartupProbe。Checking Methods探针检查容器有四种不同的方法httpGet对容器的 IP 地址上指定端口和路径执行 HTTPGET请求。如果响应的状态码大于等于 200 且小于 400则诊断被认为是成功的。exec在容器内执行指定命令。如果命令退出时返回码为 0则认为诊断成功。tcpSocket对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开则诊断被认为是成功的。 如果远程系统容器在打开连接后立即将其关闭这算作是健康的。grpc使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC 健康检查。 如果响应的状态是 “SERVING”则认为诊断成功。我们这里不讨论grpc方法。HTTP Checks-httpGet当使用HTTP Checks控制器使用webhoook判定容器健康情况。如果HTTP的响应码在200-399之间判定check成功。适应范围可以返回HTTP状态码应用。livenessProberootmaster30:~# vim deploy-httpGet-liveness.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:webname:webspec:replicas:1selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-image:hub.laoma.cloud/library/httpdimagePullPolicy:IfNotPresentname:httpd# 添加livenessProbe部分livenessProbe:failureThreshold:3initialDelaySeconds:5periodSeconds:5successThreshold:1timeoutSeconds:10httpGet:path:/index.html# port填写时间web端口port:80# scheme指定协议HTTP或者HTTPSscheme:HTTPprobe选项说明initialDelaySeconds必选。容器启动后多长时间probe开始生效。timeoutSeconds必选。probe需要多长时间完成。如果超过该值控制器判定probe失败。默认值1s最小值是1秒。periodSeconds可选。检查频率。默认值10s最小值是1秒。successThreshold可选连续成功最少次数后判定probe成功。默认值1最小值是1。failureThreshold可选。连续失败最少次数后判定probe失败。默认值3最小值是1。rootmaster30:~# kubectl apply -f deploy-httpGet-liveness.yamlrootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web-85c6ff748f-qwszz1/1 Running012m rootmaster30:~# kubectl describe pod web-85c6ff748f-j92jn|grep ^IP:IP:10.98.146.216# 删除主页文件rootmaster30:~# kubectl exec web-85c6ff748f-qwszz -- bash -c rm htdocs/index.html# 观察pod状态RESTARTS次数变位1再次访问rootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web-85c6ff748f-qwszz1/1 Running113m# 容器删除需要一些时间由参数terminationGracePeriodSeconds设定默认值为30s。# 只有等容器删除并创建完成后才会继续检测rootmaster30:~# curl 10.98.146.216htmlbodyh1It works!/h1/body/html# 清理环境rootmaster30:~# kubectl delete deployments.apps webreadinessProberootmaster30:~# vim deploy-httpGet-readiness.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:webname:webspec:replicas:3selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-image:hub.laoma.cloud/library/httpdimagePullPolicy:IfNotPresentname:httpd# 添加readinessProbe部分readinessProbe:failureThreshold:3initialDelaySeconds:5periodSeconds:5successThreshold:1timeoutSeconds:10httpGet:path:/index.htmlport:80scheme:HTTP# 创建应用rootmaster30:~# kubectl apply -f deploy-httpGet-readiness.yamlrootmaster30:~# kubectl expose deployment web --port80 --target-port80rootmaster30:~# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE web ClusterIP10.98.146.216none80/TCP 4m5s rootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web-9479dc55c-6bpg71/1 Running02m34s web-9479dc55c-d2gbn1/1 Running02m34s web-9479dc55c-hqh8q1/1 Running02m34s# 准备3个pod主页文件rootmaster30:~# for pod in $(kubectl get pods -o name|awk -F / {print $2}); do kubectl exec $pod -- bash -c echo $pod htdocs/index.html; donerootmaster30:~# for i in {1..90};do curl -s 10.96.180.30;done|sort |uniq -c24web-9479dc55c-6bpg733web-9479dc55c-d2gbn33web-9479dc55c-hqh8q rootmaster30:~# kubectl get endpoints webNAME ENDPOINTS AGE web10.224.73.15:80,10.224.73.34:80,10.224.73.35:80 21m# 删除 web-9479dc55c-6bpg7主页文件rootmaster30:~# kubectl exec -it web-9479dc55c-6bpg7 -- rm -f htdocs/index.html# web 服务的后端没有pod的iprootmaster30:~# kubectl get endpoints webNAME ENDPOINTS AGE web10.224.73.15:80,10.224.73.34:80 23m# 访问svc后端无法看到 web-9479dc55c-6bpg7rootmaster30:~# for i in {1..90};do curl -s 10.96.180.30;done|sort |uniq -c50web240web3# 观察web1状态READY为0RESTARTS数量为0rootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web-9479dc55c-6bpg70/1 Running08m49s web-9479dc55c-d2gbn1/1 Running08m49s web-9479dc55c-hqh8q1/1 Running08m49s# 清理环境rootmaster30:~# kubectl delete deployments.apps webExecution Checks-exec当使用容器执行检测kubelet代理将在容器内执行命令。返回值是0代表check成功。示例1检测容器自带文件rootmaster30:~# vim deploy-exec-liveness.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:webname:webspec:replicas:1selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-image:hub.laoma.cloud/library/httpdimagePullPolicy:IfNotPresentname:httpd# 添加livenessProbe部分livenessProbe:failureThreshold:3initialDelaySeconds:5periodSeconds:5successThreshold:1timeoutSeconds:10exec:command:-cat-/usr/local/apache2/htdocs/index.html# 创建应用rootmaster30:~# kubectl apply -f deploy-exec-liveness.yamlrootmaster30:~# kubectl get podsNAME READY STATUS RESTARTS AGE web-8c9ff9b76-nm6s21/1 Running1(2s ago)18s# 删除主页文件rootmaster30:~# kubectl exec web-8c9ff9b76-nm6s2 -- bash -c rm htdocs/index.html# 观察pod状态RESTARTS次数变位1rootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web1/1 Running14m5s示例2检测自定义文件rootmaster30:~# kubectl run busybox --imagebusybox --image-pull-policyIfNotPresent -o yaml --dry-runclient busybox.ymlrootmaster30:~# vim deploy-exec-busybox.ymlapiVersion:v1kind:Podmetadata:creationTimestamp:nulllabels:run:busyboxname:busyboxspec:containers:-image:busyboximagePullPolicy:IfNotPresentname:busybox# 添加args参数args:-/bin/sh--c-touch /tmp/healthy; sleep 10; rm-rf /tmp/healthy; sleep 100#添加livenessProbe参数livenessProbe:failureThreshold:3initialDelaySeconds:5periodSeconds:5successThreshold:1timeoutSeconds:10exec:command:-ls-/tmp/healthydnsPolicy:ClusterFirstrestartPolicy:Alwaysrootmaster30~# kubectl apply -f deploy-exec-busybox.ymlrootmaster30~# kubectl get pods busybox -wNAME READY STATUS RESTARTS AGE busybox1/1 Running1(36s ago)91s rootmaster30~# kubectl delete pod/busybox --forceTCP Socket Checks-tcpSocket当使用TCP socket checkskubelet代理尝试打开容器socket。如果check可以建立连接判定check成功。示例liveness probe使用TCP Socket checkrootmaster30:~# vim deploy-tcpSocket-liveness.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:webname:webspec:replicas:1selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-image:hub.laoma.cloud/library/httpdimagePullPolicy:IfNotPresentname:httpd# 添加livenessProbe部分livenessProbe:failureThreshold:3initialDelaySeconds:5periodSeconds:5successThreshold:1timeoutSeconds:10tcpSocket:port:80#部署命令kubectl apply-fweb-deploy.yaml#实时监控 Pod 状态kubectl get pods-lappweb-w#正常状态RunningRESTARTS0#制造故障复现探针失败关键实验操作# 进入podkubectlexec-it$(kubectl get pods-lappweb-oname)--sh# 容器内执行停止httpdkill$(pidof httpd)rootmaster30~# kubectl get pods -l appweb -wNAME READY STATUS RESTARTS AGE web-79869c84fd-29kz61/1 Running012s web-79869c84fd-29kz60/1 Completed045s web-79869c84fd-29kz61/1 Running1(2s ago)46s#采用 tcpSocket 方式对 80 端口进行存活探测。容器正常运行时 TCP 握手成功探针持续通过手动关闭 httpd 服务后 80 端口无法访问连续 3 次探测失败控制器重启容器RESTARTS 计数增加。TCP 探针适合验证应用端口监听状态无需应用内置接口常用于 Web、数据库类服务健康检测。web-79869c84fd-29kz61/1 Running012s# 正常运行就绪web-79869c84fd-29kz60/1 Completed045s# kubelet 检测 livenessProbe 连续失败杀死容器容器进程退出状态短暂变为 Completedweb-79869c84fd-29kz61/1 Running1(2s ago)46s# Deployment 重启容器容器重新拉起就绪RESTARTS 由0变为1Health Check CaseHealth Check 在 Scale Up 中的应用对于多副本应用 当执行Scale Up操作时 新副本会作为backend被添加到Service的负载均衡中 与已有副本一起处理客户的请求。考虑到应用启动通常都需要一个准备阶段 比如加载缓存数据、 连接数据库等 从容器启动到真正能够提供服务是需要一段时间的。 我们可以通过Readiness探测判断容器是否就绪 避免将请求发送到还没有准备好的backend。Health Check 在滚动更新中的应用Health Check另一个重要的应用场景是Rolling Update。 试想一下 现有一个正常运行的多副本应用 接下来对应用进行更新比如使用更高版本的image Kubernetes会启动新副本 然后发生了如下事件正常情况下新副本需要10秒钟完成准备工作 在此之前无法响应业务请求。由于人为配置错误 副本始终无法完成准备工作比如无法连接后端数据库。如果没有配置Health Check 会出现怎样的情况因为新副本本身没有异常退出 默认的Health Check机制会认为容器已经就绪 进而会逐步用新副本替换现有副本 其结果就是 当所有旧副本都被替换后 整个应用将无法处理请求 无法对外提供服务。 如果这是发生在重要的生产系统上 后果会非常严重。如果正确配置了Health Check 新副本只有通过了探测才会被添加到Service 如果没有通过探测 现有副本不会被全部替换 业务仍然正常进行。环境清理rootmaster30:~# kubectl delete ns health
延伸阅读

更多相关文章

2026/9/27 0:22:39

商业系统算法操控风险防范:从权限审计到异常检测的实战指南

1. 背景与核心概念:警惕商业场景中的新型技术滥用风险在数字化浪潮席卷各行各业的今天,技术本应是提升效率、优化体验的利器。然而,近期一些案例揭示,当技术被别有用心者操控,与商业流程中的管理漏洞相结合时&#xff…

2026/9/28 0:06:57

KMS智能激活一劳永逸:KMS_VL_ALL_AIO一次点亮Windows和Office

KMS智能激活一劳永逸:KMS_VL_ALL_AIO一次点亮Windows和Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如果你的电脑刚弹出"Windows 尚未激活"的提示,或…

2026/9/26 18:45:04

ANSYS 2025 R1 安装避坑指南:从授权原理到环境配置的完整解决方案

如果你正在为ANSYS 2025 R1的安装而头疼,看到网上各种零散、过时甚至相互矛盾的教程,那么这篇文章就是为你准备的。这不仅仅是一篇安装指南,更是一份基于大量真实踩坑经验总结的“避坑全记录”。很多教程只告诉你“下一步”该点哪里&#xff…

2026/9/29 10:34:38

水性刮刮银油墨印刷工艺解析:遮盖力与刮感的参数平衡

引言 水性刮刮银油墨是刮刮墨系列中以水为分散介质的功能性产品,印刷干燥后形成银灰色可刮除遮盖层,轻刮即可露出底层图文。相比溶剂型体系,水性刮刮银 VOC 含量低、气味温和,在儿童画本、促销卡、密码标签等场景中应用广。本文从…

2026/9/29 10:34:38

AI辣椒整枝机器人 QT信创完整工程

# AI辣椒整枝机器人 QT信创完整工程 ## 项目概述 适配**统信UOS、银河麒麟**国产信创Qt5.12/5.15,专为辣椒整枝打杈开发AI视觉系统;依据农科院三主枝/四主枝标准,自动识别**门椒底杈、徒长内膛枝、重叠细弱侧芽、保留健壮结果主枝**,机械臂搭载电动剪枝刀定点剪除无效枝;…

2026/9/29 10:34:38

腾讯云Lighthouse免费领取与WorkBuddy部署实操指南

1. 活动背景与核心价值拆解1.1 这个活动到底在做什么腾讯云轻量应用服务器 Lighthouse 联合 WorkBuddy 推出的这次活动,本质上是把两件事绑在了一起:一是给开发者一个低门槛上手轻量云服务器的机会,二是让 WorkBuddy 这个工具在真实服务器环境…

2026/9/29 10:29:37

《Python 大型项目重构实战指南:从混乱到秩序的渐进式策略》 - 实践

《大型项目重构实战指南: 从混乱到秩序的渐进式策略》这本书, 它的第一个大项就是引言部分, 引言部分的主要内容是在回答为什么要进行重构。在软件开发这个领域, 根本不可能存在哪一个项目是一直永远都能够保持那种“干净整洁”的状态的。后面会因为业务上的那些需要被非常快速…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑