在生产环境中,一般而言,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-purpose
和ComputeQoS=default
的ACS Pod CPU资源的柔性变配:最大支持原始规格的100%扩容,最小支持原始规格的50%缩容。例如,一个
4vCpu8Gi
的ACS Pod扩缩容范围是2vCpu8Gi
至8vCpu8Gi
。资源变配当前存在最大16Core的上限。
适用场景
柔性变配目前支持变配过程不发生容器重启,对于算力使用有一定波峰波谷的情况,都可以使用此特性来满足,比如应用启动加速、有状态应用原地变配、应用的局部算力热点等。
具体适用场景说明:
对于启动期间需要进行一些编译或预加载,使用较多算力资源,常态运行资源回落至平稳状态,可以通过启动期间分配更多CPU资源,在启动完成后降配至较低资源以稳定运行。
有状态应用,如Redis在负载增加时可以通过柔性变配进行纵向扩容。
在线应用如存在部分大请求或长连接Session导致的局部热点压力可以通过柔性变配进行纵向扩容。
柔性变配后,应用Pod将按照变配后的规格进行计费。变配过程中或变配失败时仍然按照变配前的规格进行计费。
前提条件
已创建ACS集群,且版本为1.28及以上。具体操作,请参见创建ACS集群。
已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群kubeconfig并通过kubectl工具连接集群。
单Pod手动规格变配操作示例
步骤一:开启原地变配的特性门控
登录容器计算服务控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理。
在核心组件区域选择Kube API Server > 配置。在featureGates配置项中填入
InPlacePodVerticalScaling=true
,开启原地变配的特性门控。配置过程中Kube API Server卡片会显示状态为操作执行中,当状态重新变为已安装时,说明原地变配的特性门控开启成功。
步骤二:对ACS Pod进行规格变配
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。单击使用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
创建完成后在容器组页面点击编辑,手动把容器CPU资源从
1
修改为2
,然后点击更新。可以看到,启用柔性变配能力后,当前Pod可以不重启直接变更规格。
柔性变配功能同样会受到ACS资源规整的约束。如果变配后的配置规格超出了所支持的范围,会被自动规整至最接近的规格。
使用自动柔性变配加速应用启动示例
以一个典型Java应用为例,在应用启动阶段会在类加载、字节码编译等动作上消耗大量资源,而进入稳态后这部分资源将被释放出来。因此从应用快速启动,并且在常态运行中降低成本的角度考虑,我们需要有一种方式能让Serverless Pod在启动阶段使用更多资源,而服务启动完成后将资源进行降配。
ACS提供了Java应用启动加速的功能,您可以通过配置描述将一个ACS Pod以声明规格的一定倍数进行启动,在启动完成后自动降配至原始规格。关于JVM参数详细配置,请参见Java应用启动加速的JVM参数配置。
使用限制
启动加速功能: 启动加速功能依赖Pod的Ready状态来控制降配。若未配置就绪探针,容器一旦启动,即被认定为成功,并立即触发自动降配倒计时。建议在启用启动加速功能的Pod上配置就绪探针。
容器重启场景: 在期望容器重启时自动进行启动加速的场景中,若未配置就绪探针,可能会导致无法自动升配。
资源配置要求: 启动加速功能依赖Pod的原始资源来计算升配资源。因此,必须配置原始Requests和Limits值,否则可能无法应用启动加速功能。
步骤一:开启原地变配的特性门控
请参见步骤一:开启原地变配的特性门控。
步骤二:安装ack-advanced-vertical-pod-autoscaler组件
在左侧导航栏,选择应用> Helm,搜索并安装ack-advanced-vertical-pod-autoscaler组件。具体操作,请参见使用Helm管理ACS应用。
步骤三:使用柔性变配加速应用启动
通过YAML创建一个Java的工作负载,并开启启动加速特性。YAML中除了
scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'
之外,还需要通过alibabacloud.com/startup-cpu-burst-factor
和alibabacloud.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的创建和服务启动过程
创建完成后,进入应用详情,此时可以看到Pod以2vCpu4Gi
的规格进行创建。在启动完成并达到预设的延迟等待时间后,Pod规格会自动降配至1vCpu4Gi
。
查看Pod事件。
在事件页面中选择Pod,会透出具体的降配信息。在本示例中为
Starting to resize resource down for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Gi
。
除了通过查看事件来观察变配过程外,您还可以通过检查Pod的status.resize
字段是否非空来判断是否处于变配过程中。
查看Pod监控。
通过监控页面可以看到CPU Info信息中,CPU存在一个变化的过程。
步骤五:观察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
。
查看Pod事件。
在事件页面中选择Pod,会透出具体的升配和降配信息。在本示例中为
Starting to resize resource for container: spring cpu: 1 -> 2, memory: 4Gi -> 4Gi
和Starting to resize resource for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Gi
。查看Pod监控。
通过监控页面可以看到CPU Info信息中,CPU存在一个变化的过程。
- 本页导读 (0)
- 背景介绍
- 适用场景
- 前提条件
- 单Pod手动规格变配操作示例
- 步骤一:开启原地变配的特性门控
- 步骤二:对ACS Pod进行规格变配
- 使用自动柔性变配加速应用启动示例
- 使用限制
- 步骤一:开启原地变配的特性门控
- 步骤二:安装ack-advanced-vertical-pod-autoscaler组件
- 步骤三:使用柔性变配加速应用启动
- 步骤四:观察Pod的创建和服务启动过程
- 步骤五:观察Pod容器重启后服务启动过程