尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Kubernetes 上手实战(7):弹性伸缩与健康检查
上一篇用 Gateway API 把请求送到 Ready 后端。本篇定义 Ready 到底意味着什么并用 Metrics Server、资源请求与 HPA 构成闭环指标上升触发扩容负载下降后再受控缩容。一、痛点活着、就绪和启动完成不是一回事livenessProbe 判断容器是否陷入需要重启的故障readinessProbe 判断它是否应进入 Service 端点startupProbe 为慢启动应用提供独立启动窗口成功后才启用另外两类探针。把三者都指向同一个浅层/health会丢失语义尤其 liveness 依赖数据库时数据库故障可能让所有实例同时重启并放大事故。readiness 可检查接流量所需的关键依赖但要快速、有界并避免瞬时抖动。liveness 应主要检查进程内部不可恢复状态。startup 允许应用完成迁移、缓存预热等操作不过数据库迁移更适合独立 Job以免多个副本争抢执行。HPA 控制器周期读取指标计算期望副本并更新 Deployment 的 scale 子资源。CPU 利用率是实际 CPU 使用量与容器 CPU request 的比值没有 request 时HPA 无法为该容器正确计算这一指标。HPA 不是资源配置的替代品它依赖合理 requests。二、原理两个控制循环必须协调Deployment 控制副本与发布HPA 动态控制 replicas。启用 HPA 后不要让 GitOps 工具持续把静态 replicas 改回固定值否则两个控制器会争夺字段。可以从工作负载清单移除 replicas或配置 GitOps 忽略该差异并在 HPA 中表达最小与最大副本。扩容速度受指标采样、HPA 同步、调度、镜像拉取和应用就绪共同影响。面对突发流量仅靠 HPA 可能来不及应保留容量、预热镜像、设置合理最小副本并在入口限流。缩容还会终止实例需结合终止宽限、连接排空和 PodDisruptionBudget。下面的清单使用可产生 CPU 负载的 PHP Apache 官方示例模式探针检查根路径HPA 以 50% CPU 为目标。它是独立实验不依赖前文 Nginx 文件。运行前确保集群已安装 Metrics Serverkind 环境可能需要按其文档调整 kubelet TLS 设置。apiVersion:apps/v1kind:Deploymentmetadata:name:web-scalespec:selector:matchLabels:app:web-scaletemplate:metadata:labels:app:web-scalespec:containers:-name:webimage:registry.k8s.io/hpa-example:latestports:-name:httpcontainerPort:80resources:requests:cpu:100mmemory:32Milimits:cpu:500mmemory:128MistartupProbe:httpGet:path:/port:httpperiodSeconds:2failureThreshold:30readinessProbe:httpGet:path:/port:httpperiodSeconds:5failureThreshold:2livenessProbe:httpGet:path:/port:httpperiodSeconds:10failureThreshold:3---apiVersion:v1kind:Servicemetadata:name:web-scalespec:selector:app:web-scaleports:-port:80targetPort:http---apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:web-scalespec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:web-scaleminReplicas:2maxReplicas:8behavior:scaleDown:stabilizationWindowSeconds:120metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:50三、实现产生负载并观察控制器先用kubectl top验证指标管线若出现 unknown等待采样或排查 Metrics Server不能继续声称 HPA 有效。脚本创建负载 Pod循环请求 Service观察 HPA 与 Pod删除负载后由于稳定窗口缩容不会立刻发生。#!/usr/bin/env bashset-euopipefail kubectl apply-fautoscale.yaml kubectl rollout status deployment/web-scale--timeout180s kubectlwait--forconditionReady pod-lappweb-scale--timeout120s kubectltoppods-lappweb-scale kubectl delete pod load-generator --ignore-not-found kubectl run load-generator\--imagebusybox:1.36.1\--restartNever\--command--sh-c\while true; do wget -q -O- http://web-scale /dev/null; doneforattemptin$(seq118);dokubectl get hpa web-scalereplicas$(kubectl get deployment web-scale-ojsonpath{.status.replicas})echoattempt${attempt}replicas${replicas:-0}if[${replicas:-0}-gt2];thenbreakfisleep10donekubectl get pods-lappweb-scale-owide kubectl describe hpa web-scale kubectl delete pod load-generatorechoload stopped; scale-down follows the stabilization policy预期 CPU 指标升高后副本数大于 2且不超过 8。具体时刻和数值由机器性能决定不应写死。若始终不扩容检查请求是否真正消耗 CPU、metrics 是否有值、request 是否存在以及 HPA events 中的原因。内存通常不是理想的缩容信号因为运行时可能保留已分配内存。队列消费者更适合按积压长度伸缩可使用自定义/外部指标或 KEDA。任何指标都要与业务容量关系明确每个副本每秒能处理多少请求、目标延迟是多少、扩容需要多久。四、踩坑探针也能制造故障探针超时过短、频率过高会增加负载在 CPU 节流时liveness 超时可能反复重启形成雪崩。先观测启动时间与健康端点延迟再设置 initialDelay、timeout、period 和 failureThreshold。HTTP 探针默认从节点访问 Pod IP因此端点必须监听正确接口与端口。readiness 失败会摘除流量却不重启容器这通常是依赖短暂不可用时的正确行为。liveness 失败会丢失进程内状态应谨慎。应用主动退出也是有效恢复策略由 kubelet 按 restartPolicy 重启不要把所有错误都堆进复杂探针。HPA 达到 maxReplicas 仍高延迟时继续扩容可能被数据库、配额或节点容量限制。Cluster Autoscaler 负责节点层扩容但也有分钟级延迟。需要入口限流、背压、队列和降级共同构成过载保护。五、验证从资源指标走向业务目标验收包含探针失败行为、扩容延迟、最大副本、缩容稳定性和发布期间 HPA 行为。可临时把 readiness 路径改错确认 Pod 从端点移除但容器不因 readiness 单独重启故障实验结束立即恢复并等待 rollout。生产告警不应只看副本数而要关联请求率、错误率、延迟、CPU 节流、Pending Pod 和 HPA 条件。目标是业务 SLO 下的容量闭环不是让 CPU 曲线好看。压力测试也要设停止条件避免在共享环境无限制造流量。下一篇将把 Deployment、Service、HPA 和配置整理成 Helm Chart用 values 管理环境差异并通过 lint、template 和原子升级形成可发布制品。伸缩参数应来自阶梯压测。固定副本数逐级提高请求速率记录吞吐、错误率、延迟、处理器、内存和依赖饱和点找出单副本在目标延迟下的安全容量再据此计算最小副本和最大副本。最大值还需受数据库连接、节点配额和成本约束。若每增加一个 Pod 就建立大量连接扩容反而可能把数据库压垮应先限制连接池并建立全链路容量模型。验收伸缩时同时记录发现负载、提出副本、实例调度、镜像就绪、进入端点五个时间点端到端扩容时间才是用户真正承受的窗口。对可预测高峰可以定时预扩容对不可预测突发则依靠容量余量、限流与降级。缩容前确认连接排空和后台任务可中断避免指标恢复正常后因为过快终止又产生错误峰值。压测结束后要确认临时负载已停止、额外副本按策略回落并保存指标时间窗与伸缩事件。这样下次修改资源请求或目标阈值时可以用同一负载模型比较而不是凭主观感受判断更快或更省。完成容量基线后下一篇会把工作负载、服务、配置与伸缩规则整理为可版本化的 Helm 软件包减少环境间的清单漂移。HPA 的核心计算可以离线复现。下面程序根据各 Pod 当前 CPU、request 和目标利用率估算期望副本并施加最小、最大副本边界。它解释了为什么缺少 request 时 CPU 利用率型 HPA 无法可靠工作。importmath cpu_usage_millicores[82,76,92]cpu_request_millicores100target_utilization60current_replicaslen(cpu_usage_millicores)min_replicas2max_replicas8ifcpu_request_millicores0:raiseValueError(CPU request must be positive)average_usagesum(cpu_usage_millicores)/current_replicas current_utilizationaverage_usage/cpu_request_millicores*100raw_desiredmath.ceil(current_replicas*current_utilization/target_utilization)desiredmax(min_replicas,min(max_replicas,raw_desired))print(fcurrent_replicas{current_replicas})print(faverage_cpu{average_usage:.1f}m)print(futilization{current_utilization:.1f}%)print(fdesired_replicas{desired})运行输出current_replicas3 average_cpu83.3m utilization83.3% desired_replicas5探针验收不能只看单次成功。第二个程序实现连续成功/失败阈值启动完成后连续两次 readiness 成功才接流量连续三次失败才摘流避免短暂抖动造成端点频繁进出。samples[False,True,True,False,True,False,False,False]success_threshold2failure_threshold3readyFalsesuccesses0failures0forindex,healthyinenumerate(samples,start1):ifhealthy:successes1failures0else:failures1successes0ifnotreadyandsuccessessuccess_threshold:readyTrueifreadyandfailuresfailure_threshold:readyFalseprint(fsample{index}healthy{healthy}fsuccesses{successes}failures{failures}ready{ready})运行输出sample1 healthyFalse successes0 failures1 readyFalse sample2 healthyTrue successes1 failures0 readyFalse sample3 healthyTrue successes2 failures0 readyTrue sample4 healthyFalse successes0 failures1 readyTrue sample5 healthyTrue successes1 failures0 readyTrue sample6 healthyFalse successes0 failures1 readyTrue sample7 healthyFalse successes0 failures2 readyTrue sample8 healthyFalse successes0 failures3 readyFalse参考来源Configure Liveness, Readiness and Startup ProbesHorizontal Pod AutoscalingResource Metrics PipelineKEDA Documentation 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《Kubernetes 上手实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
RELATED

相关推荐

化妆品专柜尾货是门好生意,但90%的老板都死在了验货这一关

化妆品专柜尾货是门好生意,但90%的老板都死在了验货这一关

混美妆供应链十来年,见过太多实体店老板和私域团长,一听说哪哪能搞到高端品牌渠道余量料体,眼睛都绿了,恨不得立刻打款锁货。但说实话,尾货这趟水,比你们想象的要浑得多。我车间里几乎每周都有拿尾货来对比…

📅 2026/10/13 14:06:12
2026 AI 秒回的魔法:KV Cache 如何让大模型越聊越快?MonkeyCode 免费上手

2026 AI 秒回的魔法:KV Cache 如何让大模型越聊越快?MonkeyCode 免费上手

一次"卡顿"引发的思考 深夜,你正和 AI 助手讨论一个复杂的技术方案,聊到第三轮,对方回复突然变慢了——不是网络问题,也不是模型变笨了,而是它正在"回忆"你们之前聊过的每一句话。你有没有想过&am…

📅 2026/10/13 12:49:22
【寻迹校园 HarmonyOS NEXT 实战 29】只允许改期一次、24 小时自动过期:交接安排的防拖延状态机

【寻迹校园 HarmonyOS NEXT 实战 29】只允许改期一次、24 小时自动过期:交接安排的防拖延状态机

【寻迹校园 HarmonyOS NEXT 实战 29】只允许改期一次、24 小时自动过期:交接安排的防拖延状态机这是“寻迹校园 HarmonyOS NEXT 实战”系列第 29 篇。本文结合 HandoffService.reschedule()、shouldExpire()、expiresAt 与本地时间注入测试,说明如何限制…

📅 2026/10/13 10:44:03
MORE NEWS

更多资讯

📰

电工小孟电工证多少钱?学历不高也能考,关键看这几点

电工小孟电工证多少钱?学历不高也能考,关键看这几点 你是不是也担心自己学历不高,电工小孟电工证怎么也报不上名?别急,我跟你说, 电工小孟电工证多少钱 ,其实和学历关系不大,关键是要了解流程和要求。…

📰

电工证可以登高么现在在哪考最靠谱

电工证可以登高么现在在哪考最靠谱 学历不高怕报不上名?别急,电工证报考门槛其实没你想的那么高,只要符合年龄、健康条件和基本学历要求,基本都能报名。很多人误以为电工证只能从事低压或高压电力相关工作, 电工证可以登高么现在…

📰

自己装修提供电工证良心建议:避开中介陷阱的避坑指南

自己装修提供电工证良心建议:避开中介陷阱的避坑指南 你是不是也在为“自己装修提供电工证”发愁?不知道去哪报名怕被中介坑?别急,今天我就从一线项目管理的角度,给你讲讲真实案例和避坑经验,帮你把这事儿搞定。…

📰

3个内部消息告诉你绍兴电工证培训手续怎么走

3个内部消息告诉你绍兴电工证培训手续怎么走 学历不高怕报不上名?绍兴电工证培训手续其实没你想象的那么难,关键是你有没有掌握 内部消息…

📰

安徽芜湖报考电工证保姆级教程:实操考试心里没底怕挂科?看完这招稳过!

安徽芜湖报考电工证保姆级教程:实操考试心里没底怕挂科?看完这招稳过! 实操考试心里没底怕挂科?别慌,咱们今天就来聊聊 安徽芜湖报考电工证…

📰

拉萨高压电工证报考多久拿证?怕考不过白交培训费的看过来

拉萨高压电工证报考多久拿证?怕考不过白交培训费的看过来 怕考不过白交培训费?别急,拉萨高压电工证报考其实没有你想象中那么难。很多人一听到“高压”两个字就有点发怵,觉得这个证肯定不好考,怕交了钱最后拿不到证,浪费时间和金钱。其实不然,只要掌握…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬