首页
Search
1
解决 docker run 报错 oci runtime error
49,608 阅读
2
WebStorm2025最新激活码
28,204 阅读
3
互点群、互助群、微信互助群
23,060 阅读
4
常用正则表达式
21,664 阅读
5
罗技鼠标logic g102驱动程序lghub_installer百度云下载windows LIGHTSYNC
20,036 阅读
自习室
互通有无
搞钱日记
养生记
包罗万象
Search
标签搜索
职场副业
职业发展
副业赚钱
后端开发
内容创作
微服务
分布式系统
效率提升
DevOps
技能提升
流量变现
性能优化
云原生
高并发
编程学习
深度学习
人工智能
架构设计
机器学习
前端开发
loong
累计撰写
3,206
篇文章
累计收到
4
条评论
首页
栏目
自习室
互通有无
搞钱日记
养生记
包罗万象
页面
搜索到
3
篇与
的结果
2026-01-13
Kubernetes调度进阶:从基础Pod分配到精细化资源优化的实战策略
Kubernetes调度进阶:从基础Pod分配到精细化资源优化的实战策略你有没有遇到过这种情况?明明集群还有不少空闲资源,新部署的Pod却卡在Pending状态,日志里冷冰冰地提示Insufficient cpu。或者,某个节点负载突然飙升,导致上面的应用响应变慢,而其他节点却闲得发慌。这通常不是资源真的不够,而是调度器“看不见”或者“不会用”。默认的Kubernetes调度器(kube-scheduler)遵循一套基础规则,但在生产环境中,这套规则往往不够用。今天,我们就来聊聊如何超越默认调度,通过高级策略和优化实践,真正驾驭集群的资源分配。默认调度器:它做了什么,又没做什么?简单来说,kube-scheduler的工作分两步:过滤(Filtering)和打分(Scoring)。过滤阶段,它会筛掉所有不满足硬性条件的节点,比如资源不足、节点Selector不匹配、污点容忍度不符等。剩下的节点进入打分阶段,调度器根据资源平衡、镜像 locality 等策略给每个节点打分,最后选择得分最高的。听起来挺合理,对吧?但问题就藏在细节里。默认的调度策略主要关注即时请求(Request)。你为Pod设置了requests.cpu: 500m,调度器就认为它需要占用500毫核。但实际运行时,这个Pod可能只用100m,那多出来的400m就被“浪费”地锁定了,其他Pod无法使用。反之,一个突发流量的Pod可能瞬间需要800m,但因为Request只写了500m,它会被限制,导致性能下降。这种基于静态Request/Limit的模型,是很多资源利用率低下和性能问题的根源。超越默认:让调度更“智能”的策略1. 用好节点亲和与反亲和:不只是“靠近”,更是“远离”节点亲和性(Node Affinity)大家可能都用过,比如把Web服务调度到带disktype: ssd标签的节点上。但我想强调的是Pod间反亲和性(Pod Anti-Affinity),它对于实现高可用至关重要。apiVersion: apps/v1 kind: Deployment spec: template: spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: my-critical-app topologyKey: kubernetes.io/hostname上面这个配置意味着:同一个my-critical-app的多个副本,绝不能被调度到同一台物理主机上。这样,即使一台主机宕机,你的服务依然有副本在其他节点上运行。把topologyKey换成failure-domain.beta.kubernetes.io/zone,就能实现跨可用区部署。坦白讲,对于核心服务,我几乎都会加上反亲和规则。这是用调度策略换取稳定性的最有效方式之一。2. 污点与容忍度:为节点划分“专属区域”你可以把污点(Taint)想象成节点的“气味”,只有带有相应容忍度(Toleration)的Pod才能“忍受”并调度上去。一个经典场景:设立专属节点组。# 给一组GPU节点打上污点 kubectl taint nodes node-group-gpu special-hardware=gpu:NoSchedule # 在你的AI训练Job的PodSpec中加上容忍度 spec: tolerations: - key: "special-hardware" operator: "Equal" value: "gpu" effect: "NoSchedule"这样,只有明确声明需要GPU的任务才会被调度到这些昂贵且稀缺的节点上,避免了普通Pod误入,最大化专用资源的效益。3. 资源请求与限制:别猜了,用数据说话这是优化资源利用率的核心,也是最容易出错的地方。我的建议是:不要拍脑袋设置Request/Limit。先让应用带一个较宽松的Limit(防止容器爆炸)但较低的Request运行一段时间。利用监控数据。通过Metrics Server、Prometheus等工具,收集容器实际的CPU/内存使用量(特别是P95/P99值)。逐步调整。根据历史数据,将Request设置到接近P95使用量的水平,为突发留出一些缓冲(Limit可以更高)。这样既能保证调度效率,又能提升节点装箱密度。说实话,我看到太多团队把Request和Limit设成一样的值,这完全失去了Limit防止资源耗尽的意义,也让调度器过于悲观。进阶武器:调度框架与自定义调度器当内置规则无法满足你时,Kubernetes提供了更强大的扩展能力。调度框架(Scheduling Framework) 允许你以插件形式在调度周期的各个扩展点(如过滤前、打分后)注入自定义逻辑。比如,你可以写一个插件,优先将Pod调度到已经缓存了其所需大镜像的节点上,加速启动。如果需求非常独特,比如需要根据实时商品价格选择最便宜云厂商的节点,或者实现复杂的批量作业调度,那么自定义调度器是最终选择。你可以自己编写一个调度程序,与默认调度器并存,用spec.schedulerName来指定Pod由谁调度。不过,走这条路需要深厚的Kubernetes内部知识,维护成本也高,除非必要,一般不建议轻易尝试。实战优化:从策略到落地理论说了不少,分享一个简化版的真实案例。我们有一个混合了在线服务和离线批处理任务的集群。最初所有Pod混部,在线服务经常被批处理任务抢资源,导致延迟毛刺。我们的优化步骤:划分节点池:通过污点,创建dedicated-online和dedicated-batch两个节点组。精细化资源画像:为所有在线服务分析一周的监控数据,基于P99使用量设置Request,Limit设为Request的1.5倍。批处理任务则采用较低的Request(保证能调度),但较高的Limit(允许突发使用空闲资源)。启用集群自动伸缩:为批处理节点池配置Cluster Autoscaler,白天任务多时自动扩容,夜间自动缩容。引入优先级与抢占:为在线服务设置更高的PriorityClass,确保在资源紧张时,低优先级的批处理任务Pod可以被驱逐,为在线服务让路。这一套组合拳下来,在线服务的P99延迟下降了40%,集群整体平均资源利用率从35%提升到了接近60%,而且批处理任务的完成时间并没有显著增加。写在最后Kubernetes的高级调度和资源优化,不是一个开关或者一个银弹。它是一个持续迭代的过程,核心在于更精确地描述你的工作负载需求,并让调度器理解你的业务优先级。从今天就可以开始做的是:检查你的核心服务是否配置了反亲和以实现高可用;回顾一下主要应用的Request/Limit设置,是不是该用监控数据校准一下了。调度策略的终点,是让基础设施的复杂性对业务透明,让合适的负载,在合适的时间,运行在合适的位置上。这条路没有终点,但每走一步,都能让你的系统更稳健、更高效。你的集群里,最棘手的调度问题是什么?是资源利用率上不去,还是应用稳定性受影响?不妨从一两个具体的点开始优化吧。
2026年01月13日
16 阅读
0 评论
0 点赞
2026-01-05
Kubernetes成本优化实战:从失控账单到FinOps高效治理
Kubernetes成本优化实战:从失控账单到FinOps高效治理上个月,一位朋友深夜给我发消息,附上了一张云服务账单的截图。“这个月的K8s集群开销又涨了30%,但我们明明没上线什么新功能......”这句话背后,是无数团队正在经历的阵痛。Kubernetes给了我们前所未有的弹性和部署速度,但也悄悄带来了成本可视性的黑洞。资源请求设置不合理、僵尸Pod、过度配置的节点......每一处浪费都在静默地吞噬着预算。今天,我们不谈空洞的理论,就聊聊怎么把失控的云账单拉回正轨。成本失控的根源:看不见,所以管不着在传统虚拟机时代,成本核算相对直观:一台虚拟机,一个价格。但Kubernetes的抽象层让这一切变得模糊。你很可能遇到过这些情况:开发团队为了“稳定”,将Pod的资源请求(requests)设置得远超实际需求。某个测试命名空间早已废弃,但里面的服务还在运行,持续产生费用。集群自动伸缩组(CA)配置激进,为短暂的流量高峰准备了大量闲置节点。问题的核心在于,负责编写YAML的工程师,通常看不到他们决策所产生的财务后果。财务和运维之间,隔着一层厚厚的技术壁垒。这就是FinOps要解决的问题:建立一种文化,让技术决策与财务影响直接挂钩。第一步:建立成本可见性(这比你想的重要)在考虑任何优化之前,你必须先知道钱花在了哪里。1. 打好标签(Labels)的基础这是所有后续工作的基石。确保你的每一个Kubernetes资源(Namespace, Deployment, Pod, Service)都打上了有意义的标签,例如:cost-center: product-ateam: backend-infraenvironment: productionapp: user-service云服务商(AWS、GCP、Azure)都能通过这些标签将成本映射回具体的K8s资源。没有清晰的标签,你的成本报告就是一团乱麻。2. 选择合适的成本可视化工具开源首选:Kubecost坦白讲,这是目前社区里最成熟、集成度最高的方案。它能以命名空间、服务、甚至Pod级别展示成本,提供优化建议(如调整requests/limits),并且可以集成到你的CI/CD流程或仪表盘中。安装简单,对于初步建立可见性来说,几乎是零阻力。云厂商原生工具AWS的Cost Explorer、GCP的Cost Table、Azure的Cost Management,现在都对Kubernetes有了不错的支持。如果你的集群完全跑在一家云上,用原生工具是最直接的。但多云环境下,你需要一个统一的视图。Grafana + Prometheus如果你已经是Prometheus的重度用户,可以利用kube-state-metrics和node-exporter的数据,自己构建成本仪表盘。这需要更多工作量,但定制化程度最高。先别急着追求完美,选一个工具,让成本数据先“看得到”。这是打破团队间沉默的第一步。第二步:从“低垂的果实”开始优化有了数据支撑,就可以行动了。我建议从投资回报率最高、风险最低的地方入手。1. 清理“僵尸”与“幽灵”资源运行一个命令,比如 kubectl get pods --all-namespaces | grep -E "(Evicted|Completed|Error)",你可能会吓一跳。这些已经失败或完成的Pod,可能还关联着未被释放的存储卷(PVC)或负载均衡器,持续产生费用。建立定期清理的机制(例如用CronJob运行kubectl delete),立竿见影。2. 调整Requests和Limits:从“猜测”到“依据”这是Kubernetes成本优化的核心战场。# 常见的“保险”式配置(也是浪费的根源) resources: requests: memory: "2Gi" cpu: "1000m" limits: memory: "4Gi" cpu: "2000m"而实际使用呢?可能平均只有200MiB内存和200m CPU。怎么做?利用监控数据:查看过去一周该Pod在Prometheus/Vertical Pod Autoscaler中的实际使用量(第95或99百分位数)。设置合理的Requests:Requests应略高于平均使用量,以保证稳定性,但远低于之前的“瞎猜”值。它是调度和节点资源分配的依据。重新审视Limits:Limits是硬性天花板,防止单个Pod拖垮节点。它可以比Requests高,但不要高得离谱。对于CPU,设置Limits有时会引发节流(Throttling),需要谨慎。工具推荐:Vertical Pod Autoscaler (VPA):能自动分析Pod历史用量并推荐或自动更新Requests/Limits。注意,VPA的更新模式(尤其是Auto模式)可能与某些部署工具冲突,生产环境建议先用Recommend模式获取建议。Kubecost的建议报告:它会直接指出哪些Pod的资源配置过高,并给出具体的调整数值。3. 玩转节点:选对型号,提高密度节点选型:为工作负载选择合适的节点实例。内存密集型应用选高内存型,计算密集型选高CPU型。混合部署通用型节点往往不是最经济的。提高资源利用率:这是平衡的艺术。利用率太低(如30%以下),说明你为冗余支付了过多费用;太高(如80%以上),则可能影响应用性能和扩缩容速度。一个好的目标是让节点整体利用率长期保持在60-70%左右。使用Spot实例/抢占式虚拟机:对于无状态、可中断的批处理任务、测试环境,这是节省成本的大杀器,通常能有60-90%的折扣。结合Cluster Autoscaler和良好的应用容忍度(tolerations),可以安全地使用。第三步:将FinOps融入流程与文化技术工具只能解决一半问题。真正的持久战,在于流程和文化。建立成本问责制:将成本数据通过仪表盘同步给各业务团队或产品线负责人。让“谁使用,谁负责”的意识落地。在部署流程中加入成本检查:可以在CI/CD的Pull Request阶段,通过Kubecost等工具的API,估算本次部署可能带来的成本变化,让开发者在合并代码前就有所感知。设立优化目标与分享会:例如,“本季度目标是将非生产环境成本降低20%”。定期举办内部分享,让省下成本的团队分享经验。我的工具箱:哪些工具真的在帮我?除了上面提到的,再补充几个我深度使用后觉得不错的:Goldilocks:一个轻量级工具,专门用于为VPA生成资源建议的仪表盘。它比直接看VPA的CRD更友好,适合作为优化起点。OpenCost:CNCF沙箱项目,是Kubecost的开源核心。如果你想完全自托管且避免商业软件的依赖,它是很好的基础。云厂商的节省计划/承诺折扣:当你通过优化稳定了资源需求后,可以考虑为基线负载购买1年或3年的预留实例或节省计划,这能带来可观的折扣。但记住,先优化,再承诺。写在最后:优化是一场马拉松Kubernetes成本优化不是一次性的项目。它随着业务增长、架构演进和云服务变化而持续进行。最重要的转变,是从“成本是运维或财务的事”,变成“成本是每个构建系统的人的事”。当你下次编写一个Deployment的YAML文件时,不妨多想一句:“我这样配置,真的经济吗?”从这个问题开始,你就已经走在正确的路上了。你们团队在K8s成本控制上,遇到最头疼的问题是什么?是技术上的,还是流程上的?
2026年01月05日
19 阅读
0 评论
0 点赞
2026-01-04
Kubernetes成本优化实战:揪出闲置资源与调度策略,让集群不再“烧钱”
你有没有算过,每个月花在云上Kubernetes集群的钱,有多少是在为“空气”买单?上个月,我帮一个团队做了一次集群健康检查。他们抱怨云账单涨得飞快,但业务量其实很平稳。结果一查,好家伙,集群整体资源利用率长期徘徊在15%左右。这意味着,有超过80%的CPU和内存资源,在大部分时间里只是静静地躺在那里,然后准时从你的账户里扣钱。这太常见了。我们往往忙于部署、发布、扩缩容,却很少回头看看:那些我们申请的资源,真的被用上了吗?第一刀:精准定位“僵尸”与“胖子”优化成本,第一步不是调参数,而是做审计。你得知道钱花哪儿了。1. 识别闲置资源未被调度的Pod: 检查那些长期处于 Pending 状态的Pod。通常是因为资源请求(requests)设置过高,没有节点能满足。它们不运行,但定义还在,占用着你的思维内存,也是技术债。低利用率的工作负载: 这是重灾区。用 kubectl top pod 结合监控工具(如Prometheus),找出那些CPU/内存使用率长期(比如过去7天)低于其请求(request)30%的Deployment或StatefulSet。我习惯叫它们“胖子应用”——申请了大房子,只住一个小角落。孤立的资源: 那些没有对应Pod的Service、Ingress?被遗忘的PVC?特别是LoadBalancer类型的Service,每一个都可能对应着一笔不小的云网络费用。定期清理:kubectl get deployments,svc,ingress,pvc --all-namespaces 并核对。2. 审视资源请求与限制(Requests & Limits)这是Kubernetes资源管理的核心,也是最容易出问题的地方。Requests(请求): 这是Pod向调度器“预订”的资源,决定了Pod能被调度到哪里。设置过高是浪费的根源。Limits(限制): 这是Pod能使用的资源上限,防止单个Pod吃光节点资源。一个经典的反模式是:requests 和 limits 设置成相同的值。这看似“安全”,实则僵化。它剥夺了应用在需要时利用节点闲置资源的能力,也使得调度不够灵活。我的建议是: 基于监控数据(P99值是个好参考),将 requests 设置为一个能保证应用稳定运行的下限值,而 limits 可以适当放宽,比如是 requests 的1.5-2倍。这为突发流量留出了缓冲,又不影响调度。第二刀:让调度器为你省钱搞清楚了资源现状,接下来就让调度器更智能地工作。1. 启用并善用节点亲和性/反亲和性别让Pod满世界乱跑。通过节点亲和性(nodeAffinity),你可以把特定的工作负载(比如计算密集型)引导到具有特定标签(如 instance-type=compute-optimized)的节点上。反过来,用Pod反亲和性(podAntiAffinity)把同一服务的多个实例分散到不同节点或可用区,这既能提高容灾能力,有时也能利用不同的计费模型。2. 玩转污点与容忍度(Taints and Tolerations)这是创建“专用节点池”的利器。比如,你可以给一些配置较低、价格便宜的节点打上 taint: spot=true:NoSchedule。然后,只让那些可以容忍中断的、无状态的应用(通过添加对应的 toleration)调度上去。这在配合使用AWS Spot实例或GCP Preemptible VM时,能省下一大笔钱。3. 垂直扩缩容(VPA)与水平扩缩容(HPA)结合HPA大家很熟悉,根据CPU/内存等指标扩缩Pod副本数。但别忘了VPA(垂直扩缩容)。它可以自动调整Pod的 requests 和 limits。两者结合威力巨大:VPA负责“让每个Pod的身材变得标准”,不浪费资源。HPA负责“根据客流调整服务员数量”,应对流量变化。注意: VPA在更新Pod资源时会导致Pod重建,对于有状态服务要慎用。通常先用在无状态服务上。实战策略:从“救火”到“常态”优化不是一次性的,得形成机制。建立成本监控仪表盘: 把集群资源利用率、闲置成本、各命名空间/团队的资源消耗放在醒目位置。让数据说话。将资源审核纳入CI/CD: 可以在Pipeline中加入检查,对新增或修改的Deployment YAML中的资源请求值进行合理性检查(比如,不允许内存request超过2Gi,除非有特批)。设定资源配额(ResourceQuota): 在命名空间级别设置配额,迫使开发团队思考资源使用。这能有效防止“资源蔓延”。考虑集群自动扩缩容(Cluster Autoscaler): 当资源不足时自动加节点,当节点利用率低时自动缩容节点。这是应对潮汐负载、节省成本的大杀器。坦白讲,没有银弹成本优化是一个平衡艺术。在压榨资源和保证稳定性、预留缓冲之间,需要不断权衡。过于激进的优化可能会在流量高峰时导致应用不稳定,省下的钱可能还不够处理一次故障。我的经验是,从最明显的浪费下手(比如那些利用率极低的“胖子应用”),逐步推进。每调整一个参数,观察一段时间。跟业务团队沟通,了解他们的应用特性。最终目标不是把利用率拉到100%,而是让每一分钱的花费都清晰、合理、可控。当你能清楚地告诉业务方:“这个服务每天的成本是X元,因为它的资源配置是Y”,优化工作就成功了一大半。你的集群里,最大的“闲置资源”藏在哪儿呢?是时候动手查一查了。
2026年01月04日
13 阅读
0 评论
0 点赞