ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Karpenter 监控 Amazon EC2 API 调用量与请求限流(Throttling)完整指南

Karpenter 监控 Amazon EC2 API 调用量与请求限流(Throttling)完整指南 Karpenter 监控 Amazon EC2 API 调用量与请求限流Throttling完整指南【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-awsAWS 会对每个账户、每个区域的 Amazon EC2 API 请求速率设置配额当 Karpenter 的请求速率超过该配额时多余的请求会被拒绝并返回RequestLimitExceeded错误HTTP 503进而影响 Karpenter 发现基础设施、启动和终止节点的能力。本指南以 karpenter-provider-aws 项目在 v1.12 版本的任务文档为骨架系统梳理 Karpenter 会调用哪些 EC2 API、如何通过 Prometheus 指标观测调用量与限流、如何将观测值与账户配额对比以及降低调用量的最佳实践与临时缓解手段。读完本文你将能够建立一套完整的调用量观测 → 配额对比 → 容量规划监控闭环提前发现并规避限流风险。为什么需要监控 EC2 API 调用量Karpenter 的工作机制决定了它天然是 Amazon EC2 API 的高频调用方它需要通过 EC2 API发现基础设施子网、安全组、AMI、实例类型、竞价价格等它需要通过 EC2 API启动和终止节点CreateFleet、RunInstances、TerminateInstances等。而 AWS 对 EC2 API 的请求速率限制是按账户per-account、按区域per-Region强制执行的并非按集群或按 Karpenter 实例。因此只要某个账户在一个区域内运行着足够大的集群规模产生足够多的请求就存在被限流的可能。更关键的一点是Karpenter 的 EC2 API 调用量并不是固定的它会随以下因素动态伸缩运行的EC2NodeClass数量与集群数量集群扩缩容的频率scale up / scale down 越频繁Launch/Terminate 类的请求越多Karpenter 自身的版本不同版本对缓存、刷新与重试策略的实现不同。由于调用量具备这种可伸缩性单靠想当然地认为流量不大是不够的必须将其纳入持续监控。Karpenter 会调用哪些 Amazon EC2 APIKarpenter 对 EC2 API 的调用可以划分为三大类Launch热路径、Terminate终止、Cleanup清理以及大量的Discovery发现/刷新类调用。下表完整列出 v1.12 文档所声明的 API 及其调用时机API类别Karpenter 何时调用CreateFleetLaunch热路径为满足待调度 Pod 而启动节点CreateLaunchTemplateLaunch热路径为新节点准备启动配置RunInstancesLaunch热路径启动节点CreateTagsLaunch热路径在创建实例、车队与启动模板时打标签TerminateInstancesTerminate在 consolidation、drift 或过期expiration期间移除节点DeleteLaunchTemplateCleanup清理 Karpenter 托管的启动模板DescribeSubnetsDiscovery / refresh为每个EC2NodeClass解析subnetSelectorTermsDescribeSecurityGroupsDiscovery / refresh为每个EC2NodeClass解析securityGroupSelectorTermsDescribeImagesDiscovery / refresh为每个EC2NodeClass解析amiSelectorTermsDescribeCapacityReservationsDiscovery / refresh解析capacityReservationSelectorTermsOn-Demand Capacity ReservationsDescribeInstanceTypes、DescribeInstanceTypeOfferingsDiscovery / refresh解析可用的实例类型及其 offeringsDescribeSpotPriceHistoryDiscovery / refresh为实例类型选择确定 Spot 定价DescribePlacementGroupsDiscovery解析EC2NodeClass引用的 placement groupsDescribeInstances、DescribeInstanceStatusDiscovery对账reconcile已启动实例的状态DescribeLaunchTemplatesDiscovery对账 Karpenter 托管的启动模板从源码结构看Karpenter 在架构上为 EC2 API 调用做了若干收敛设计这直接关系到你的调用量观测热路径的批量合并pkg/batcher/目录实现了针对CreateFleet、DescribeInstances、TerminateInstances等调用的批处理器batcher例如 pkg/batcher/createfleet.go 中的CreateFleetBatcher会把一段时间窗口内的多个CreateFleetInput合并后一次性调用底层 EC2 API其对应的测试 pkg/batcher/createfleet_test.go 验证了多个请求只产生一次底层调用的行为。这意味着你在指标里看到的请求总数已经是批量合并后的结果。User-Agent 打标Karpenter 在创建 AWS SDK 客户端时会追加karpenter.sh-version形式的 User-Agent见 pkg/operator/operator.go#L296-L303 的WithUserAgent这为后续在 CloudTrail 中归因流量提供了依据。如何观测调用量与限流指标端点与三个核心指标Karpenter 默认在:8080/metrics暴露 Prometheus 指标端口可通过环境变量/启动参数METRICS_PORT修改默认值为 8080见 v1.12 Settings 参考 中的METRICS_PORT行。观测 EC2 调用量最直接的指标是AWS SDK Go 请求指标它们在 v1.12 Metrics 参考 中被列为 STABLE 稳定性等级分别带有service例如EC2、action具体 API 操作例如DescribeSubnets或CreateFleet与codeHTTP 状态码200表示成功503即RequestLimitExceeded限流响应标签指标名含义aws_sdk_go_request_totalAWS SDK 请求总数按service、action、code维度统计aws_sdk_go_request_attempt_total请求尝试总数一次请求在重试时可能产生多次尝试aws_sdk_go_request_retry_count每个请求的重试次数值得特别注意的是aws_sdk_go_request_retry_count的预警价值AWS SDK 在被限流的请求以错误形式暴露出来之前会先对其进行重试。因此持续上升的重试计数是限流的最早期信号——当你看到 retry 指标抬头时说明限流可能已经在发生只是尚未体现为 503 错误。推荐 PromQL 查询按操作维度绘制 Karpenter 的 EC2 请求速率sum by (action) (rate(aws_sdk_go_request_total{serviceEC2}[5m]))绘制 Karpenter EC2 请求中被限流503的占比sum(rate(aws_sdk_go_request_total{serviceEC2, code503}[5m])) / sum(rate(aws_sdk_go_request_total{serviceEC2}[5m]))第二个查询尤其适合作为告警规则当该比例在较长周期内持续非零或明显上升时就应该触发告警并着手处理。通过 CloudTrail 归因流量指标能告诉你Karpenter 调用了多少而如果需要进一步做审计级归因例如确认某批 EC2 API 事件确实来自 Karpenter可以借助 AWS CloudTrailKarpenter 在其 AWS SDK 客户端上设置karpenter.sh-version形式的 User-Agent源码实现见 pkg/operator/operator.go#L296-L303因此在 CloudTrail 事件中按userAgent过滤筛选出以karpenter.sh-开头的值即可把 EC2 API 事件归因到 Karpenter 及其版本。如何对比账户的 EC2 API 请求速率限额观测到调用量之后下一步是判断是否接近或超过配额。要点如下限额是按账户、按区域独立生效的同一账户内不同区域的限额彼此独立需要在每个运行 Karpenter 的区域分别核查。不同动作组独立限额非变更类non-mutating的Describe*动作与变更类mutating动作的限额是分别计算的例如DescribeSubnets的配额与CreateFleet的配额互不影响。因此对比限额时应将观测到的Describe*请求速率与对应的 Describe 配额对比将 Launch/Terminate 类请求速率与对应的变更类配额对比。使用 Service Quotas 核查已应用的限额在 Service Quotas 控制台中查看 Amazon EC2 在每个区域已应用的请求速率限额与上文从指标观测到的稳态请求速率进行对比。接近或超过即申请提升如果稳态请求速率接近甚至超过限额应及时通过 Service Quotas 申请提高配额。注意账户内多集群的叠加效应由于限额按账户生效一个账户内所有集群的 EC2 请求量会竞争同一份限额。这意味着即使单个集群的调用量不大多个集群叠加后也可能触及配额。最佳实践用多账户架构隔离集群限额的按账户、按区域特性直接推导出一条架构层面的最佳实践将大量集群集中在一个账户中等于把所有这些集群的 EC2 请求量全部压向该账户的同一份限额。因此建议采用多账户架构multi-account architecture按账户隔离集群从而把请求量分散到多个账户各自的限额上。这与 AWS Well-Architected Framework 中的多账户指引思路一致账户不仅是安全与成本边界在这里也成为API 速率限额的天然扩容单元。临时缓解手段调大刷新间隔workaround重要警告调大刷新间隔是一个临时缓解手段workaround而不是推荐的长期配置官方文档明确警告不要依赖它它只能通过牺牲数据新鲜度来降低Describe*调用量间隔越大Karpenter 观察到变化如子网的可用 IP 容量变化、新的 AMI 发布就越慢可能基于陈旧数据做出决策因此它只应作为短期措施在根本问题底层调用量过大或配额不足被解决之前临时使用。正确做法仍是优先采用上文的多账户架构等最佳实践并申请与调用量匹配的限额。可配置的刷新间隔Karpenter 会按固定间隔刷新每个EC2NodeClass缓存的子网、安全组与 AMI 数据。这些间隔是可配置的相关参数定义于 pkg/operator/options/options.go#L72-L73对应 v1.12 的 Settings 体系参数环境变量作用默认值源码约束SUBNET_REFRESH_INTERVAL子网数据刷新频率约束DescribeSubnets调用量1m最小1mAMI_REFRESH_INTERVALAMI 数据刷新频率约束DescribeImages调用量1m最小1m从源码实现看这两个选项同时支持环境变量与 CLI 参数两种注入方式fs.DurationVar与env.WithDefaultDuration组合并明确校验必须至少为 1m。效果量化由于Describe*请求的稳态速率与刷新间隔近似成反比把间隔从1m调大到5m可将对应调用的速率大致降低约 5 倍。这种线性关系使你可以根据观测到的调用量反推所需的间隔但务必在降低速率与数据新鲜度之间权衡并尽快回到正式的容量规划路径上。小结围绕EC2 API 调用量监控可以形成一套完整的操作闭环了解调用面Karpenter 的 Launch/Terminate/Cleanup 调用驱动扩缩容Discovery 调用随EC2NodeClass数量与刷新节奏持续发生持续观测通过:8080/metrics上的aws_sdk_go_request_total、aws_sdk_go_request_attempt_total、aws_sdk_go_request_retry_count三个指标跟踪请求速率、尝试次数与重试趋势用code503识别限流用karpenter.sh-前缀的 User-Agent 在 CloudTrail 中归因对比配额按账户、按区域、按动作组分别比对 Service Quotas 与观测速率接近或超过即申请提升架构治理优先采用多账户架构分散请求量临时兜底仅在必要时临时调大SUBNET_REFRESH_INTERVAL/AMI_REFRESH_INTERVAL并尽快回归正式方案。【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表