本文介绍使用节点即时弹性功能时可能遇到的常见问题及解决方案。
索引
分类 | 二级分类 | 跳转链接 |
节点即时弹性的扩缩容行为 | ||
自定义的扩缩容行为 | ||
扩容行为相关
节点即时弹性可模拟判断的资源有哪些?
已支持根据以下资源进行扩缩容行为的模拟和判断。
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实例规格的资源大小是实例的售卖规格,实际运行时需考虑以下资源预留。
实例的创建过程中会因虚拟化、操作系统等占用部分资源。更多信息,请参见购买实例后查看内存大小,为什么和购买时的实例规格定义不一致?。
ACK需要占用一定的节点资源来运行kube组件和system进程(例如kubelet、kube-proxy、Terway、Container Runtime等)。详细说明及预留策略,请参见节点资源预留策略。
默认节点会安装系统组件,Pod的申请资源要小于实例的规格。
是否参见启用节点即时弹性完成了授权操作。
开启自动伸缩的节点池中扩容实例失败。
为保证后续扩缩准确性和系统的稳定性,节点即时弹性组件在异常节点处理完成前,不会执行扩缩容操作。
缩容行为相关
为什么节点即时弹性无法缩容节点?
请检查是否存在如下几种场景。
是否已开启仅缩容空节点,而排查的节点为非空节点。
节点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:true
或goatscaler.io/scale-down-only-empty:false
,分别用于开启或关闭仅缩容空节点。集群维度:在容器服务管理控制台的组件管理页面,定位节点即时弹性组件,按照页面提示配置ScaleDownOnlyEmptyNodes,取值为true或false,分别用于开启或关闭仅缩容空节点。
节点即时弹性组件相关
是否有操作会触发节点即时弹性组件的自动更新?
不会。除系统维护、升级外,ACK不会进行节点即时弹性组件的自动更新。请在容器服务管理控制台的组件管理页面手动升级。
ACK托管集群已经完成了角色授权,但节点伸缩活动仍然无法正常运行?
可能是集群kube-system命名空间下保密字典内不存在addon.aliyuncsmanagedautoscalerrole.token
而导致的。如不存在,请选择以下一种方式解决。
提交工单申请技术支持。
手动添加AliyunCSManagedAutoScalerRolePolicy权限:ACK默认通过WorkRole实现相关能力,您可以请参见下方流程为集群WorkerRole添加AliyunCSManagedAutoScalerRolePolicy的权限。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池页面,单击节点伸缩后方的去配置。
按照页面提示,完成KubernetesWorkerRole角色授权和AliyunCSManagedAutoScalerRolePolicy系统策略的授权,入口如下所示。
手动重启kube-system命名空间下的Deployment cluster-autoscaler(节点自动伸缩)或ack-goatscaler(节点即时弹性),以便权限立即生效。