ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Azure云资源调度实战:从AKS弹性伸缩到成本优化

Azure云资源调度实战:从AKS弹性伸缩到成本优化 第一次看到项目标题里只写了“ax”两个字母我第一反应是某个不成熟的缩写但结合“ax调度”这个词再一琢磨立刻明白了——这个圈子里ax几乎默认指的就是 Azure。这些年我没少在 Azure 上折腾资源调度、定时任务和自动扩缩容云资源的钱怎么花得明明白白、系统怎么扛住流量高峰说到底都躲不开“调度”这两个字。今天就把我对 axAzure调度的理解和踩坑经验完完整整分享出来。这篇内容不是 Azure 的产品说明书更像是我自己从零搭建调度体系的一份复盘。包括资源调度到底解决什么问题、容器和虚拟机两种场景下的核心配置思路、一套可以落地的实现步骤以及那些不翻文档根本学不到的坑。适合正在用 Azure 做业务部署的工程师、刚摸到云成本优化门槛的运维同学以及所有想搞明白“调度”为什么是云上第一优先级的人。1. 先把“ax”这层窗户纸捅破1.1 ax 全称到底是什么ax 是 Azure 的常见简写确切说是在技术圈和内部沟通里为了打字省事而留下的习惯。Azure 是微软的公有云平台提供虚拟机、容器服务、数据库、消息队列、函数计算、DevOps 管线等一系列服务。和 AWS、GCP 一样Azure 在全球多个区域部署了数据中心用户可以按需购买计算、存储、网络资源。很多新人在面试或者看招聘 JD 时会看到“熟悉 ax 调度”“具备 ax 资源编排经验”这种说法其实就是要求你掌握 Azure 平台上的自动化运维、弹性伸缩、定时触发一类能力。所以 ax 调度翻译成大白话就是在 Azure 云平台上把“什么时候启动什么资源、启动多少、用完之后什么时候释放、如何根据负载自动调整”这一整套逻辑变得自动化和可预期。1.2 为什么说“调度”是 ax 使用者的分水岭我见过很多团队用了 Azure 一年半载账单却比预期高出三四倍。最典型的问题不是选错了机型而是资源被创建之后就一直开着“随叫随到”的同时也“不眠不休”。在没有调度策略的架构里深夜低峰时段 CPU 使用率只有 3%但你还为这堆闲置的 vCPU 付费流量高峰来临时却又因为扩容不够迅速眼睁睁看着前端请求超时。能把 ax 用好的人和只是“会用控制台开机器”的人差别就在这。前者把调度当作架构设计的一部分从第一天就规划好弹性策略、成本预算和自动化触发条件后者把云当成一台永远插电的物理机来用。调度体系一旦建立起来不只是省钱的问题它直接决定了系统的稳定性上限。负载一旦翻倍没有调度的系统靠人工登录服务器敲命令扩容等你操作完用户早跑了。1.3 这篇内容适合谁参考如果你是刚开始接触 Azure 三个月以内的新手这篇可以帮你建立整体认知知道调度体系里有哪几块拼图照着后面的配置步骤也能落地如果你已经有 Azure 实操经验但每次扩缩容都靠手点控制台、定时任务靠人工盯那么建议重点看第 3 章那套完整配置以及第 4 章的排查经验很多坑我替你先踩过了。只要你的业务跑在云上无论规模大小调度都是一件“现在不做、以后也得补”的事。2. 弄清 ax 调度要解决的四类核心问题2.1 资源供给和实际需求在时间维度上的错配云上资源调度本质解决的是供给与需求在时间维度上的错配。业务流量很少是均匀分布的拿电商来举例白天浏览量大傍晚下单量大深夜几乎没什么人。如果只为高峰峰值去准备常驻资源等于给一把椅子配十把备用椅平时全落灰。在传统的自建机房时代服务器采购周期动辄一两个月所以只能按未来半年的峰值预估来购买机器结果就是长期高成本、低利用。而 azure 这类公有云的计费单位从月缩小到了秒级这就在机制上支持了“用多少买多少”但能不能真的把成本省下来取决于你有没有把资源调度策略配好。没有策略等于买了一张支持弹性计费的票却仍然照着包月的方式消费。2.2 调度体系在 ax 平台上的四个层次调度不是一个单一功能而是分层组合出来的能力。根据我自己的梳理ax 里的调度体系可以分成四个层次负载驱动调度根据实时的 CPU、内存、请求数等指标自动扩展或缩减资源实例数量。典型服务是 Azure Kubernetes ServiceAKS里的 Horizontal Pod Autoscaler以及虚拟机规模集VMSS里的自动扩缩容规则。时间驱动调度按照预设的日历和时间点周期性触发任务的执行或资源的创建释放。典型服务是 Azure Automation、Logic Apps、Azure Data Factory 里的 schedule trigger。事件驱动调度当某个事件发生时才触发后续动作例如对象存储有新文件上传、消息队列积压到一定深度立刻拉起处理任务。典型服务是 Azure Functions 配合 Event Grid。成本驱动调度建立在分析基础之上通过预算、告警和标签体系让资源的使用始终处在可观测、可干预的范围内。典型服务是 Microsoft Cost Management。实际项目里这些层次经常组合使用。比如电商大促场景事件驱动上报订单负载驱动扩容计算节点时间驱动在凌晨执行数据清洗任务成本驱动在整个过程中持续监控预算消耗。2.3 不同业务场景下调度策略的优先级排序对不同业务来说四个层次的优先级完全不同。我在做过的项目里总结出这样的排序逻辑核心交易型业务比如在线支付、秒杀优先做负载驱动调度因为稳定大于省钱资源宁可多备一点也必须扛住突发峰值缩容策略要更保守。离线计算型业务比如数据分析、报表生成优先做时间驱动调度这类任务对实时性不敏感但是计算量大放在低峰期跑能省一大笔钱一般可以省到 50% 以上。数据接入型业务比如日志采集、文件处理优先做事件驱动调度有数据来了才计算数据没来就不消耗资源天然契合流量波动大的场景。长期稳定型业务比如企业官网、内部系统优先做成本驱动调度通过预算告警防止某个开发人员误创一个大规格实例到了月底才发现预算超支。这里强调一个容易被忽略的点调度不是“选一个用”而是“组合着用”。只做弹性扩容不做预算监控账单可能更难控制只做定时开关机不做负载感知流量一来系统还是会崩。后面我会给出一套完整的组合配置。3. 实操一套完整的基础调度配置3.1 从零准备账号、权限和资源分组实操之前先确保你手上有一个 Azure 订阅并且具备足够的权限去创建资源。如果是公司账号建议先申请一个独立的资源组Resource Group来做实验避免影响生产环境。我推荐的初始化步骤如下在 Azure Portal 中创建资源组命名建议用类似rg-ax-scheduling-dev的格式一眼看出用途和环境。在资源组下创建虚拟网络和默认子网后续的虚拟机、AKS 集群都放到这个网络里。注册需要的资源提供程序。如果是纯 Portal 操作这一步通常自动完成但你用 Azure CLI 创建 AKS 时如果遇到报错多半就是 Provider 没注册。# 安装并登录 Azure CLI az login # 创建资源组 az group create --name rg-ax-scheduling-dev --location eastus # 查看已注册的 Provider az provider list --query [?namespaceMicrosoft.ContainerService] -o table这些前置动作看起来简单但因为账号权限不够而卡住的情况非常多。注意一点开发环境的权限越界往往是不小心使用全局管理员账号操作导致的强烈建议用服务主体Service Principal或托管身份来执行自动化脚本而不是去充个人账号。3.2 场景 AAKS 集群的负载驱动调度配置如果你正在跑容器化应用AKS 是 Azure 上最主流的落点。负载驱动调度在这里有两个层级Pod 级别的 HPA 和节点级别的 Cluster Autoscaler。只有两个层级配合起来才算完整的弹性伸缩。先看 Pod 级别的配置。假设你部署了一个订单服务发布文件大致如下# hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: order-service-hpa namespace: prod spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: order-service minReplicas: 3 maxReplicas: 30 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60这个配置的意思是保证至少 3 个 Pod在 CPU 平均使用率超过 60% 时自动增加 Pod 数量最多增加到 30 个。值得注意的是HPA 的 target 值不是越高越好也不是越低越好。设太低比如 30%那 Pod 数量会频繁往上涨造成资源碎片设太高比如 90%容器可能已经出现过载才触发扩容用户感知到卡顿。我自己的经验是在线业务从 60%~70% 起步离线计算从 70%~80% 起步先跑一段时间看曲线再调。然后是节点级别的 Cluster Autoscaler。HPA 扩容的是应用实例数但新 Pod 最终要落到节点上。如果集群里的节点已经满了Pod 会一直处于 Pending 状态。所以还需要给 AKS 开启集群自动缩放# 启用 Cluster Autoscaler假设已有名为 aks-prod 的集群 az aks update \ --resource-group rg-ax-scheduling-dev \ --name aks-prod \ --enable-cluster-autoscaler \ --min-count 3 \ --max-count 10min-count和max-count是节点池的规模边界。建议把 min 设为能承载最小业务负载的节点数max 设为预算允许的最大节点数。我见过有人把 max 拉得过高结果高峰期一时失控账单直接翻倍。安全做法是先设一个保守的上限运行一段时间、确认监控数据稳定后再逐步上调。3.3 场景 B虚拟机定时开关机的成本调度不是所有应用都适合容器化不少老项目还是跑在虚拟机上的。这类资源常常存在“开发环境 24 小时开机”的问题。解决思路是用 Azure Automation 的 Runbook 结合调度时间表实现定时开关机。实际操作时我建议用 Azure CLI 先在本地把命令验证好再写进 Runbook。核心命令是# 启动虚拟机 az vm start --resource-group rg-ax-scheduling-dev --name vm-dev-box # 关闭虚拟机注意这是释放计算资源但保留磁盘 az vm stop --resource-group rg-ax-scheduling-dev --name vm-dev-box # 如果需要同时释放公共 IP 和计算资源使用 deallocate az vm deallocate --resource-group rg-ax-scheduling-dev --name vm-dev-box这里有个初学者非常容易搞混的地方vm stop和vm deallocate的区别。stop后虚拟机进到 Stopped 状态但后台的计算资源仍然被保留也就是说你还在为 vCPU 付费只有deallocate才是真正释放计算资源保留磁盘和配置后续再次启动时会重新分配底层物理资源。成本调度里一定要用deallocate否则省不了钱。把命令封装到 PowerShell Runbook 里然后在 Automation Account 中创建日程表。比如设置工作日上午 8 点执行 Start Runbook晚上 20 点执行 Stop Runbook周末全天停机。这样一套下来按每周 5 天、每天 12 小时计算开发环境的计算成本基本上可以降到原来的一半以下。3.4 场景 C定时批量任务的触发调度业务里经常有“每天早上生成前一天对账单、每周一汇总上周报表、每个月 1 号归档日志”这类固定节奏的任务。Azure 上实现这种定时触发最轻量的是 Azure Functions 的 Timer Trigger其次是 Azure Logic Apps。Timer Trigger 非常适合轻量数据处理。在 Function App 里创建一个函数写好定时表达式即可// timerTrigger 的 cron 表达式每天凌晨 2 点执行 public static void Run( [TimerTrigger(0 0 2 * * *)] TimerInfo myTimer, ILogger log) { log.LogInformation($开始执行每日对账时间{DateTime.Now}); // 在这里调用对账逻辑 }定时表达式用的是标准的 NCronTab 语法遵循 UTC 时区这点特别容易坑人。如果你所在时区是 UTC8想在北京时间每天早上 8 点执行就要写成0 0 0 * * *而不是0 0 8 * * *否则任务会准时在北京时间下午 4 点运行。为了这个时区问题我专门在项目文档里加了一行加粗提示结果新同学还是踩了好几次。对于需要联动多个系统的复杂流程比如从数据库导出数据、转换格式、发送到对象存储、再发通知用 Logic Apps 更合适。Logic Apps 的界面化设计让人可以不写代码就能编排任务同时它还内置了“失败重试”“并行执行”“条件判断”这些节点比纯代码实现要省事很多。4. 资源预算与告警调度体系里的安全网4.1 预算阈值设定与告警通知调度体系一旦跑起来你等于把“手动控制”的权限交出去了交出去的越多越需要一把看得见的安全网。这把安全网就是预算和告警。没有告警的调度就像开车不踩刹车——不是每次都出事但每次出事都是大事。在 Azure 上配置预算比较简单进入 Cost Management 页面选择要监控的订阅或资源组然后创建预算。我的建议是设置两层预算第一层月度预算的 80%触发时发邮件和推送通知给运维组。第二层月度预算的 100%触发时调用 Webhook把消息推送到企业微信或钉钉群。第一层是预警给你留出调整窗口第二层是闪电逼着相关责任人立刻去看发生了什么事。我曾见过只配了 100% 预算的团队到账单一出来才发现超了已经晚了。预警和解急是有本质区别的所以两层缺一不可。4.2 标签体系让成本归属到人、到项目预算能做的是总量控制但你要回答“是谁、哪个项目花了这么多钱”时就必须依赖标签体系。Azure 允许给每个资源打自定义标签例如project: order-service、owner:>behavior: scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 20 periodSeconds: 60这里需要权衡。如果你希望缩容更快可以调低 stabilizationWindowSeconds比如 120 秒但也要接受流量再次回升时系统需要重新扩容的成本。个人经验是对于稳定型业务保持默认即可对于流量波动大的业务可以把窗口调小、同时限制单次缩容比例避免一次性缩掉太多 Pod 造成可用性波动。5.2 Cluster Autoscaler 不生效Pod 一直 Pending另一个常见问题是HPA 已经把 ReplicaSet 副本数提到 10 了但新 Pod 一直处于 Pending节点数量也没有变化。这时候先确认 Cluster Autoscaler 是否真的启用了再看节点池的min-count和max-count配置。如果节点数量已经达到上限那就不是没生效而是没有扩容空间。排查命令很简单# 查看集群自动缩放状态 az aks show \ --resource-group rg-ax-scheduling-dev \ --name aks-prod \ --query autoScalerProfile # 查看待调度的 Pod kubectl describe pod pod-name -n prod如果describe返回的 Events 里有 “0/3 nodes are available: node(s) had taint” 这类信息那问题很可能是节点污点Taint导致的调度限制。不少团队习惯给节点打污点来做环境隔离结果新创建的 Pod 没有对应的容忍度就永远调度不上去。确认时重点看 Execution 里对资源请求量requests的设置如果应用把 requests 设得过大节点即使有空闲资源也放不下多个 Pod这会影响 HPA 的判断。5.3 定时任务“不小心”选择了错误的时区这个坑在 3.4 里已经提到过但因为它太容易触发值得单独再展开。Azure Functions 的 Timer Trigger 和 Azure Automation 的 Schedule 都默认使用 UTC 时区这说明用云平台的时间概念是“世界协调时间”。如果你按本地时间填 cron在 UTC8 的区域就差了 8 个小时。我的习惯是所有定时表达式都在注释里同时标注北京时间对应的触发时间并把时区信息写进配置文件的描述字段。这样即使同事去改时间也不容易出错。另外再补充一个细节夏令时对 Azure 平台的调度任务基本没有影响因为 UTC 本身不随夏令时变化但你所在地区如果有夏令时切换还是要格外小心要求“当地时间每天 9 点执行”这种需求最好在调度时间表里明确使用固定偏移量而不是跟着地方时变来变去。5.4 预算告警经常在发但没人真正处理告警疲劳是调度体系的隐形敌人。报警邮件发一百封刚开始大家还会紧张后面就变成“又是那封邮件”的常态。真正让告警价值发挥出来的做法是把告警和责任人绑定并且拆分到不同级别的处理流程。比如 80% 预算的告警只发给运维组长由他来判断需不需要调整调度策略100% 预算的告警发给运维组长和研发负责人必须在一个工作日内回复根因说明和整改计划。这样层级化的设计既不让每个人淹没在告警里也确保关键告警有人承担责任。我试过把告警接入企业微信机器人在群机器人里配置关键词“突发成本告警”让告警消息达到时自动艾特指定成员这种措施对推动响应很有效。5.5 常见问题速查参考现象可能原因快速处理HPA 不扩容指标采集延迟、Pod 未配置 requests检查 metrics server 和 Deployment 资源声明HPA 不缩容默认稳定窗口未到修改 behavior.scaleDown 参数节点不扩容节点池 max-count 达上限上调 max-count或评估资源配额Pod 一直 Pending节点污点、限额、资源请求太大查看 describe events 定位原因定时任务时间不对时区被按本地时间配置统一换算为 UTC 并加注释账单突然飙升调度脚本参数错误、误创建实例查 Cost Management 异常检测自动化账号权限不足缺少 Contributor 角色为 SP 单独分配作用域角色6. 一些落地过程中沉淀下来的经验调度体系这东西从搭建到稳定运行我最大的体会是“别追求一步到位”。mini 环境里先跑通一套最低限度的方案再去叠 Node 粒度、预算粒度、自动化运维这些高级特性每一步都要有监控数据做支撑。刚开始做成本优化时我一度为了极致省钱把缩容窗口设得非常激进结果业务流量一抖动系统频繁扩缩容最终用户反馈时好时坏。后来学乖了所有调度策略都带“阻尼设计”——允许一定的资源浪费换取系统的稳定。云上资源再贵也贵不过口碑崩塌的代价。最后分享一个实用小技巧调度策略上线前建议先记录当前基线高峰期的响应时间、CPU 使用率、月账单跑通新策略之后每隔一周对比一次基线的变化。有了数据下一步调度策略的调整方向就有了依据。把 ax 调度搞好不只是把 Azure 用熟更是把自己对“云”的理解建起来。云的弹性、计费、自动化全在调度体系里体现出来。今天分享的这些配置和排查方法你照着配置跑一遍再结合自己的业务调参数很快就会形成一套顺手的方法论。
返回列表