ARTICLE DETAIL

资讯详情

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

Karpenter 监控 Amazon EC2 API 用量与节流实践指南

Karpenter 监控 Amazon EC2 API 用量与节流实践指南 Karpenter 监控 Amazon EC2 API 用量与节流实践指南【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-aws本文围绕 Karpenterkarpenter-provider-aws与 Amazon EC2 API 之间的交互系统梳理 Karpenter 会调用哪些 EC2 操作、如何通过 Prometheus 指标与 CloudTrail 观测调用量和RequestLimitExceededHTTP 503节流如何对照账户级请求速率配额评估风险以及降低被节流概率的工程化实践。读完本文你将掌握一套可落地的 EC2 API 用量监控与容量规划方案。Karpenter 的核心能力建立在 Amazon EC2 API 之上它需要调用 EC2 来发现基础设施、启动和终止节点。而 AWS 对 EC2 API 请求实施按账户、按区域的速率限制一旦请求速率超出配额超出的请求会被拒绝并返回RequestLimitExceeded错误HTTP 503直接影响 Karpenter 管理集群的能力。因此监控 EC2 API 调用量是运行 Karpenter 集群的必要运维动作。为什么需要监控节流如何影响 KarpenterEC2 API 请求速率限制按账户、按区域分别生效并且不同操作分组相互独立例如非变更类的Describe*操作与变更类操作分开限流。Karpenter 的调用量不是固定的它随以下因素动态伸缩集群中EC2NodeClass的数量账户内运行的集群数量集群扩缩容的频率运行的 Karpenter 版本不同版本对 API 的调用策略不同。当集群规模足够大时请求量完全可能触达配额上限而被节流。被节流的直接后果是启动、终止、发现等关键路径上的 API 调用失败或重试进而拖慢节点供给provisioning与干扰处理disruption最终表现为 Pod 长时间 Pending。Karpenter 调用哪些 Amazon EC2 API下表完整列出 Karpenter 会调用的 EC2 API、所属类别及触发时机出自本文档源文件 monitoring-ec2-api-usage.mdAPI类别调用时机CreateFleet启动热路径为满足 Pending Pod 启动节点CreateLaunchTemplate启动热路径为新节点准备启动配置RunInstances启动热路径启动节点CreateTags启动热路径在实例、Fleet 和启动模板创建时打标签TerminateInstances终止在 consolidation、drift 或过期expiration时移除节点DeleteLaunchTemplate清理移除 Karpenter 托管的启动模板DescribeSubnets发现 / 刷新为每个EC2NodeClass解析subnetSelectorTermsDescribeSecurityGroups发现 / 刷新为每个EC2NodeClass解析securityGroupSelectorTermsDescribeImages发现 / 刷新为每个EC2NodeClass解析amiSelectorTermsDescribeInstanceTypes、DescribeInstanceTypeOfferings发现 / 刷新解析可用实例类型及其 offeringDescribeSpotPriceHistory发现 / 刷新确定 Spot 定价以辅助实例类型选择DescribeInstances发现调和reconcile已启动实例的状态DescribeLaunchTemplates发现调和 Karpenter 托管的启动模板从调用时机可以看出流量大头集中在启动热路径CreateFleet、CreateLaunchTemplate、CreateTags和发现/刷新路径各类Describe*。其中Describe*类操作是典型的非变更类non-mutating请求与变更类操作分属不同的速率配额分组。源码印证Karpenter 对高频调用的批处理优化为了降低外部 API 的节流压力Karpenter 在 pkg/batcher/batcher.go 中实现了一套通用批处理库其包注释明确指出目的batcher implements a generic batching lib for API calls so that load can be reduced to external APIs that excessively throttle实现通用 API 调用批处理库以降低对过度节流的外部 API 的负载。批处理器通过IdleTimeout空闲超时、MaxTimeout最大超时、MaxItems单批最大条目数等参数控制批处理窗口并使用RequestHasher对请求参数哈希分桶把参数相同的请求合并为单次调用。实际应用中pkg/batcher/createfleet.go 将多个单实例的CreateFleet请求合并为一次调用IdleTimeout: 35ms、MaxTimeout: 1s、MaxItems: 1000并在返回结果时把 Fleet 返回的实例 ID 拆分回各个请求方pkg/batcher/describeinstances.go 合并DescribeInstances发现请求pkg/batcher/terminateinstances.go 合并TerminateInstances终止请求IdleTimeout: 100ms。此外实例类型发现通过分页器paginator完成例如 pkg/providers/instancetype/instancetype.go 使用DescribeInstanceTypeOfferingsPaginator分页拉取 offeringMaxResults上限为 1000避免单次请求超限。这些机制说明即使 Karpenter 已经内置了节流缓解手段大规模集群下仍可能出现节流监控依然必要。如何观测调用量与节流Karpenter 以 Prometheus 格式暴露指标默认地址为:8080/metrics可通过METRICS_PORT环境变量修改见 Metrics 参考文档。AWS SDK 请求指标是衡量 Karpenter 的 EC2 调用量与节流情况最直接的途径它们带有以下标签service服务名例如EC2actionAPI 操作名例如DescribeSubnets、CreateFleetcodeHTTP 状态码——200表示成功503表示RequestLimitExceeded节流响应。三个核心指标如下aws_sdk_go_request_total—— AWS SDK 请求总数按service、action、code标签区分aws_sdk_go_request_attempt_total—— 请求尝试总数单个请求在重试时可能产生多次尝试aws_sdk_go_request_retry_count—— 每个请求的重试次数。持续出现的重试是节流的早期信号因为 AWS SDK 在被节流的请求报错之前会先进行重试。对应指标定义可参见 Metrics 参考文档 中的 AWS SDK Go Metrics 小节除上述三个指标外还包含aws_sdk_go_request_duration_seconds、aws_sdk_go_request_attempt_duration_seconds等辅助指标用于观测请求延迟。示例按操作统计 EC2 请求速率用以下 PromQL 绘制 Karpenter 的 EC2 请求速率按操作分组sum by (action) (rate(aws_sdk_go_request_total{serviceEC2}[5m]))示例统计被节流的请求占比用以下 PromQL 计算 EC2 请求中被节流HTTP 503的比例sum(rate(aws_sdk_go_request_total{serviceEC2, code503}[5m])) / sum(rate(aws_sdk_go_request_total{serviceEC2}[5m]))建议为该比例设置告警例如接近或超过某个阈值时告警并结合aws_sdk_go_request_retry_count观察重试趋势以便在节流演变为可见错误前提前介入。通过 CloudTrail 归因 Karpenter 的 API 调用Karpenter 会为其 AWS SDK 客户端设置karpenter.sh-version形式的 User-Agent实现见 pkg/operator/operator.go其中WithUserAgent通过awsmiddleware.AddUserAgentKey注入 User-Agent。因此你可以在 AWS CloudTrail 中按userAgent过滤出以karpenter.sh-开头的记录将 EC2 API 事件准确归因到 Karpenter从而核对某个时段内 Karpenter 实际发起的 API 调用明细结合 CloudTrail 与上述 Prometheus 指标交叉验证调用量与节流情况排查 Karpenter 之外如其他工具或人工操作是否也占用了同一账户的配额。如何对照账户的 EC2 API 请求速率配额Amazon EC2 API 请求速率限制按账户、按区域生效并且不同操作分组相互独立例如非变更的Describe*操作与变更类操作分属不同配额组。因此在 Karpenter 运行的每个区域通过 AWS Service Quotas 查看该账户已应用的 Amazon EC2 配额将配额与上文指标观测到的稳态请求速率进行对比若稳态请求速率接近或超过配额及时申请提高配额request an increase。需要特别注意的是同一账户内所有集群的请求量会竞争同一份配额。因为限额按账户和区域计账户里每多一个集群都在为这份共享配额增加负担。评估时应以账户而非单个集群为单位汇总请求速率。最佳实践用多账户架构隔离集群这是官方文档给出的核心建议由于请求速率配额按账户、按区域生效把大量集群集中在一个账户中等于把所有集群的 EC2 请求量集中到该账户的配额上。采用按账户隔离集群的多账户架构可以将请求量分散到多个账户各自的配额中显著降低单账户被节流的概率。具体架构设计可参考 AWS Well-Architected Framework 中的多账户指引。其他可配合的实践要点持续监控将上文两条 PromQL 做成长期面板与告警覆盖启动热路径CreateFleet等与发现路径Describe*等的分组视图善用批处理内置优化确认运行的是较新的 Karpenter 版本以享受 pkg/batcher 中CreateFleet、DescribeInstances、TerminateInstances等批处理带来的调用量削减关注EC2NodeClass规模DescribeSubnets、DescribeSecurityGroups、DescribeImages等发现类调用随EC2NodeClass数量线性增长精简选择器selectorTerms数量可减少不必要的发现请求按区域核对配额在多区域部署时逐个区域检查 Service Quotas因为配额不跨区域共享。小结Karpenter 对 Amazon EC2 API 的依赖是刚性的而 AWS 的请求速率配额是硬性的。通过本文介绍的指标观测aws_sdk_go_request_total等、CloudTrail User-Agent 归因、Service Quotas 对照和多账户隔离你可以系统性地评估并管理 EC2 API 用量将RequestLimitExceeded对集群供给能力的影响控制在可接受范围。相关原始文档位于 website/content/en/v1.0/tasks/monitoring-ec2-api-usage.md同一主题在 v1.12、v1.13、v1.14 及 preview 文档树中均有对应版本可作为跨版本运维参考。【免费下载链接】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),仅供参考
返回列表