ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Karpenter Provider for AWS 的 Allocatable Diff 工具:节点容量与可分配资源差异对比实战指南

Karpenter Provider for AWS 的 Allocatable Diff 工具:节点容量与可分配资源差异对比实战指南 Karpenter Provider for AWS 的 Allocatable Diff 工具节点容量与可分配资源差异对比实战指南【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-aws导读allocatable-diff是 karpenter-provider-aws 仓库hack/tools目录下的一个诊断辅助工具用于遍历集群中已部署的工作节点逐一与 Karpenter 基于 EC2 实例规格计算出的“预期容量Capacity”与“预期可分配资源Allocatable”做对比并把对比结果导出为 CSV 文件。这份 CSV 是校准vmMemoryOverheadPercentVM 内存开销百分比等 cloudprovider 参数的核心数据依据。读完本文你将掌握该工具的运行方式、命令行参数、CSV 输出格式的每一列含义以及如何结合源码理解 Karpenter 的容量计算链路。一、工具定位为什么需要对比“预期”与“实际”Karpenter 在为 Pod 调度选择实例类型时依赖自己从 EC2 实例规格InstanceTypeInfo推算出的容量与可分配资源。然而节点实际加入集群后kubelet 上报的node.Status.Capacity与node.Status.Allocatable可能和 Karpenter 的推算值存在偏差偏差来源包括VM 运行时自身的开销内存被内核、系统进程占用不同 AMI 系列AL2、AL2023、Bottlerocket、Custom、Windows对资源的预留差异kubelet 配置如kubeReserved、systemReserved、evictionHard对可分配资源的扣除Graviton 架构下额外的 CMA 保留内存等硬件特性。正如该工具文档hack/tools/allocatable_diff/README.md所述它遍历你当前已部署的节点列表与 Karpenter 对这些节点的容量与可分配资源预期进行比较输出一个 CSV 文件供进一步分析“预期容量/预期可分配资源”与“实际值”的差距从而确定 AWS cloudprovider 中vmMemoryOverheadPercent这样的参数值。简而言之这是一个让 Karpenter 的“理论计算”与集群的“物理现实”对齐的数据采集工具服务于容量模型的校准工作。二、构建与运行2.1 前置条件一个可访问的 Kubernetes 集群工具通过 kubeconfig 连接默认读取KUBECONFIG环境变量或~/.kube/config对应源码中的config.GetConfigOrDie()见 hack/tools/allocatable_diff/main.go集群中已部署 karpenter-provider-aws且存在带karpenter.sh/provisioner-name标签的节点详见下文“节点筛选逻辑”本地 Go 工具链用于编译该工具仓库根目录 go.mod。2.2 运行命令文档给出的标准用法如下export CLUSTER_NAMEkarpenter-demo ./allocatable-diff --cluster-name$CLUSTER_NAME --out-fileallocatable-diff.csv即先编译出allocatable-diff可执行文件再通过--cluster-name指定集群名称、--out-file指定输出 CSV 文件路径。三、命令行参数详解从 main.go 的 flag 定义可以看出该工具支持三个参数参数类型默认值说明--cluster-namestring空必填集群名称用于向GetInstanceTypes()传入子网信息为空时工具直接报错退出log.Fatalf(cluster name cannot be empty)--out-filestringallocatable-diff.csv生成的 CSV 输出文件路径--overhead-percentfloat640参与计算的 VM 内存开销百分比会被写入 context 中的VMMemoryOverheadPercent其中--overhead-percent与 Karpenter 运行时参数vm-memory-overhead-percent直接对应。在 pkg/operator/options/options.go 中该参数的默认值为0.075即 7.5%可通过环境变量VM_MEMORY_OVERHEAD_PERCENT覆盖pkg/operator/options/options_validation.go 会校验其不能为负数。注意诊断工具默认把overhead-percent置为 0即先按“零开销”的纯规格推算预期值便于你观察真实开销也可以传入与线上配置一致的值做对比。四、CSV 输出格式逐列解读工具会向 CSV 写入两行表头见 main.goInstance Type, Expected Capacity, , , Expected Allocatable, , , Actual Capacity, , , Actual Allocatable, Memory (Mi), CPU (m), Storage (Mi), Memory (Mi), CPU (m), Storage (Mi), Memory (Mi), CPU (m), Storage (Mi), Memory (Mi), CPU (m), Storage (Mi)随后每个节点一行记录共 13 列列含义Instance Type实例类型名称如m7i.large取自节点标签node.kubernetes.io/instance-typeExpected Capacity – Memory (Mi)Karpenter 预期容量中的内存MiB来源于instanceType.Capacity.Memory()Expected Capacity – CPU (m)预期容量中的 CPU毫核来源于instanceType.Capacity.Cpu().MilliValue()Expected Capacity – Storage (Mi)预期容量中的临时存储MiB来源于instanceType.Capacity.StorageEphemeral()Expected Allocatable – Memory/CPU/StorageKarpenter 预期可分配资源来源于instanceType.Allocatable()Actual Capacity – Memory/CPU/Storage节点实际上报的容量来源于node.Status.CapacityActual Allocatable – Memory/CPU/Storage节点实际上报的可分配资源来源于node.Status.AllocatableCSV 文件中存储容量的单位为 MiB内存/存储CPU 单位为毫核m。对比“Expected Allocatable”与“Actual Allocatable”两组的差值即可量化 kubelet 侧系统预留、驱逐阈值等与 Karpenter 侧VM 开销模型之间被“吃掉”的资源量。五、工具内部工作流程源码级解析整个执行流程可以从 main.go 梳理为以下几步建立客户端通过config.GetConfigOrDie()读取集群配置用 controller-runtime 的client.New创建 Kubernetes 客户端写入运行参数把ClusterName、IsolatedVPC: true、VMMemoryOverheadPercent注入 contextoptions.ToContext保证后续容量计算遵循与线上 operator 相同的参数上下文初始化 operator 与 cloudprovider调用operator.NewOperator构建 operator再通过cloudprovider.New组装出 AWS 云提供商实例其中依赖InstanceTypesProvider、InstanceProvider、AMIProvider、SecurityGroupProvider、CapacityReservationProvider、PlacementGroupProvider、InstanceTypeStore等组件pkg/cloudprovider/cloudprovider.go获取实例类型全集cloudProvider.GetInstanceTypes(ctx, nil)返回当前可用实例类型的规格与容量模型拉取并筛选节点列出全部 Node只保留满足以下条件的节点带有karpenter.sh/provisioner-name标签即由 Karpenter 纳管的节点node.Status.Allocatable.Memory()不为 0然后按实例类型标签node.kubernetes.io/instance-type排序输出逐节点匹配实例类型用节点的实例类型标签在instanceTypes中查找对应的InstanceType对象找不到则报错退出写出 CSV按上文格式逐行写出预期值与实际值。从工具对节点筛选条件可以看出它只关心Karpenter 纳管的节点karpenter.sh/provisioner-name标签这是保证“预期”与“实际”可比对的前提。六、数据如何反哺vmMemoryOverheadPercent校准CSV 分析是调整vmMemoryOverheadPercent的闭环起点。该参数在 Karpenter 的容量计算中直接影响内存预期值在 pkg/providers/instancetype/types.go 的memory()函数中Karpenter 先从 EC2 规格读取内存MemoryInfo.SizeInMiB随后执行两步修正// Gravitons have an extra 64 MiB of cma reserved memory that we cant use if len(info.ProcessorInfo.SupportedArchitectures) 0 info.ProcessorInfo.SupportedArchitectures[0] arm64 { sizeInMib - 64 } mem : resources.Quantity(fmt.Sprintf(%dMi, sizeInMib)) // Account for VM overhead in calculation mem.Sub(resource.MustParse(fmt.Sprintf(%dMi, int64(math.Ceil(float64(mem.Value())*options.FromContext(ctx).VMMemoryOverheadPercent/1024/1024)))))arm64Graviton实例会额外扣除 64 MiB 的 CMA 保留内存然后按VMMemoryOverheadPercent对剩余内存向上取整扣减作为 VM 运行时开销。因此当 CSV 中“Expected Allocatable 内存”系统性高于“Actual Allocatable 内存”时说明vm-memory-overhead-percent偏小反之则偏大。你可以用不同--overhead-percent值多次运行工具找到让预期值与实际值最接近的百分比再将其配置到 Karpenter operator--vm-memory-overhead-percent或环境变量VM_MEMORY_OVERHEAD_PERCENT。七、使用限制与注意事项集群必须存在 Karpenter 纳管节点若集群中没有带karpenter.sh/provisioner-name标签的节点CSV 将只有表头、没有数据行实例类型需在 GetInstanceTypes 返回集中如果某节点的实例类型无法匹配工具会直接log.Fatalf退出属于预期内的保护行为工具本身不修改集群状态它只读取 Node 列表与实例规格并写出 CSV是纯只读诊断工具可放心在业务集群上运行该工具用于数据采集与分析实际校准后的参数落地仍需通过 Karpenter operator 的启动参数完成。八、关联代码与进一步阅读工具本体与文档hack/tools/allocatable_diff/main.go、hack/tools/allocatable_diff/README.md运行参数定义与默认值pkg/operator/options/options.go参数校验逻辑pkg/operator/options/options_validation.go内存容量计算含 VM 开销与 Graviton 修正pkg/providers/instancetype/types.go实例类型容量与可分配资源的计算测试pkg/providers/instancetype/suite_test.go同目录下还有多个辅助工具如 hack/tools/launchtemplate_counter、hack/code/vpc_limits_gen可一并了解 Karpenter 数据生成工具链的组成。【免费下载链接】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),仅供参考
返回列表