容器柔性变配

更新时间:2025-04-07 06:53:27

在生产环境中,一般而言,Serverless Pod的资源配置是固定的,而在应对不同场景时对资源的消耗又可能是动态的。对此,容器计算服务 ACS(Container Compute Service) 提供了柔性变配能力,以满足业务的规格变化场景。本文介绍ACS Pod的柔性变配,以及使用柔性变配降低资源使用成本和加速应用启动的实践。

背景介绍

在面对复杂的生产环境场景时,服务在不同的阶段对算力资源的消耗可能是动态波动的,初期对Pod的容量规划时可能面临一些挑战,如部分应用启动期间消耗大量CPU资源,应用启动后资源消耗又长时间维持在较低水位;而例如有状态或游戏业务,则需要在维持状态或维持Session连接的情况下同时满足业务上的波峰波谷。

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

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

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

  • 当前ACS产品支持对ComputeClass=general-purposeComputeQoS=defaultACS Pod CPU资源的柔性变配:

    • 最大支持原始规格的100%扩容,最小支持原始规格的50%缩容。例如,一个4vCpu8GiACS Pod扩缩容范围是2vCpu8Gi8vCpu8Gi

    • 资源变配当前存在最大16Core的上限。

适用场景

图片 1

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

具体适用场景说明:

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

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

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

说明

柔性变配后,应用Pod将按照变配后的规格进行计费。变配过程中或变配失败时仍然按照变配前的规格进行计费。

前提条件

Pod手动规格变配操作示例

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

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

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

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

    image

    说明

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

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

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

  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

    Pod Annotations配置项

    配置项描述

    Value

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

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

    true

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

    image.png

  4. 可以看到,启用柔性变配能力后,当前Pod可以不重启直接变更规格。

    说明

    柔性变配功能同样会受到ACS资源规整的约束。如果变配后的配置规格超出了所支持的范围,会被自动规整至最接近的规格。

    image

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

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

ACS提供了Java应用启动加速的功能,您可以通过配置描述将一个ACS Pod以声明规格的一定倍数进行启动,在启动完成后自动降配至原始规格。关于JVM参数详细配置,请参见Java应用启动加速的JVM参数配置

使用限制

  • 启动加速功能: 启动加速功能依赖PodReady状态来控制降配。若未配置就绪探针,容器一旦启动,即被认定为成功,并立即触发自动降配倒计时。建议在启用启动加速功能的Pod上配置就绪探针。

  • 容器重启场景: 在期望容器重启时自动进行启动加速的场景中,若未配置就绪探针,可能会导致无法自动升配。

  • 资源配置要求: 启动加速功能依赖Pod的原始资源来计算升配资源。因此,必须配置原始RequestsLimits值,否则可能无法应用启动加速功能。

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

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

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

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

    image

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

  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
              readinessProbe:
                tcpSocket:
                  port: 8080
                initialDelaySeconds: 20
                periodSeconds: 10

    Pod Annotations配置项

    配置项描述

    Value

    Pod Annotations配置项

    配置项描述

    Value

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

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

    支持取值:true。

    alibabacloud.com/startup-cpu-burst-factor

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

    支持取值:2。

    说明

    目前柔性变配只支持将Pod规格变配至原本的2倍。例如原始规格为2vCpu,则启动时以4vCpu进行启动。

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

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

    支持取值:大于等于30。

    说明

    默认值为30秒,当Pod进入Ready状态30秒后进行降配。若Pod一直不Ready,Pod会一直保持在升配状态。

    alibabacloud.com/startup-cpu-burst-disable-restart

    可选,在创建Pod时指定,配置当前ACS Pod在容器重启时禁止升配。

    支持取值:true。

    说明

    不配置该配置项表示启用容器重启时自动升配。

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

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

  1. 查看Pod事件。

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

    image

说明

除了通过查看事件来观察变配过程外,您还可以通过检查Podstatus.resize字段是否非空来判断是否处于变配过程中。

  1. 查看Pod监控。

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

    image

步骤五:观察Pod容器重启后服务启动过程

自组件的0.0.2版本起,已支持Pod重启后默认开启变配。您可以通过在注解中配置alibabacloud.com/startup-cpu-burst-disable-restart来显式禁用该功能。

我们采用向容器中的1号进程发送kill信号的方式,来模拟容器发生崩溃的情况,进而观察容器在重启过程中是否能够自动加速。在执行命令时,需将其中的{POD_NAME}替换为实际生成的实例名。

kubectl exec -it {POD_NAME} -- kill 1

当容器重启时,可以看到Pod将会变配到2vCpu4G,并在新容器启动完成并达到预设的延迟等待时间后,Pod规格会自动降配至1vCpu4Gi

  1. 查看Pod事件。

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

    image

  2. 查看Pod监控。

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

    image

  • 本页导读 (0)
  • 背景介绍
  • 适用场景
  • 前提条件
  • 单Pod手动规格变配操作示例
  • 步骤一:开启原地变配的特性门控
  • 步骤二:对ACS Pod进行规格变配
  • 使用自动柔性变配加速应用启动示例
  • 使用限制
  • 步骤一:开启原地变配的特性门控
  • 步骤二:安装ack-advanced-vertical-pod-autoscaler组件
  • 步骤三:使用柔性变配加速应用启动
  • 步骤四:观察Pod的创建和服务启动过程
  • 步骤五:观察Pod容器重启后服务启动过程
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等