火山引擎容器服务(VKE)支持根据工作负载的资源需求调整节点容量,在业务高峰补充可用资源,在负载回落后回收冗余节点。合理配置节点池、资源请求和缩容保护,有助于兼顾业务可用性、启动时延与资源成本。
说明
配置节点弹性伸缩时,推荐优先使用 Karpenter 方案。它支持多个节点池使用多个实例规格同时扩容,根据 Pending Pod 的调度要求选择合适的节点组合。对于节点池采用资源容量一致的实例规格、计划继续使用集群自动伸缩的业务,也可选择 Cluster Autoscaler 方案。
说明
HPA 等工作负载伸缩组件负责增加 Pod 副本,而节点弹性组件负责补充承载这些 Pod 的节点。仅有 CPU 使用率升高、没有新增待调度需求时,不一定会增加节点。按业务需要组合使用。工作负载弹性伸缩的配置,请参见 工作负载弹性伸缩最佳实践。 节点池配置是节点弹性伸缩的基础,决定可供给节点的实例规格、可用区、容量范围和调度属性。建议首先完成以下规划,再配置工作负载与伸缩组件。更多节点池信息,请参见 节点池概述。 每个节点池最多配置 10 个实例规格。Karpenter 根据 Pending Pod 的资源请求和调度要求,从这些实例规格中选择若干合适的实例规格,并尽可能减少需要扩容的节点总数。选择结果还受节点池容量范围、库存和调度约束影响,不代表每次都会使用所有候选实例规格。
实例规格还需满足业务的 GPU 型号和操作系统要求。存在精确机型或设备约束时,使用匹配的专用节点池,并检查实际交付节点的标签和资源是否一致。
CA 以节点池首个实例规格作为容量估算基准。后备实例规格应具有同等资源容量,并满足等价调度条件;否则可能出现模拟可调度、实际节点却无法容纳 Pod 的情况。自定义标签、污点等属性的参考来源见 保持节点标签与调度条件一致。 系统稳定节点池也需要随集群规模调整。新增大量节点或 Pod 后检查 CoreDNS 请求负载、延迟及失败情况,并按所用组件的配置方式补充容量。跨节点或跨可用区分散副本时,要同时保留足够的可调度节点,避免硬反亲和使系统组件在缩容后无法重建。
Pod 需要在指定可用区运行时,通过节点亲和性选择目标节点池,并配置该节点池的子网与扩容策略。优先让每个节点池只对应一个可用区;同一个可用区可以对应多个节点池。 这样可以明确每个节点池对应的节点可用区,便于配置调度约束和排查问题。
需要跨可用区部署业务时,为各可用区准备相应节点池,再按工作负载的调度要求选择目标节点池。例如,同一可用区可以分别建立在线业务节点池和批任务节点池;另一个可用区使用各自的节点池。
如需单个节点池在多个可用区创建节点时,可配置多可用区子网与扩容策略,并额外核对每次扩容实际使用的可用区。已有固定可用区数据卷时,候选子网必须满足数据卷的可用区约束;跨可用区创建节点不会迁移已有数据卷,候选节点仍需满足业务硬约束。
扩容时,CA 与 Karpenter 对自定义标签、污点等调度属性的参考来源不同。
在节点池中统一维护业务需要的自定义标签和污点,并检查存量节点是否与节点池配置一致。
- CA 在有存量节点时参考其属性,节点池缩到零后则参考节点池配置;仅修改存量节点可能影响 CA 的扩容判断,但不会保证新节点获得相同属性。
- Karpenter 始终参考节点池配置,仅修改存量节点不会改变其扩容时使用的调度属性。
允许缩容到零的节点池,应提前在节点池配置中补齐业务所需标签和污点。扩容后检查新节点的实际属性;如 Pod 仍因标签或污点不匹配而 Pending,按上表核对对应来源,并修正节点池配置与节点属性。Karpenter 的系统拓扑键按“配置 Karpenter 的拓扑亲和”设置存在性条件,不为所有节点填写同一个固定值。系统组件、控制器和必需插件应保留可独立运行的稳定容量。
配置硬亲和性、污点和拓扑约束时,确认至少有一个节点池能够同时满足这些条件。对于调度偏好,可使用软亲和性;使用拓扑分布约束时,可按业务需要设置whenUnsatisfiable: ScheduleAnyway。设备、数据和隔离等必须满足的要求应使用硬约束。
如果没有节点池或实例规格满足要求,需补充相应资源,或经业务确认后调整约束。节点弹性会遵循这些硬约束;增加节点数量无法解决约束不匹配,也不会自动增加业务副本或重新均衡现有 Pod。
为允许故障转移的工作负载预留后备节点池容量,并确认节点亲和性和卷约束允许使用这些节点池。
使用支持延迟绑定的存储时,在 StorageClass 配置volumeBindingMode: WaitForFirstConsumer,同时核对 CSI 能力、allowedTopologies 和已有 PV 的nodeAffinity。配置方法见 Kubernetes 存储类 和 拓扑分布约束。 节点池上下限不能替代云资源配额。预计峰值超过账户节点、实例或其他资源配额时,提前按 如何提升配额(Quota)申请调整,并为库存不足准备满足业务约束的后备实例规格。 核算容量时,分别统计每个节点池的配置上限、已有节点、正在创建的实例和 Ready 节点,并统一核算多个节点池共享的账户配额、子网资源和可用区库存。例如:假设两个节点池的最大节点数均为 20,合计配置上限为 40;如果共享账户的剩余实例配额为 10,后续扩容仍受这 10 个实例额度约束,实际可扩数量还取决于已有容量、在途请求和库存等条件。
提高节点池最小节点数或节点池最大节点数后,继续核对伸缩记录和实际 Ready 容量;降低节点池最大节点数也不应当作立即强制删除节点的命令。节点归属、在途请求和业务保护都会影响实际结果,修改后以目标节点池状态和活动记录确认。
VKE 节点池支持通过节点分布策略混合使用按量付费实例与抢占式实例,适合能够接受实例回收、具备重试或恢复能力的弹性业务。混合策略中的按量基础容量用于保留该节点池内的按量付费实例,不替代固定容量的包年包月规划。
具体配置和适用范围见 创建抢占式实例节点池。该文档还介绍节点池层的抢占式实例补偿策略,按业务恢复要求选择,并检查活动结果与实际费用。 根据容量使用时长和业务可中断性选择计费方式,将固定容量与弹性容量分别规划。
多个实例规格的单价不同,不能只按节点数量比较成本。持续核对节点小时、计费类型和账单;抢占式容量由按量实例补充后,费用可能增加。节点回收后,还应按保留策略检查独立云盘、快照等资源是否继续计费。
在相近业务量、可用性和启动时延下评估成本变化。节点池最大节点数用于限制容量,不能替代费用预算;费用告警只用于提醒,不会自动停止扩容。
根据已规划的节点池,设置工作负载的资源请求和调度约束。确认节点池提供的资源与调度属性能够满足 Pod 需求后,再优化伸缩速度。若扩容后 Pod 仍无法调度,优先检查资源请求和调度约束是否与新节点匹配。
- 为业务容器设置 CPU、内存 requests,并计入 Sidecar、Init Container、临时存储和设备需求。结合历史负载和峰值校准,避免用 limits 或当前使用率代替请求量。
- 以节点实际 Allocatable 为基础,扣除预计运行的 DaemonSet 等 Pod 的资源请求,估算业务可用容量。节点预留资源的计算规则见 节点预留资源,已计入 Allocatable 的预留资源无需重复扣除。至少应有一个满足调度条件的候选实例规格,能够在扣除这些开销后容纳单个 Pod 的有效请求。
- 检查节点可容纳的 Pod 数量、子网剩余 IP、网卡资源和卷挂载数量。任一资源达到上限,都可能使新增 Pod 无法调度或启动。
- 配置 Namespace 的ResourceQuota和LimitRange,减少资源请求漏配并限制资源异常增长。若 Pod 因配额限制而创建失败,先解决创建问题,再检查节点容量;节点弹性负责补充承载 Pod 的节点。
计算请求时应区分容器生命周期。普通 Init Container 顺序执行,不能把所有 Init Container 的 requests 与业务容器简单相加;应按集群版本对应的调度规则核对 Pod 的有效请求。Sidecar、设备插件及业务启动方式变化后重新评估,配置规则见 Kubernetes Init Container 资源共享规则。 使用 CSI 存储的工作负载,除节点预留资源和 DaemonSet 请求外,还需检查 CSI 组件是否额外创建客户端 Static Pod。Karpenter 在选择实例规格时不会额外计入这类 CSI 客户端资源,业务应根据客户端实际请求预留容量,并避免与 CSI DaemonSet 请求重复计算;否则新节点创建成功后,业务 Pod 仍可能因资源不足而无法调度。
使用 Karpenter 且 Pod 配置了拓扑亲和时,必须使用cluster.vke.volcengine.com/machine-name作为 topologyKey。同时在 Pod 的nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution中,对同一标签键配置operator: Exists,确保 Pod 只调度到具有该拓扑键的节点。
如下示例为工作负载 Pod 模板的spec配置,通过软反亲和尽量将同一业务的 Pod 分散到不同节点,并通过节点亲和性限定目标节点池。示例权重为 weight: 100,请按业务需要调整。使用时,将节点池标签键、标签值和业务标签值替换为实际配置;节点池标签应以目标节点池中配置的键和值为准。
拓扑键存在性和节点池选择条件放在同一个nodeSelectorTerm的matchExpressions中,表示同时满足。若已有多个候选nodeSelectorTerm,每个候选项都应保留该拓扑键的 Exists 条件。配置后检查新节点是否具有该标签、Pod 是否落在目标节点池,以及亲和规则是否满足;存在性检查不通过时,先核对节点标签和节点池配置。
Karpenter 根据 Pending Pod 事件触发扩容评估,为新增节点能够解决的待调度需求选择节点组合。它支持多个节点池使用多个实例规格同时扩容,并在满足调度要求的前提下尽可能减少新增节点总数。已分配到节点、正在等待镜像或存储初始化的 Pod,不应仅因处于 Pending 阶段就被判定为需要扩容。新节点就绪后,还需确认业务 Pod Ready。
节点池已配置候选实例规格,并不代表该实例规格始终有可用库存。创建失败时,根据伸缩活动的错误信息检查库存、配额和网络资源,再按需调整节点池的可用区子网或候选实例规格。
节点池优先级用于扩容时选择候选节点池;Pod PriorityClass影响 Pod 的调度与抢占;节点亲和性约束 Pod 可以使用的节点。配置节点池优先级不会使 Pod 优先调度到该节点池的已有节点,也不会自动迁移已经运行的 Pod。
例如:候选实例规格包含 4 vCPU/16 GiB 和 8 vCPU/32 GiB,两个业务 Pod 分别请求 3 和 5 vCPU。Karpenter 会综合内存需求、节点预留资源、DaemonSet 请求、现有容量和调度约束选择节点组合,实际结果不一定是按两种实例规格各创建一个节点。确认新增节点属于候选实例规格且能够承载待调度 Pod 后,再结合资源请求、可调度容量和实际使用量评估利用情况;节点总数本身不能代表资源利用率或成本。
节点自动伸缩(Cluster Autoscaler)
CA 检查 Pod 是否可通过新增节点完成调度,再根据节点池模板和扩容算法选择节点池扩容。
扩容算法、弹性灵敏度和自动缩容参数的范围及默认值,以“配置与使用文档”中的 CA 使用文档为准。按业务需求选择以下扩容算法。
开启自动缩容前,先配置“缩容与业务保护”中的应用保护。调整弹性灵敏度后,关注节点创建和 Pod 就绪情况;需要排查组件处理异常时,使用“启用组件观测与告警”中的日志和看板。
CA 以节点池首个实例规格作为容量估算基准;同一节点池的后备实例规格应保持 CPU、内存等资源容量以及设备、关键调度属性等价。按实际隔离或资源需求划分节点池,避免为每个微服务单独创建节点池。参与伸缩的节点池、Pending Pod 和调度约束增多时,扫描与模拟耗时可能增加;先检查节点池划分、待调度 Pod 的数量与约束,再按 CA 使用文档调整弹性灵敏度。
仅使用 CA 时,可对不再需要伸缩的节点池关闭弹性伸缩,减少无效模拟;该做法不适用于 Karpenter。大规模突发时,检查待调度 Pod 是否持续减少,以及节点池最大节点数、云资源配额和库存是否满足需求;条件满足但扩容仍无进展时,结合组件日志和伸缩记录联系平台排查。
先配置应用的副本保护和退出行为,再开启自动缩容,并为迁移 Pod 保留合适容量。缩容阈值、触发时延和退出超时按组件使用文档配置,相关入口统一列于“配置与使用文档”。节点持续不能回收时,先检查业务保护和迁移条件;频繁回扩时,再结合业务周期调整缓冲与缩容设置。
以下 PDB 示例适用于标签为app: elastic-web、至少有 3 个健康副本且业务允许同时少 1 个副本的服务。maxUnavailable: 1 为示例值,应按实际可用性要求修改。用于其他工作负载时,先替换命名空间和标签选择器,并核对健康副本数。
PDB 约束通过 Eviction API 发起的驱逐,不能阻止机器故障、云端实例回收或直接删除 Pod,也不替代 Deployment 等工作负载的滚动更新策略。单副本配合minAvailable: 1会阻止该副本的自愿驱逐;应根据业务目标选择增加副本或接受不缩容。详细配置见 Kubernetes Pod 中断与 PDB。 将 Pod 级保护注解写入工作负载的 Pod 模板,可使新建的 Pod 沿用该保护。配置 Karpenter 节点级保护时,只编辑与 Node 同名的现有 NodeClaim;若未找到对应对象,先确认节点是否由 Karpenter 管理。任务完成或迁移条件具备后,从原对象移除临时保护,并确认节点恢复正常回收。
PDB 和 do-not-disrupt 会约束 Karpenter 的自愿缩容,但不能依靠事后追加保护注解撤销已经开始的节点删除。节点进入退出流程后,应按组件使用文档中的退出时限跟踪应用退出;保护注解不能阻止机器故障或云端实例回收。
本地卷需要区分可丢失缓存和持久数据。safe-to-evict 只影响驱逐判断,不会复制或迁移数据;只有已确认可重建的数据才能放行。kube-system 中非 DaemonSet、非 Mirror Pod 的保护也应结合实际 CA 配置检查。多个重叠 PDB 可能同时限制驱逐,应优先使用清晰的副本可用性约束,并检查剩余健康副本。
在大促、发布或迁移窗口需要减少自愿中断时,可提前按支持入口调整自动缩容配置或为必要负载设置临时保护,记录恢复条件和负责人。窗口结束后恢复原配置,并确认回收能力恢复。保护配置应在节点进入退出流程前生效;已经开始的删除和云端实例回收仍需继续跟踪。
通过预留热容量、提前准备高峰资源和使用自定义系统镜像,减少业务等待新节点与容器启动的时间。以 Pod Ready 和业务可服务为判断依据,结合实际容量费用选择方案。
可用低优先级占位 Pod 预留可调度容量:平时通过 requests 预留资源,符合抢占条件的高优先级业务 Pod 到来后可抢占缓冲;占位 Pod 重新等待调度并满足扩容条件时,节点弹性补充容量。应按计划预留的 CPU、内存等资源设置 requests,匹配对应的节点池、可用区和设备需求,并确保占位 Pod 能快速退出。
以下 PriorityClass 示例将缓冲优先级设为 -10。请按业务实际优先级调整该值,确保业务优先级更高,并确认名称未被占用。将该 PriorityClass 用于配套的占位 Deployment;GPU 等资源仍需在占位 Pod 中声明。配置后,检查业务 Pod 能否抢占缓冲,以及占位 Pod 能否触发扩容并恢复到预设规模。
已知活动开始时间时,使用已部署的定时工作负载伸缩能力,提前增加业务或占位 Pod。预留时间应覆盖节点交付、存储与网络初始化、镜像准备和应用启动;活动开始前确认节点及业务 Pod 已就绪,结束后恢复基线。
集中提交大批任务前,核对节点池最大节点数、云资源配额和候选实例规格的可用容量。业务允许时分批提交,关注待调度任务数量的变化;扩容活动失败或新节点长时间未就绪时,结合组件日志和节点池伸缩记录定位原因。
大量 Pod 使用相同大镜像时,可将业务容器镜像提前预置到自定义系统镜像中。新节点完成初始化、网络和存储等依赖就绪后,可复用本地容器镜像启动业务,减少从镜像仓库下载的等待。
镜像制作与适用要求见 操作系统镜像概述。希望优先复用预置镜像时,可按发布要求使用imagePullPolicy: IfNotPresent,并通过明确版本或 digest 管理镜像,避免可变标签命中旧缓存。使用 Always 时仍需访问镜像仓库完成解析与鉴权,已缓存的镜像层可以复用。业务镜像更新后,应同步更新系统镜像中的预置内容,并确认后续新增节点使用了预期的业务镜像。 还可通过精简容器镜像、减少不必要的启动脚本和预拉取镜像,进一步缩短启动准备时间。使用占位 Pod 保留热容量时,仍需分别准备业务镜像、卷和设备环境。
持续关注业务可用容量、等待时间和云端交付结果。按集群、节点池及组件区分数据,避免把其他集群的伸缩事件计入当前业务。
Karpenter 和 Cluster Autoscaler 均提供日志、指标和监控看板,并将预置告警集成在控制面服务告警模板中,可一键开启。请先启用云原生观测,再基于 控制面服务观测 配置组件采集与告警。 优先启用组件异常与伸缩状态相关的预置规则,收到告警后按下表定位。具体阈值、持续时间及规则是否启用,以当前告警配置为准。
除预置告警外,还应按业务目标关注可用副本数、Pod Pending 最长等待时间、Pod Ready 时延和请求错误率。提交排查信息时,提供发生时间、对象名称、伸缩活动编号和已脱敏的错误信息。成本评估应结合实际节点小时和账单,同时考虑 Pod 重新调度、缓存重建和任务重试产生的开销。
节点池创建与编辑、弹性组件安装、参数调整及自动缩容设置,统一参考以下使用文档。功能适用范围、配置项及操作步骤以对应文档为准。
Karpenter 不支持关闭弹性伸缩;关闭自动缩容仅停止自动回收节点,不会停止扩容。节点池弹性伸缩开关仅适用于 CA,不能用于暂停 Karpenter。
合理的节点池规划、准确的资源请求和必要的缩容保护,是节点弹性稳定运行的基础。结合业务负载变化调整容量与缓冲,并通过组件观测和实际账单持续关注可用性、启动时延与资源成本。