如果您想基于CPU使用率、内存使用率或其他自定义指标实现Pod的自动扩缩,建议您为业务容器开启水平伸缩(HPA)功能。HPA使容器服务具备非常灵活的适应能力,在业务负载急剧飙升时快速扩容出多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容来节省资源。整个过程自动化无需人为干预,适合服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如:电商服务、线上教育、金融服务等。
背景信息
从v1.18开始,K8s v2beta2 API允许通过HPA的behavior
字段配置扩缩行为。 在behavior
字段中的scaleUp
和scaleDown
分别指定扩容和缩容行为。当您在使用HPA时,希望只进行扩容或者只进行缩容的Pod伸缩,则可以通过开启指标伸缩,单击禁止缩容或者禁止扩容来实现。
默认值:均不禁止。
禁止扩容:
selectPolicy
的值Disabled
会关闭给定方向的扩容。因此使用以下策略,将会阻止扩容。behavior: scaleUp: selectPolicy: Disabled
禁用缩容:
selectPolicy
的值Disabled
会关闭给定方向的缩容。因此使用以下策略,将会阻止缩容。behavior: scaleDown: selectPolicy: Disabled
通过容器服务控制台创建HPA应用
阿里云容器服务已经集成了HPA,您可以简便地通过容器服务控制台进行创建。您可以在创建应用的时候创建HPA,也可以在已有应用的基础上开启HPA。
方式一:在创建应用过程中,开启HPA
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面单击使用镜像创建。
在应用基本信息页填写应用的名称等信息,然后单击下一步。
配置项
描述
命名空间
在页面顶部设置应用部署所处的命名空间,默认使用default命名空间。
应用名称
设置应用的名称。
副本数量
即应用包含的Pod数量,默认数量为2。
类型
定义资源对象的类型,可选择无状态、有状态、任务、定时任务、守护进程集。
标签
为该应用添加一个标签,标识该应用。
注解
为该应用添加一个注解(annotation)。
时区同步
仅ACK集群支持配置此参数,ACK Serverless集群不支持。表示容器与节点是否使用相同的时区。
在容器配置页进行容器设置,选择镜像,并设置所需的资源。然后单击下一步。详情请参见配置容器。
说明您必须为Deployment设置所需资源,否则无法进行容器自动伸缩。
在高级设置页的访问设置区域,单击服务的创建,设置服务的相关信息,详情请参见高级设置。
在高级设置页选中指标伸缩的开启,设置伸缩的条件和配置。
指标:支持CPU和内存,需要和设置的所需资源类型相同。
触发条件:资源使用率的百分比,超过该使用量,容器开始扩容。有关Pod水平自动扩缩的算法,请参见算法细节。
最大副本数:该Deployment可扩容的容器数量上限。该值需要大于最小副本数。
最小副本数:该Deployment可缩容的容器数量下限。该值需要设置为大于等于1的整数。
单击右下角的创建,一个支持HPA的Deployment就已经创建完毕。
结果验证
单击查看应用详情或者在
中单击应用名称或操作列的详情,单击容器伸缩,您可在部署的详情中查看伸缩组信息。在实际使用环境中,应用会根据CPU负载进行伸缩。您也可在测试环境中验证弹性伸缩,通过给Pod进行CPU压测,可以发现Pod在半分钟内即可完成水平的扩展。
方式二:为已有应用开启HPA
以下以无状态应用为例,演示如何为已有应用开启HPA。
通过kubectl命令创建HPA应用
您也可通过编排模板来手动创建HPA,并将其绑定到要伸缩的Deployment对象上,通过kubectl命令实现容器自动伸缩配置。
下面针对一个Nginx应用进行举例。
创建并复制以下内容到nginx.yml中。
Deployment的编排模板如下。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 # replace it with your exactly <image_name:tags> ports: - containerPort: 80 resources: requests: #必须设置,否则HPA无法运行。 cpu: 500m
执行以下命令,创建Nginx应用。
kubectl create -f nginx.yml
创建HPA。
通过scaleTargetRef设置当前HPA绑定的对象,在本例中绑定名叫nginx的Deployment。
说明HPA需要给Pod设置request资源,如果没有request资源,HPA不会运行。
执行
kubectl describe hpa <HPA的名称>
会发现有类似以下的警告信息。Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7 Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
创建好HPA后,再次执行
kubectl describe hpa <HPA的名称>
命令。可以看到以下信息,则表示HPA已经正常运行。
Normal SuccessfulRescale 39s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
此时当Nginx的Pod的利用率超过本例中设置的50%利用率时,则会进行水平扩容,低于50%的时候会进行缩容。
相关文档
有关Pod水平自动扩缩的算法,请参见算法细节。
VPA基于Pod的资源使用情况自动为集群设置资源占用的限制,从而让集群将Pod调度到有足够资源的最佳节点上。详细信息,请参见容器垂直伸缩(VPA)。
- 本页导读 (1)