文档

扩缩容节点池

更新时间:

容器服务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. (可选)如果您之前没有为OOS运维编排服务授权,则需要进行此步骤。通过创建AliyunOOSLifecycleHook4CSRole角色,为OOS运维编排服务授权。

    1. 单击AliyunOOSLifecycleHook4CSRole

      说明
      • 如果当前账号是阿里云账号,单击AliyunOOSLifecycleHook4CSRole即可授权。

      • 如果当前账号是RAM用户,请先确保对应的阿里云账号已授权AliyunOOSLifecycleHook4CSRole,并为RAM用户授予AliyunRAMReadOnlyAccess系统策略。具体操作,请参见为RAM用户授权

    2. 云资源访问授权页面,单击同意授权

  5. 填写期望节点数,单击确认。在弹出的对话框中,单击确定

    • 在节点池列表的状态列,若显示扩容中,表明节点池正在扩容中。若显示已激活,表明扩容已完成。

      说明

      集群扩容节点时,如果安全组拒绝访问100.64.0.0/10,会导致节点无法正常加入到集群。

    • 在节点池列表的状态列,若显示移除节点中,表明节点池正在缩容中。若显示已激活,表明缩容已完成。

非标操作及处理建议

期望节点数为节点池应该维持的节点数量。一些非标操作可能会导致节点池未按照预期扩容,造成资产损失。常见的非标操作及对应建议如下。

重要

不推荐您进行任何非标操作。

非标操作

节点池行为

建议

直接通过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.StartInstanceFailed

ECS实例启动失败。

请稍后尝试重新操作。排查具体原因,请向云服务器ECS提交工单

OperationDenied.NoStock

您选择的ECS实例规格在指定的可用区内库存不足。

您可以选择其他实例规格后重试。

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

RecommendEmpty.InstanceTypeNoStock

您选择的ECS实例规格在指定的可用区内库存不足。

您可以选择其他实例规格后重试。

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

NodepoolScaleFailed.WaitForDesiredSizeTimeout

扩容任务超时。

按照如下操作查看扩容详情。

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

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

  3. 单击目标节点池名称,然后在伸缩活动页签中查看扩容详情。

ApiServer.TooManyRequests

扩容任务被APIServer限流。

扩容任务被API Server限流,请减少API Server请求,或稍后重试。

NodepoolScaleFailed.PartialSuccess

由于库存原因,部分节点扩容成功。

您可以选择其他实例规格后重试。

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

相关文档