全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:节点即时弹性FAQ

更新时间:Nov 12, 2024

本文介绍使用节点即时弹性功能时可能遇到的常见问题及解决方案。

索引

分类

二级分类

跳转链接

节点即时弹性的扩缩容行为

扩容行为相关

缩容行为相关

自定义的扩缩容行为

通过Pod控制扩缩容行为

如何通过Pod控制节点即时弹性的节点缩容?

通过节点控制扩缩容行为

节点即时弹性组件相关

扩容行为相关

节点即时弹性可模拟判断的资源有哪些?

已支持根据以下资源进行扩缩容行为的模拟和判断。

cpu
memory
ephemeral-storage 
aliyun.com/gpu-mem # 仅支持共享GPU
nvidia.com/gpu

节点即时弹性是否支持根据Pod Request资源在节点池中扩容合适资源的实例规格?

已支持。例如,您为开启弹性伸缩的节点池配置了4 Core 8 GB和12 Core 48 GB的两种实例规格,Pod Request资源为2 Core,当节点即时弹性执行扩容操作时,会优先将Pod调度到4 Core 8 GB的节点上。如果后续4 Core 8 GB升配为8 Core 16 GB,节点即时弹性会自动让Pod运行在8 Core 16 GB的节点上。

节点池配了多个实例规格,节点即时弹性默认如何选择?

根据节点池配置的实例规格,节点即时弹性会定期排除库存不足的实例规格,然后根据实例规格的CPU核数进行排序,逐个检查是否满足不可调度的Pod申请的Request资源。一旦有实例规格能够满足,节点即时弹性会优先选择这个实例规格,不再检查剩余的规格。

使用节点即时弹性时,如何实时感知节点池中的实例规格库存变化?

节点即时弹性提供了健康度指标,会定期更新开启自动伸缩节点池中的实例规格的库存变化。当实例规格的库存状态发生变化时,节点即时弹性会发送名称为InstanceInventoryStatusChanged的Kubernetes Event。您可以订阅此Event通知,查看节点池库存健康度,评估当前节点池库存是否健康,并提前对实例规格配置进行分析和调整。详细信息,请参见查看节点即时弹性健康度

如何优化节点池配置,尽量避免库存不足而导致扩容失败?

建议参见以下配置建议,扩大实例规格可选范围:

  • 为节点池配置可选的多实例规格,或者配置泛化配置。

  • 为节点池配置多个可用区。

为什么节点即时弹性无法弹出节点?

请检查是否存在如下场景。

  • 配置节点池的实例规格库存不足。

  • 节点池配置的实例规格无法满足Pod的资源申请(Request)。ECS实例规格的资源大小是实例的售卖规格,实际运行时需考虑以下资源预留。

  • 是否参见启用节点即时弹性完成了授权操作。

  • 开启自动伸缩的节点池中扩容实例失败。

为保证后续扩缩准确性和系统的稳定性,节点即时弹性组件在异常节点处理完成前,不会执行扩缩容操作。

缩容行为相关

为什么节点即时弹性无法缩容节点?

请检查是否存在如下几种场景。

  • 是否已开启仅缩容空节点,而排查的节点为非空节点。

  • 节点Pod的资源申请(Request)阈值高于设置的缩容阈值。

  • 节点上运行着kube-system命名空间的Pod。

  • 节点上的Pod包含强制的调度策略,导致其他节点无法运行此Pod。

  • 节点上的Pod拥有PodDisruptionBudget,且到达了PodDisruptionBudget的最小值。

  • 如有新增节点,节点即时弹性在10分钟内,不会对该节点进行缩容操作。

什么类型的Pod可以阻止节点即时弹性移除节点?

当Pod不是由原生Kubernetes Controller创建的Pod(例如非Deployment、ReplicaSet、Job、StatefulSet等对象创建的Pod),或者当节点上的Pod不能被安全地终止或迁移时,节点即时弹性组件可能会阻止移除这个节点。

通过Pod控制扩缩容行为

如何通过Pod控制节点即时弹性的节点缩容?

您可以通过Pod Annotationgoatscaler.io/safe-to-evict指定在节点即时弹性的缩容过程中,Pod是否会阻止节点被缩容。

  • 阻止节点被缩容:为Pod添加Annotation "goatscaler.io/safe-to-evict": "false"

  • 不阻止节点被缩容:为Pod添加Annotation "goatscaler.io/safe-to-evict": "true"

通过节点控制扩缩容行为

节点即时弹性在缩容过程中如何指定需要删除的节点?

您可以为待移除节点添加goatscaler.io/force-to-delete:true:NoSchedule污点。添加后,节点即时弹性会直接执行删除操作,不会检查Pod状态和对Pod排水。这可能会导致服务中断或数据丢失,请谨慎使用。

如何指定节点不被节点即时弹性缩容?

您可以为目标节点配置节点Annotation "goatscaler.io/scale-down-disabled": "true",使其不被节点即时弹性组件缩容。添加Annotation的命令示例如下。

kubectl annotate node <nodename> goatscaler.io/scale-down-disabled=true

节点即时弹性能否仅缩容空节点?

您可以在节点维度或集群维度配置是否需要仅缩容空节点。如果您同时在节点维度和集群维度完成了配置,节点维度优先级更高。

  • 节点维度:为节点添加Label goatscaler.io/scale-down-only-empty:truegoatscaler.io/scale-down-only-empty:false,分别用于开启或关闭仅缩容空节点。

  • 集群维度:在容器服务管理控制台组件管理页面,定位节点即时弹性组件,按照页面提示配置ScaleDownOnlyEmptyNodes,取值为true或false,分别用于开启或关闭仅缩容空节点。

节点即时弹性组件相关

是否有操作会触发节点即时弹性组件的自动更新?

不会。除系统维护、升级外,ACK不会进行节点即时弹性组件的自动更新。请在容器服务管理控制台组件管理页面手动升级。

ACK托管集群已经完成了角色授权,但节点伸缩活动仍然无法正常运行?

可能是集群kube-system命名空间下保密字典内不存在addon.aliyuncsmanagedautoscalerrole.token而导致的。如不存在,请选择以下一种方式解决。

  • 提交工单申请技术支持。

  • 手动添加AliyunCSManagedAutoScalerRolePolicy权限:ACK默认通过WorkRole实现相关能力,您可以请参见下方流程为集群WorkerRole添加AliyunCSManagedAutoScalerRolePolicy的权限。

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

    3. 节点池页面,单击节点伸缩后方的去配置

      1.jpg

    4. 按照页面提示,完成KubernetesWorkerRole角色授权和AliyunCSManagedAutoScalerRolePolicy系统策略的授权,入口如下所示。

      image

    5. 手动重启kube-system命名空间下的Deployment cluster-autoscaler(节点自动伸缩)或ack-goatscaler(节点即时弹性),以便权限立即生效。