阿里云容器服务的自动伸缩能力是通过节点自动伸缩组件实现的,可以按需弹出普通实例、GPU实例、竞价付费实例,支持多可用区、多实例规格、多种伸缩模式,满足不同的节点伸缩场景。

工作原理

节点自动伸缩组件是基于kubernetes资源调度的分配情况进行伸缩判断的,节点中资源的分配是通过资源请求(Request)进行计算的。当Pod由于资源请求(Request)无法满足并进入等待(Pending)状态时,节点自动伸缩组件会根据配置的弹性伸缩组配置信息中的资源规格以及约束配置,计算所需的节点数目,如果可以满足伸缩条件,则会触发伸缩组的节点加入。当一个节点在弹性伸缩组中且节点上Pod的资源请求低于阈值时,节点自动伸缩组件会将节点进行缩容。因此资源请求(Request)的正确、合理设置,是弹性伸缩的前提条件。

注意事项

  • 默认单个用户按量付费实例的配额是30台,单个VPC的路由表限额是50条。如需更大的配额,请提交工单申请。
  • 单一规格的ECS库存容量波动较大,建议在伸缩组中配置多种同规格的实例类型,提高节点伸缩成功率。
  • 极速弹出模式在节点进入停机回收状态时,节点将进行停机,并处在NotReady状态,当再次伸缩弹出时,节点状态会变为Ready
  • 极速弹出模式的节点处在停机回收状态时,只收取磁盘的费用,不收取计算费用(不包含拥有本地盘的机型系列,例如,ecs.d1ne.2xlarge),在库存充裕的前提下可以极速启动。

执行自动伸缩

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏的集群 > 集群,进入集群列表页面。
  3. 选择所需的集群并单击操作列的更多 > 自动伸缩

    自动伸缩

授权

开通ESS服务
  1. 单击弹出对话框中的第一个链接,进入弹性伸缩服务 ESS页面。

    开通ESS服务
  2. 单击开通ESS服务,进入云产品开通页

    云产品开通
  3. 选中我已阅读并同意复选框,单击立即开通

    立即开通
  4. 开通成功后,在开通完成页签,单击管理控制台,进入弹性伸缩服务 ESS页面。

    弹性ESS
  5. 单击前往授权,进入云资源访问授权页面,配置对云资源的访问权限。

    云资源访问授权
  6. 单击同意授权

    同意授权

预期结果

页面自动跳转至弹性伸缩控制台,说明授权成功。关闭页面,继续配置授权角色

授权角色

  1. 单击弹出对话框中的第二个链接,进入RAM角色管理详情页面。
    说明 此处需要以主账号登录控制台。

    RAM角色管理
  2. 权限管理页签,单击目标授权策略名称,进入授权策略详情页面。

    权限管理
  3. 单击修改策略内容,从右侧滑出侧边栏修改策略内容页面。

    修改策略内容
  4. 策略内容Action字段,补充以下策略:
    
    "ess:Describe*", 
    "ess:CreateScalingRule", 
    "ess:ModifyScalingGroup", 
    "ess:RemoveInstances", 
    "ess:ExecuteScalingRule", 
    "ess:ModifyScalingRule", 
    "ess:DeleteScalingRule", 
    "ecs:DescribeInstanceTypes",
    "ess:DetachInstances"
    说明 需要在策略内容的任意一个Action字段的最后一行补充“,”,再添加以上内容。
  5. 单击确认

配置自动伸缩

  1. 自动伸缩页面,填写以下信息,并单击提交
    配置 说明
    集群 目标集群名称。
    缩容阈值 cluster-autoscaler管理的伸缩组中,每一个节点的资源申请值(Request)/ 每一个节点的资源容量。当低于配置的阈值时,节点会进行缩容。
    说明 弹性伸缩中,扩容会基于调度自动触发,只需设置缩容条件即可。
    缩容触发时延 集群满足配置的缩容阈值时,在配置的缩容触发时延到达后,集群开始缩容。单位:分钟。默认情况下是10分钟。
    静默时间 在集群删除节点后,在静默时间内,集群不会再次触发缩容,单位 :分钟。默认情况下是10分钟。
  2. 根据所需要弹性伸缩的资源类型(普通/GPU/抢占式),单击操作列创建

    创建资源类型
  3. 伸缩组配置填写以下信息。
    配置 说明
    地域 所创建伸缩组将要部署到的地域。与伸缩组所在集群的地域一致,不可变更。
    专有网络 所创建伸缩组的网络,与伸缩组所在集群的网络一致。
    虚拟交换机 所创建伸缩组的虚拟交换机,包含伸缩组的可用区及Pod地址段。
  4. 配置 Worker 节点的信息。
    配置 说明
    节点类型 所创建的伸缩组的节点类型,与创建集群时所选择的节点类型一致。
    实例规格 伸缩组内实例的规格。
    已选规格 所选择的伸缩组的实例规格,最多可以选择10种实例规格。
    系统盘 伸缩组的系统盘。
    挂载数据盘 是否在创建伸缩组时挂载数据盘,默认情况下不挂载。
    实例数量 伸缩组所包含的实例数量。
    说明
    • 实例不包含客户已有的实例。
    • 默认情况,实例的最小值是0台,超过0台的时候,集群会默认向伸缩组中添加实例,并将实例加入到伸缩组对应的Kubernetes集群中。
    密钥对 登录伸缩后的节点时所使用的密钥对。可以在ECS控制台新建密钥对。
    说明 目前只支持密钥对方式登录。
    伸缩模式 支持标准模式极速模式
    RDS白名单 弹性伸缩后的节点可以访问的RDS实例。
    节点标签 在集群中添加节点标签(Label)后,会自动添加到弹性伸缩扩容出的节点上。
    污点(Taints) 添加污点后,Kubernetes将不会将Pod调度到这个节点上。
  5. 单击确定,创建伸缩组。

预期结果

  1. 自动伸缩页面,可以在普通实例下看到新创建的一个伸缩组。

    自动伸缩
  2. 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 无状态,进入无状态(Deployment)页面。
  3. 选择目标集群和kube-system命名空间,可以看到名称为cluster-autoscaler的组件,表示伸缩组已创建成功。

    创建伸缩组

常见问题

  • 为什么节点自动伸缩组件无法弹出节点?
    请检查是否存在如下几种场景:
    • 配置伸缩组的实例类型无法满足Pod的资源申请(Request)。默认节点会安装系统组件,Pod的申请资源要小于实例的规格。
    • 是否完整按照步骤执行了授权操作。授权操作是集群维度的,需要每个集群操作一次。
    • 集群是否拥有出网能力。节点自动伸缩组件需要调用阿里云的OpenAPI,因此需要部署节点自动伸缩组件的节点具备出网能力。
  • 为什么节点自动伸缩组件无法缩容节点?
    请检查是否存在如下几种场景:
    • 所有的节点Pod的资源申请(Request)阈值高于设置的缩容阈值。
    • 节点上运行kube-systemundefined命名空间的Pod。
    • 节点上的Pod包含强制的调度策略,导致其他节点无法运行此Pod。
    • 节点上Pod的拥有PodDisruptionBudget,且到达了PodDisruptionBudget的最小值。

    您可以在开源社区得到更多关于节点自动伸缩组件的常见问题与解答。