容器服务ACK通过调整节点池的期望节点数实现节点池扩缩容,将节点数目维持在期望数量。扩容节点池保证节点数量足够支撑业务运行,缩容节省成本。扩缩容节点池均可自动化执行,提升了运维效率。本文介绍如何扩缩容节点池。

前提条件

节点池扩缩容概述

期望节点数是指节点池应该维持的节点数量,代表节点池终态的节点数。指定节点池的期望节点数后,节点池将会根据当前节点池内节点数自动触发扩容或缩容,将节点数目维持在期望数量,无需人工干预。

  • 扩容节点池:设定期望节点数大于当前节点池的节点数时,系统将触发节点池扩容。推荐您通过增大期望节点数的方式扩容节点池。在出现弹出节点失败的情况下,系统也会自动进行重试,直至节点池现有节点数满足期望节点数。
    说明 弹出节点的配置将取决于节点池的配置,具体弹出的实例规格和可用区与节点池扩缩容策略相关。关于扩缩容策略,请参见扩缩容策略
    节点池扩容包含两个步骤:
    1. 弹出ECS实例:ACK节点池底层依赖ESS(弹性伸缩服务)弹出节点。调整期望节点数后,ACK会修改ESS伸缩组期望实例数执行扩容,节点池将显示为扩容中。ESS成功弹出ECS实例后,节点池将显示为已激活。关于期望实例数的更多信息,请参见期望实例数
      重要 神龙裸金属GPU实例(ecs规格族为ebmgn7、ebmgn7e)不支持自动MIG清理,因此ACK添加该类型节点时会对已有的MIG设置进行重置。由于重置时间不定,可能会出现重置时间过长导致自动添加节点失败。
    2. 将ECS实例添加到集群:ESS弹出ECS实例后,实例将自动运行cloud-init脚本(由ACK维护),对节点进行初始化,并将节点加入到节点池。运行的日志将保存到节点/var/log/messages文件中,可登录节点执行grep cloud-init /var/log/messages查看执行日志。
      说明
      • 如果节点成功加入到节点池,将会自动清除/var/log/messages中的日志信息,因此日志仅作为节点添加到集群失败的参考信息。
      • 如果添加节点到集群失败,/var/log/messages中的日志信息也将被截取关键信息到Task结果中。您可以单击目标集群,在集群任务页签查看原因。
  • 缩容节点:设定期望节点数小于当前节点池的节点数,系统将触发节点池的缩容并移除节点。
    说明
    • 缩容节点时:
      • 如果节点池扩缩容策略选择优先级策略,会选择最新创建的实例进行缩容。
      • 如果节点池扩缩容策略选择均衡分布策略,按照均衡发布策略筛选ECS实例的可用区。再选择最新创建的实例进行缩容,使移出ECS实例后伸缩组各可用区的ECS实例数量大致相当。
      • 如果节点池扩缩容策略选择成本优化策略,缩容时按vCPU单价从高到低尝试移出ECS实例。
      如果您希望指定节点移除,请参见移除节点
    • 通过期望节点数缩容节点,即使节点排水失败,节点仍会被移除。若您对节点排水有强需求,请使用指定节点移除。具体操作,请参见移除节点

操作步骤

  1. 登录容器服务管理控制台,在左侧导航栏选择集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池
  3. 在目标节点池右侧的操作列中,单击扩缩容
  4. 创建AliyunOOSLifecycleHook4CSRole角色,为OOS运维编排服务授权。
    1. 单击AliyunOOSLifecycleHook4CSRole
      说明
      • 如果当前账号是阿里云账号,单击AliyunOOSLifecycleHook4CSRole即可授权。
      • 如果当前账号是RAM用户,请先确保对应的阿里云账号已授权AliyunOOSLifecycleHook4CSRole, 并为RAM用户授予AliyunRAMReadOnlyAccess系统策略。具体操作,请参见为RAM用户授权
    2. 云资源访问授权页面,单击同意授权
  5. 填写期望节点数,单击确认
    • 在节点池列表的状态列,若显示扩容中,表明节点池正在扩容中。若显示已激活,表明扩容已完成。
    • 在节点池列表的状态列,若显示移除节点中,表明节点池正在缩容中。若显示已激活,表明缩容已完成。

非标操作及处理建议

期望节点数为节点池应该维持的节点数量。一些非标操作可能会导致节点池未按照预期扩容,造成资产损失。常见的非标操作及对应建议如下。
重要 不推荐您进行任何非标操作。
非标操作节点池行为建议
直接通过kubectl delete node方式移除节点。

期望节点数仅感知ESS伸缩组内ECS实例数量,不感知集群内Node数量。

通过API Server移除节点,由于ECS没有被释放,因此节点池节点数不会有任何变化。但由于节点已经移出了集群,所以节点池节点列表中的节点状态会显示为未知

  • 如果您已执行了该操作,您可以在节点池页面单击节点池名称,在节点管理页签通过移除节点,将该节点从节点池中释放。
    说明 因为节点已经移出了集群,所以不需要选择自动排空节点(drain)。请您按需选择是否同时释放ECS
  • 以下节点不会被释放,移除节点后,请登录ECS控制台手动处理。
    • 手动添加到集群的节点。
    • 包年包月的节点。
通过ECS控制台或者OpenAPI释放ECS。节点池会感知到ECS的释放,并自动弹出新ECS实例,补充到期望节点数数量。
  • ACK会通过期望节点数检测到节点的释放并补充新的实例,造成资产损失。请优先通过ACK控制台移除节点。具体操作,请参见移除节点
  • 以下节点不会被释放,移除节点后,请登录ECS控制台手动处理。
    • 手动添加到集群的节点。
    • 包年包月的节点。
通过ESS将ECS实例移除伸缩组并且不修改期望实例数。节点池会感知到ECS的释放,并自动弹出新ECS实例,补充到期望节点数数量。

请勿直接操作节点池相关的伸缩组,以免造成节点池行为异常。

包年包月ECS实例到期释放。节点池会感知到ECS的释放,并自动弹出新ECS实例,补充到期望节点数数量。
ACK会通过期望节点数检测到节点的释放并补充新的实例,造成资产损失。请及时处理即将到期的ECS实例,您可以移除节点,或对包年包月ECS实例进行续费。
通过弹性伸缩控制台或OpenAPI手动开启ESS伸缩组实例的健康检查。ESS伸缩组开启健康检查后,每当检测到存在不健康实例(如停机)时,会自动弹出新的ECS实例。

ACK默认不开启ESS健康检查,仅在节点被释放时才会补充新的ECS实例。请勿直接操作节点池的ESS伸缩组,可能会造成节点池行为异常。

扩缩容失败错误码及解决方法

在扩缩容节点池过程中,可能会由于库存等原因造成扩缩容失败。您可以在集群列表页面单击目标集群名称,在集群任务页签查看集群任务列表,单击查看原因查看节点池扩容失败原因。

常见的扩容失败错误码如下。
错误码问题原因解决方法
RecommendEmpty.InstanceTypeNoStock当前可用区下ECS实例库存不足。请尝试节点池编辑功能为节点池增加不同可用区交换机(vSwitch)以及配置多种实例规格,提高节点创建成功率。
说明 在节点池页面单击目标节点池名称,在基本信息页签的伸缩组后面会提示弹性强度。您可以通过弹性强度查看您节点池的扩容成功概率。
NodepoolScaleFailed.FailedJoinCluster节点添加到K8s集群失败。您可以登录节点执行grep cloud-init /var/log/messages查看执行日志并获取错误信息。
InvalidAccountStatus.NotEnoughBalance您的账户余额不足。请先充值再进行操作。详细信息,请参见充值操作指引
InvalidParameter.NotMatch

错误信息Image bootMode BIOS does not match instanceType bootMode表示指定的实例规格不支持指定的系统镜像启动模式。

请修改实例规格。
  • 节点池的操作系统、镜像ID等可通过单击目标节点池所在行的详情,在基本信息页签查看。
  • 系统镜像所支持的实例规格可以通过OpenAPI查询。
  • 关于ACK支持的镜像,请参见操作系统镜像概述
QuotaExceed.ElasticQuota在当前地域选择的实例规格创建的ECS数量超出配额上限。您可以进行如下操作。
  • 选择其他实例规格。
  • 减少当前ECS数量。
  • 前往配额中心申请提高配额上限。
InvalidResourceType.NotSupported 您指定的ECS实例类型在当前可用区下不支持使用或者无库存。您可以通过查询实例规格查询该可用区下的实例规格是否存在,并修改节点池的实例规格。
InvalidImage.NotSupported

错误信息The specified image does not support vSGX instance.表示节点池的系统镜像不支持安全增强型实例。

请修改实例规格。
  • 节点池的操作系统、镜像ID等可通过单击目标节点池所在行的详情,在基本信息页签查看。
  • 系统镜像所支持的实例规格可以通过OpenAPI查询。
  • 关于安全增强型实例支持的系统镜像,请参见在控制台创建安全增强型实例
InvalidParameter.NotMatch

错误信息The specified instanceType only support vTPM image.表示指定的系统镜像不支持安全增强型实例。

请修改实例规格。
  • 节点池的操作系统、镜像ID等可通过单击目标节点池所在行的详情,在基本信息页签查看。
  • 系统镜像所支持的实例规格可以通过OpenAPI查询。
  • 关于安全增强型实例支持的系统镜像,请参见在控制台创建安全增强型实例
QuotaExceeded.PrivateIpAddress交换机下可用的私有IP地址数量不足。您可以尝试为节点池配置更多可用交换机后重试。
InvalidParameter.KmsNotEnabled您指定的KMS密钥为非启用状态。请登录密钥管理服务控制台检查密钥状态。关于启用密钥,请参见管理密钥
InvalidInstanceType.NotSupported

错误信息The specified instanceType is not supported by the image architecture.表示当前实例规格不支持指定的系统镜像类型。

请修改实例规格。
  • 节点池的操作系统、镜像ID等可通过单击目标节点池所在行的详情,在基本信息页签查看。
  • 系统镜像所支持的实例规格可以通过OpenAPI查询。
  • 关于ACK支持的镜像,请参见操作系统镜像概述
InsufficientBalance.CreditPay您的账户余额不足。请先充值再进行操作。详细信息,请参见充值操作指引
ApiServer.InternalError

错误信息an error on the server (\"Get \\\"https://192.168.xxx.xxx:xxx/api/v1/nodes\\\": dial tcp 192.168.xxx.xxx:xxx: connect: connection refused\") has prevented the request from succeeding表示访问Kubernetes集群的API Server失败。

请检查集群API Server是否可用或者可访问。详细信息,请参见控制台访问集群异常问题排查
RecommendEmpty.InstanceTypeNotAuthorized您指定的实例规格需要授权后使用。请向云服务器ECS提交工单申请授权。
Account.Arrearage您的账户余额不足。请先充值再进行操作。详细信息,请参见充值操作指引
Err.QueryEndpoints访问Kubernetes集群的API Server失败。请检查您的集群API Server是否可用或者可访问。详细信息,请参见控制台访问集群异常问题排查
RecommendEmpty.DiskTypeNoStock指定可用区下磁盘库存不足。您可以尝试增加节点池的可用区(vSwitch),或者更换磁盘类型后重试。
InvalidParameter.KMSKeyId.KMSUnauthorized没有授权无法访问密钥管理服务KMS。请登录ECS管理控制台为ECS配置访问KMS服务角色AliyunECSDiskEncryptDefaultRole授权。详细信息,请参见AliyunECSDiskEncryptDefaultRole
InvalidParameter.Conflict

错误信息The specified disk category (xxxx) is not support the specified instance type.表示指定的实例规格不支持指定的云盘类型。

您可以尝试更换实例规格或者磁盘类型后重试。
NotSupportSnapshotEncrypted.DiskCategory系统盘加密仅支持ESSD类型云盘。请更换云盘类型。关于云盘类型与加密,请参见创建节点池
InvalidOperation.VpcHasEnabledAdvancedNetworkFeature您指定的VPC开启了高级功能,不能创建低规格的ECS。关于VPC支持的实例规格,请参见VPC高级功能
ScalingActivityInProgress当前节点池正在伸缩中,请稍后再操作。为了避免伸缩活动冲突,请勿直接通过ESS进行节点扩缩容。
Instance.StartInstanceFailedECS实例启动失败。请稍后尝试重新操作。排查具体原因,请向云服务器ECS提交工单
OperationDenied.NoStock您选择的ECS实例规格在指定的可用区内库存不足。您可以选择其他实例规格后重试。

弹性强度会根据实时库存量化您节点池的扩容成功概率。详细信息,请参见查看节点池弹性强度

RecommendEmpty.InstanceTypeNoStock您选择的ECS实例规格在指定的可用区内库存不足。您可以选择其他实例规格后重试。

弹性强度会根据实时库存量化您节点池的扩容成功概率。详细信息,请参见查看节点池弹性强度

NodepoolScaleFailed.WaitForDesiredSizeTimeout扩容任务超时。按照如下操作查看扩容详情。
  1. 登录容器服务管理控制台,在左侧导航栏单击集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池
  3. 单击目标节点池名称,然后在伸缩活动页签中查看扩容详情。
ApiServer.TooManyRequests扩容任务被APIServer限流。扩容任务被API Server限流,请减少API Server请求,或稍后重试。
NodepoolScaleFailed.PartialSuccess由于库存原因,部分节点扩容成功。您可以选择其他实例规格后重试。

弹性强度会根据实时库存量化您节点池的扩容成功概率。详细信息,请参见查看节点池弹性强度

相关文档