容器柔性变配

本文介绍ACS Pod的柔性变配,以及使用柔性变配降低资源使用成本和加速应用启动的实践。

背景介绍

一般而言,Serverless Pod在生产阶段即会以确定性的资源进行装箱,在整个生命周期阶段其可用的CPU和内存资源上限都是确定的。在面对复杂的生产环境场景时,服务在不同的阶段对算力资源的消耗可能是动态波动的,初期对Pod的容量规划时可能面临一些挑战,如部分应用启动期间消耗大量CPU资源,长时间维持在较低水位;比如部分有状态或游戏业务,在维持状态或维持Session链接的情况下满足业务上的波峰波谷。

面对这种场景,Serverless Pod一方面需要具有更细粒度、更灵活的规格声明,以贴合业务的真实资源使用,另一方面如果具备动态变更规格,在业务需要时进行按需扩缩容,将可以极大地降低容量规划的难度和产生更贴合真实资源使用的成本支出。

ACS Pod的柔性变配可以提供一种以10秒级的低延迟完成容器的CPU资源热变更的产品能力,结合ACS中提供的AVPA组件(acs-advanced-vertical-pod-autoscaler),提供多种自动变配的能力满足业务的规格变化场景。

说明
  • 当前柔性变配在邀测阶段,您可以提交工单申请进行试用。

  • 当前ACS产品支持对ComputeClass=general-purposeComputeQoS=default的ACS Pod CPU资源的柔性变配,最大支持原始规格的100%扩容,最小支持原始规格的50%缩容。如一个4vCpu8Gi的ACS Pod扩缩容范围是2vCpu8Gi8vCpu8Gi

适用场景

图片 1

柔性变配目前支持变配过程不发生容器重启,对于算力使用有一定波峰波谷的情况,都可以使用此特性来满足,比如应用启动加速、有状态应用原地变配、应用的局部算力热点等。

具体适用场景说明:

  • 对于启动期间需要进行一些编译或预加载,使用较多算力资源,常态运行资源回落至平稳状态,可以通过启动期间分配更多CPU资源,在启动完成后降配至较低资源长稳运行。

  • 有状态应用,如Redis在负载增加时可以通过柔性变配进行纵向扩容。

  • 在线应用如存在部分大请求或长连接Session导致的局部热点压力可以通过柔性变配进行纵向扩容。

前提条件

单Pod手动规格变配操作示例

步骤一:开启原地变配的特性门控

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择运维管理组件管理

  3. 核心组件区域选择Kube API Server > 配置。在featureGates配置项中填入InPlacePodVerticalScaling=true,开启原地变配的特性门控。

    image

    说明

    配置过程中Kube API Server卡片会显示状态为操作执行中,当状态重新为已安装时,说明原地变配的特性门控开启成功。

步骤二:对ACS Pod进行规格变配

  1. 集群页面,单击目标集群ID,然后在左侧导航栏,选择工作负载 > 无状态

  2. 单击使用YAML创建资源,使用下面的样例YAML进行创建。YAML中的scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'表示为当前Pod启用柔性变配。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: demo
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          annotations:
            scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'  # 声明开启柔性变配
          labels:
            alibabacloud.com/compute-class: general-purpose
            alibabacloud.com/compute-qos: default
            app: demo
        spec:
          containers:
            - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1'
              imagePullPolicy: IfNotPresent
              name: spring
              ports:
                - containerPort: 8080
                  protocol: TCP
              resources:
                limits:
                  cpu: 1
                  memory: 4Gi
                requests:
                  cpu: 1
                  memory: 4Gi

    Pod Annotations配置项

    配置项描述

    Value

    scaling.alibabacloud.com/enable-inplace-resource-resize

    在创建Pod时指定,描述当前ACS Pod启用柔性变配。

    true

  3. 创建完成后在容器组页面点击编辑,手动把容器CPU资源从1修改为2,然后点击更新

    image.png

  4. 通过柔性变配能力,当前Pod不发生Pod重启,规格就变更为2vCpu4Gi

    image

使用自动柔性变配加速应用启动示例

以一个典型Java应用为例,在应用启动阶段会在类加载、字节码编译等动作上消耗大量资源,而进入稳态后这部分资源将被释放出来。因此从应用快速启动,并且在常态运行降低成本的角度考虑,我们需要有一种方式能让Serverless Pod在启动阶段使用更多资源,而服务启动完成后将资源进行降配。

ACS提供启动加速的功能,您可以通过配置描述将一个ACS Pod以声明规格的一定倍数进行启动,在启动完成后自动降配至原始规格。

步骤一:开启原地变配的特性门控

  1. 请参见步骤一:开启原地变配的特性门控

步骤二:安装acs-advanced-vertical-pod-autoscaler组件

  1. 在左侧导航栏,选择应用> Helm,搜索并安装acs-advanced-vertical-pod-autoscaler组件。具体操作,请参见使用Helm管理ACS应用

    image.png

步骤三:使用柔性变配加速应用启动

  1. 通过YAML创建一个Java的工作负载,并开启启动加速特性。YAML中除了scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'之外,还需要通过alibabacloud.com/startup-cpu-burst-factoralibabacloud.com/startup-cpu-burst-duration-seconds注解来配置启动扩容倍数和自动降配时间。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-with-burst
      name: spring-with-burst
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-with-burst
      template:
        metadata:
          annotations:
            alibabacloud.com/startup-cpu-burst-factor: '2' #设置启动扩容倍数为2, 即初始2C会以4C启动,容器Ready状态后缩容会初始状态
            alibabacloud.com/startup-cpu-burst-duration-seconds: "30" #不填则默认在Pod Ready后30秒自动降配
            scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # 声明开启柔性变配 
          labels:
            alibabacloud.com/compute-class: general-purpose
            alibabacloud.com/compute-qos: default
            app: spring-with-burst
        spec:
          containers:
            - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1'
              imagePullPolicy: IfNotPresent
              name: spring
              ports:
                - containerPort: 8080
                  protocol: TCP
              resources:
                limits:
                  cpu: 1
                  memory: 4Gi
                requests:
                  cpu: 1
                  memory: 4Gi

    Pod Annotations配置项

    配置项描述

    Value

    scaling.alibabacloud.com/enable-inplace-resource-resize

    在创建Pod时指定,描述当前ACS Pod启用柔性变配。

    支持取值:true。

    alibabacloud.com/startup-cpu-burst-factor

    在创建Pod时指定,描述当前ACS Pod以原始规格的倍数进行启动。

    支持取值:2。

    说明

    例如原始规格为2vCpu,则启动时以4vCpu进行启动。

    alibabacloud.com/startup-cpu-burst-duration-seconds

    在创建Pod时指定,描述当前ACS Pod在启动完成一定秒数后进行降配。

    支持取值:大于等于30。

    说明

    默认值为30秒,当Pod进入Ready状态30秒后进行降配。

步骤四:观察Pod的创建和服务启动过程

创建完成后,进入应用详情,此时可以看到Pod以2vCpu4Gi的规格进行创建。在启动完成并达到预设的延迟等待时间后,Pod规格会自动降配至1vCpu4Gi

  1. 查看Pod事件。

    事件页面中选择Pod,会透出具体的降配信息。在本示例中为Starting to resize resource down for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Gi

    image

  2. 查看Pod监控。

    通过监控页面可以看到CPU Info信息中,CPU存在一个变化的过程。

    image