智能应对流量变化,容器化集群的弹性攻略
手动部署
80
https://www.aliyun.com/solution/tech-solution/ack-hpa
方案概览
通过本教程,您将学习如何在阿里云容器服务上部署的应用,使用应用型负载均衡ALB(Application Load Balancer)七层负载均衡服务,将来自客户端的请求分发至后端容器Pod上,同时利用容器水平伸缩HPA(Horizontal Pod Autoscaler)功能实现弹性伸缩,能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如电商服务、线上教育、金融服务等。
方案架构
本架构采用单地域双可用区部署,将系统部署在2个不同可用区,实现了可用区级故障灾备能力,同时在节点和Pod两个维度开启了弹性伸缩能力,保证了业务的连续性。
本方案的技术架构包括以下基础设施和云服务:
1个专有网络VPC和2个交换机:构建云上私有网络。
1个应用型负载均衡ALB:负载均衡服务。
1个容器服务Kubernetes版集群:容器服务平台,提供容器应用管理服务。
1个SLS Project和1个SLS Logstore:提供访问记录的存储服务。
2-3台云服务器ECS:由容器服务Kubernetes版集群创建并部署Nginx服务,作为Web站点。
应用型负载均衡ALB(Application Load Balancer):专门面向七层应用,提供强大的应用层处理能力和丰富的高级转发规则。单ALB实例性能最大可达100万QPS。更多信息,请参见什么是应用型负载均衡ALB。
Pod水平自动扩缩HPA(Horizontal Pod Autoscaler):Kubernetes内置组件,提供Pod水平扩缩容能力。
此外阿里云容器服务提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,更多信息,请参见弹性伸缩概述,了解不同方案的适用场景、使用限制等。
默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈。本教程将介绍如何实现基于QPS数据的应用弹性伸缩,更多应用弹性伸缩场景,请参见容器水平伸缩。
部署准备
10
准备账号
如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。
为节省成本,本方案默认全部选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。
完成本方案的部署及体验,预计产生费用不超过10元(假设您选择本文示例规格资源,且资源运行时间不超过60分钟。实际情况中可能会因您操作过程中实际使用的流量差异,会导致费用有所变化,请以控制台显示的实际报价以及最终账单为准,如下表格仅供参考)。
序号
产品
规格
地域
1
云服务器 ECS
ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见ECS选型最佳实践。
本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。
华东1(杭州)
2
应用型负载均衡ALB
功能版本:标准版。
华东1(杭州)
3
容器服务Kubernetes版
集群版本:ACK托管集群Pro版。
华东1(杭州)
4
日志服务SLS
无规格要求。
华东1(杭州)
创建专有网络VPC和交换机
您需要创建1个专有网络VPC和2个交换机(建议您在目标地域选择两个不同的可用区,分别创建2个对应可用区的交换机,实现可用区级故障灾备能力)。
登录专有网络管理控制台。
在顶部菜单栏,选择华东1(杭州)地域。
在左侧导航栏,单击专有网络。
在专有网络页面,单击创建专有网络。
在创建专有网络页面,配置1个专有网络和2台交换机。配置交换机时,请确保交换机所属的可用区的ECS、ALB处于可用状态。
项目
说明
示例值
VPC名称
建议您在部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。
长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。
k8s-hpa-vpc
VPC IPv4网段
在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见组成部分。
在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。
192.168.0.0/16
Vswitch名称
建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写交换机名称即可创建对应名称的虚拟交换机。
长度为2~128个字符,以英文大小写字母或中文开头,可包含数字、下划线(_)和连字符(-)。
k8s-hpa-vswitch-1
k8s-hpa-vswitch-2
Vswitch可用区
建议选择排序靠后的可用区,一般此类可用区较新。新的可用区资源更充沛,新规格也会在新的可用区优先上线。
说明请您参见公有云支持的地域和可用区,选择应用型负载均衡ALB产品支持的地域和可用区,否则会导致后续步骤无法操作。
可用区 J
可用区 K
Vswitch IPv4网段
每台虚拟交换机需要一个IPv4网段。
192.168.0.0/24
192.168.1.0/24
创建日志服务SLS
您需要创建1个日志服务SLS Project,用于存储系统访问记录,容器服务也会通过访问记录统计QPS作为HPA弹性伸缩的依据。
登录日志服务SLS控制台。
在Project列表,单击创建Project(SLS Logstore后续会由容器服务自动创建,当前步骤无需手动创建SLS Logstore)。
项目
说明
示例值
所属地域
选择部署地域。
华东1(杭州)
Project名称
建议您在部署过程中新建一个SLS Project作为本教程的日志服务项目。
注意:SLS Project名称在阿里云地域内全局唯一,创建后不可修改。
k8s-hpa-sls-project
配置ACK集群
20
创建ACK集群
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页,点击创建集群。
集群配置
参数
描述
示例值
集群版本
容器服务ACK提供多种集群类型,包括ACK托管集群、ACK Serverless集群、ACK Edge集群等,各版本差异请查看容器服务产品简介,本教程使用ACK托管集群Pro版。
ACK托管版
集群名称
集群的名称。长度为1~63个字符,可包含数字、下划线(_)或中划线(-),需以英文大小写字母、中文或数字开头。
k8s-hpa-cluster
集群规格
选择集群规格,本教程使用Pro版。
Pro版
地域
选择集群所在的地域。
华东1(杭州)
付费类型
容器服务Kubernetes版支持按量付费和包年包月两种付费类型,本教程使用按量付费类型。
按量付费
Kubernetes 版本
显示当前ACK支持的Kubernetes版本,建议选择最新版本。
1.28.9-aliyun.1
专有网络
从VPC下拉列表中选择一个VPC。
选择资源准备步骤中创建的VPC
交换机
设置虚拟交换机,为提升系统可用性,建议您至少选择两台交换机。
选择资源准备步骤中创建的交换机
安全组
支持选择自动创建普通安全组、自动创建企业级安全组、选择已有安全组。有关安全组的详细内容,请参见安全组概述,本教程选择自动创建企业级安全组。
自动创建企业级安全组
API server 访问
您可以设置是否开放使用 EIP 暴露 API Server,为方便后续步骤使用kubectl工具,本教程选择使用 EIP 暴露 API Server。
使用 EIP 暴露 API server
网络插件
设置启用的网络插件和插件配置,支持Flannel和Terway网络插件。详细信息,请参见使用Terway网络插件,本教程使用Terway网络插件。
Terway
Pod 交换机
网络插件选择Terway时,您需要为Pod分配IP的虚拟交换机。每个Pod虚拟交换机分别对应一个Worker节点的虚拟交换机,Pod虚拟交换机和Worker节点的虚拟交换机的可用区需保持一致。
选择资源准备步骤中创建的交换机
节点池配置
参数
描述
示例值
节点池名称
输入自定义的节点池名称。
k8s-hpa-cluster-nodepool
容器运行时
根据集群Kubernetes版本选择容器运行时。
containerd:推荐使用,支持所有版本的集群。
安全沙箱:支持1.24及以下版本的集群。
Docker:支持1.22及以下版本的集群。
本教程使用推荐的containerd容器运行时。
containerd 1.6.28
实例规格
根据实例规格或属性选择Worker节点池使用的ECS实例,可通过vCPU、内存、规格族、架构等属性进行筛选。
节点池扩容时,将从选中的实例规格中扩容。具体扩容到的实例规格取决于节点池扩缩容策略。选择的实例规格越多,节点池成功弹出节点的概率越大。
由于实例规格不可用或库存不足,导致节点池弹出节点失败时,可以尝试添加更多实例规格。
本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例。
ecs.c6.xlarge
ecs.c7.xlarge
操作系统
选择操作系统。
Alibaba Cloud Linux 3
登录方式
目前支持设置密钥、设置密码和创建后设置,本教程使用设置密码的方式
设置密码
系统盘
您可以选择配置更多系统盘类型,配置与系统盘不同的磁盘类型,提高扩容成功率。创建实例时,系统将根据指定的磁盘类型顺序,选择第一个匹配的磁盘类型用于创建实例。
ESSD云盘
40GiB
性能PL0
期望节点数
建议创建时至少选择两台节点,创建完成后,可以根据您的实际情况,增减节点。节点太少或者规格太低均会影响集群组件的运行。
2
云监控插件
在高级选项(选填)中配置。
是否安装云监控插件。安装后,可在云监控控制台查看所创建ECS实例的监控信息。
说明该选项仅对节点池新增节点生效,对节点池已有节点无效。已有节点如需安装云监控插件,请通过云监控控制台安装。
安装插件
公网 IP
在高级选项(选填)中配置。
是否为节点分配IPV4地址。如果未选中,不会配公网IP地址,当选择公网IP后,还需配置带宽计费方式和带宽峰值。
不分配公网IP
组件配置
参数
描述
示例值
Ingress
设置是否安装Ingress网络组件,本教程使用ALB作为负载均衡器,选择ALB Ingress。
ALB Ingress
新建ALB实例
网络类型:公网
虚拟交换机:选择资源准备步骤中创建的交换机
容器监控
默认选中使用 Prometheus 监控服务,为容器服务ACK集群提供基础监控和报警。
本教程不需要使用Prometheus监控服务,不选中容器监控
日志服务
设置是否启用日志服务,您可使用已有Project或新建一个Project。
选择使用已有Project,请选择部署准备步骤中创建的SLS Project
控制平面组件日志
设置是否开启控制平面组件日志,您可使用已有Project或新建一个Project。开启后将从ACK控制层收集托管集群控制平面组件日志到您账号中的SLS日志服务的Log Project中。
选择使用已有Project,请选择部署准备步骤中创建的SLS Project
确认配置,检查前几个步骤的配置是否正确,如无误可以点击创建集群。请访问容器服务控制台,在左侧导航栏选择集群,进入集群列表页观察集群创建状态。
安装监控插件
为后续ACK集群能够获取应用QPS数据进行弹性伸缩,需要为ACK集群安装监控插件。
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在Helm页面,单击创建。参考如下信息完成基础信息配置。
参数
示例值
应用名
ack-alibaba-cloud-metrics-adapter
命名空间
kube-system
来源
默认为应用市场。
Chart
应用场景:选择全部。
支持架构:选择amd64。
搜索框:搜索ack-alibaba-cloud-metrics-adapter。
选中ack-alibaba-cloud-metrics-adapter,单击下一步。
在参数配置页面,选择Chart 版本,建议您选择最新版本,然后单击确定。
配置kubectl工具
CloudShell是阿里云推出的云命令行工具,您可以在任意浏览器上运行CloudShell命令管理阿里云资源。本教程利用CloudShell执行kubectl命令来管理集群。
开启API Server的公网访问能力。CloudShell仅支持通过公网连接集群,因此集群的API Server必须已开启公网访问能力。在创建ACK集群步骤中,已介绍如何创建集群时开启API Server的公网访问能力,如果您创建集群时未开启该能力,请参考控制集群API Server的公网访问能力了解已有集群如何开启API Server的公网访问能力。
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,进入集群详情页。
在集群详情页,单击通过CloudShell管理集群。
说明使用CloudShell时,某些场景会出现挂在存储空间的提示,可以根据您的真实使用场景进行选择,本教程选择暂不创建。
以当前集群的Namespace为例,检查配置是否正确。
kubectl get namespace
预期输出:
NAME STATUS AGE arms-prom Active 56m default Active 60m kube-node-lease Active 60m kube-public Active 60m kube-system Active 60m
配置应用
15
创建后端应用
本教程以部署两个Nginx应用为例,演示如何通过配置ALB Ingress,实现相同域名不同URL路径的流量转发。
前端请求 | 流量转发至 |
host/coffee | coffee服务 |
host/tea | tea服务 |
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
配置完成后单击创建,页面将提示创建成功。
检查Deployment和Service创建成功:
在左侧导航栏,选择工作负载 > 无状态。可查看到名称为coffee和tea的Deployment已存在。
在左侧导航栏,选择网络 > 服务。可查看到名称为coffee-svc和tea-svc的Service已存在。
创建AlbConfig
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
选择资源定义,单击使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
需要调整参数说明如下:
参数
是否必填
说明
vSwitchId
是
填写创建ACK集群时配置的虚拟交换机ID。
spec.config.accessLogConfig.logProject
是
Alb负载均衡实例接收到用户请求后,会将请求数据存储到SLS日志服务中,请填写部署准备步骤中创建的SLS Project。
spec.config.accessLogConfig.logStore
是
设置Logstore名称,需要以alb_开头。
说明请设置一个不存在的logStore,系统将会自动创建,填写手动创建的logStore会导致后续步骤失败。
可选择调整参数说明如下:
参数
是否必填
说明
metadata.name
是
AlbConfig的名称。
说明AlbConfig的名称在集群中必须是唯一的。因此,在创建AlbConfig时,您需要确保AlbConfig名称的唯一性,以避免命名冲突。
请您保存名称,后续的步骤需要再次使用该名称。
spec.config.name
否
ALB实例的名称。
spec.config.addressType
否
ALB实例的网络类型。取值如下:
Internet(默认值):公网类型。面向公网提供应用型负载均衡服务,公网可访问。
说明应用型负载均衡通过绑定弹性公网IP进行公网服务,使用公网类型ALB实例将收取弹性公网IP的实例费与带宽、流量费用,详情参见按量付费。
Intranet:私网类型。面向VPC内部提供应用型负载均衡服务,公网不可访问。
spec.config.zoneMappings
是
设置ALB交换机ID,请填写部署准备步骤中创建的交换机ID。创建交换机具体操作请参见创建和管理交换机。
说明指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB支持的地域与可用区,请参见ALB支持的地域与可用区。
应用型负载均衡支持多可用区部署,若当前地域支持2个及以上可用区,请至少选择2个或以上不同可用区的交换机,以保障业务的高可用性。
spec.config.accessLogConfig.logProject
是
Alb负载均衡实例接收到用户请求后,会将请求数据存储到SLS日志服务中,请填写部署准备步骤中创建的SLS Project。
spec.config.accessLogConfig.logStore
是
设置Logstore名称,需要以alb_开头。
说明请设置一个不存在的logStore,系统将会自动创建,填写手动创建的logStore会导致后续步骤失败。
spec.listeners
否
配置ALB的监听端口和协议。本教程配置示例为端口80的HTTP监听。
监听定义了流量进入负载均衡的方式和规则,此处建议保留该配置,否则您需要另行创建监听才可使用ALB Ingress。
配置完成后单击创建,页面将提示创建成功。
检查ALB实例创建成功:
在顶部菜单栏,选择实例所属的地域。
在
页面,在实例列表可查看到名称为k8s-hpa-alb的ALB实例,表示实例创建成功。
创建IngressClass
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击右上角使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
IngressClass的名称。
说明IngressClass的名称在集群中必须是唯一的。因此,在创建IngressClass时,您需要确保IngressClass名称的唯一性,以避免命名冲突。
spec.parameters.name
是
关联的AlbConfig的名称,与前一步创建AlbConfig的metadata.name保持一致。
配置完成后单击创建,页面将提示创建成功。
检查IngressClass创建成功:
在左侧导航栏,选择工作负载 > 自定义资源。
选择资源对象浏览器页签。
在API组搜索栏中,输入IngressClass进行搜索,可查看到对应的IngressClass已创建。
创建Ingress
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击右上角使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
Ingress的名称。
说明Ingress的名称在集群中必须是唯一的。因此,在创建Ingress时,您需要确保Ingress名称的唯一性,以避免命名冲突。
spec.ingressClassName
是
关联的IngressClass的名称,与前一步创建IngressClass的metadata.name保持一致。
spec.rules.http.paths.path
是
转发路径URL。
spec.rules.http.paths.pathType
是
URL匹配规则。详情可参考基于URL路径转发请求。
spec.rules.http.paths.backend.service.name
是
填写您此前创建的Service名称。
spec.rules.http.paths.backend.service.port.number
是
填写您此前创建的Service的服务端口号。
这个端口号的设置非常重要,因为它决定了在路由到后端服务时使用的端口。确保端口号正确设置,以确保请求可以正确路由到后端服务并被处理。
配置完成后单击创建,页面将提示创建成功。
检查Ingress创建成功:
在左侧导航栏,选择网络 > 路由。可查看到名称为k8s-hpa-alb-ingress的Ingress已部署。
在k8s-hpa-alb-ingress的端点列,可查看到端点信息。
应用验证
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在路由列表页,找到前一步创建的Ingress,查看目标Ingress的端点信息。
通过端点信息,拼装访问地址,分别是http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/tea和http://alb-xxx.cn-hangzhou.alb.aliyuncs.com/coffee
通过浏览器或curl命令请求拼装的两个地址,访问应用服务
配置弹性伸缩
15
配置节点池弹性伸缩
当集群的容量规划无法满足应用Pod调度时,您可以使用节点自动伸缩功能实现节点的自动扩缩。节点自动伸缩适用于扩容规模较小(例如开启弹性的节点池数量少于20,或对应节点池中的节点数量少于100),工作负载批次较为稳定,以单次伸缩为主等业务场景。
开启节点自动伸缩
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在节点池页面,单击节点伸缩后方的去配置。
首次使用集群自动弹性伸缩功能时,按照页面提示,开通ESS服务并完成授权(如已开通并授权,请跳过)。
在节点伸缩配置页面,选择节点伸缩方案为自动伸缩,配置伸缩的配置项,然后单击确定。
配置
说明
节点池扩容顺序策略
随机策略:存在多个可扩容节点池时,从中任意选择一个节点池进行扩容。
默认策略:存在多个可扩容节点池时,从中选择一个资源浪费最少的节点池进行扩容。
优先级策略:存在多个可扩容节点池时,会按照您自定义的顺序选择优先级高的节点池进行扩容。
需在创建开启了弹性的节点池后再操作。
弹性灵敏度
用于调整系统判断伸缩的间隔时间。默认值为60s。
实施弹性伸缩时,弹性组件会基于调度情况自动触发扩容。您只需配置缩容条件。
重要ECS节点:仅当同时满足缩容阈值、缩容触发时延和静默时间三个条件时,弹性组件才有可能执行节点缩容。
GPU节点:仅当同时满足GPU 缩容阈值、缩容触发时延和静默时间三个条件时,弹性组件才有可能执行GPU节点缩容。
允许缩容
是否允许进行节点缩容。关闭时,缩容相关配置不生效。请谨慎设置。
缩容阈值
启用节点自动伸缩的节点池中,单个节点的请求资源(Request)与单个节点资源容量的比值。
仅当该比值低于配置的阈值时,即节点的CPU和内存资源利用率均低于缩容阈值时,节点才有可能被缩容。
GPU 缩容阈值
GPU实例的缩容阈值。
仅当该比值低于配置的阈值时,即节点的CPU、内存和GPU资源利用率均低于GPU 缩容阈值时,GPU节点才有可能被缩容。
缩容触发时延
从检测到有缩容需求(达到缩容阈值)到实际执行缩容操作(缩容Pod数量)之间的时间间隔。单位:分钟。默认值:10分钟。
重要仅当满足缩容阈值配置,且达到缩容触发时延后,弹性组件才有可能执行节点缩容。
静默时间
距离最近一次扩容完成后,弹性组件不执行缩容的时间间隔。
在静默时间内,弹性组件不会缩容节点,但仍会判断节点是否可以缩容;超过静默时间后,如果节点满足缩容阈值和缩容触发时延两个条件,弹性组件则会正常执行缩容。例如,当静默时间为10分钟,缩容触发时延为5分钟时,弹性组件在最近一次扩容后的10分钟内不会缩容节点,但会在静默的10分钟内判断节点是否符合缩容条件。等待静默时间结束,节点达到缩容阈值且时间超过缩容触发时延规定的5分钟时,弹性组件会继续执行缩容。
配置开启弹性的节点池
节点自动伸缩的扩缩对象为开启了自动伸缩节点池的节点。因此,配置节点自动伸缩后,您还需要配置将创建ACK集群的节点池开启弹性。
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在节点池列表页找到之前步骤创建的节点池,点击编辑。
在编辑页面,找到自动伸缩配置,选择开启自动弹性伸缩,之后点击确认按钮。
配置HPA弹性伸缩
默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈,本教程将介绍如何实现基于QPS数据的应用弹性伸缩。当同时指定多种HPA指标时,HPA会在检测到任何一个指标达到扩缩阈值后执行扩缩容操作。
请访问容器服务控制台,在左侧导航栏,选择集群,进入集群列表页。
在集群列表页面,单击目标集群名称,在集群详情页,单击通过CloudShell管理集群,用于运行配置ACK集群步骤中配置的kubectl工具。
进入CloudShell界面后,执行shell命令创建yaml文件
vim hpa.yaml
使用以下内容,填充到hpa.yaml文件中。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: k8s-alb-tea-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: tea minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_alb_ingress_qps selector: matchLabels: sls.project: "k8s-hpa-sls-project" sls.logstore: "alb_k8s_hpa_sls_logstore" sls.ingress.route: "default-tea-svc-80" target: type: AverageValue averageValue: 2 - resource: name: cpu target: averageUtilization: 80 type: Utilization type: Resource - resource: name: memory target: averageUtilization: 80 type: Utilization type: Resource
可调整参数说明如下:
参数
说明
metadata.name
HPA的名称。
spec.scaleTargetRef.name
应用名称,本教材使用前面步骤创建的tea应用作为示例。
spec.minReplicas
最小容器数量,该Deployment可缩容的容器数量下限,该值需要设置为大于等于1的整数。
spec.maxReplicas
最大容器数量,该Deployment可扩容的容器数量上限,该值需要大于最小副本数。
spec.metrics.external
默认HPA只支持基于CPU和内存的自动伸缩,external代表使用了除CPU和内存以外的扩展HPA指标,本教程中的QPS指标属于external类型。
spec.metrics.external.metric.name
HPA弹性伸缩使用的指标,sls_alb_ingress_qps代表ALB数据的IngressRoute每秒查询率,更多指标请查看阿里云HPA指标。
spec.metrics.external.metric.selector.matchLabels.sls.project
填写日志服务SLS Project信息,用于监控组件获取应用访问信息,与创建AlbConfig步骤中设置的spec.config.accessLogConfig.logProject保持一致
spec.metrics.external.metric.selector.matchLabels.sls.logstore
填写日志服务SLS Logstore信息,用于监控组件获取应用访问信息,与创建AlbConfig步骤中设置的spec.config.accessLogConfig.logStore保持一致
spec.metrics.external.metric.selector.matchLabels.sls.ingress.route
格式为<namespace>-<svc>-<port>,本教材实例为default-tea-svc-80。
spec.metrics.external.target.type
AverageValue表示QPS要除以Pod的数目进行判断。
spec.metrics.resource
默认HPA指标,支持CPU和内存两种,通过spec.metrics.resource.name设置为cpu和memory两种方式进行配置。
spec.metrics.resource.target
设置HPA默认指标的利用率阈值,示例中CPU阈值和内存阈值都配置为80%。
本教程以QPS、CPU、内存三个不同的HPA指标作为示例,您可以根据业务情况做出相应的修改,比如不需要使用内存HPA指标,可以删除resource.name为memory的相关配置。
执行以下命令,创建HPA。
kubectl apply -f hpa.yaml
检查创建成功:
在左侧导航栏,选择自动伸缩 > 工作负载伸缩。
单击水平伸缩页签,然后选择HPA,查看扩缩容状态和任务列表。
完成及清理
20
方案验证
清理资源
释放ACK集群:
登录容器服务控制台,在左侧导航栏,选择集群,进入集群列表页,找到目标集群,在更多选项中查看是否有关闭集群删除保护状态的选项,如果有请单击关闭集群删除保护状态,在弹出的对话框中将集群删除保护选项进行取消。
在更多选项中单击删除,按照界面提示释放实例。
释放SLS Project:
登录日志服务控制台,在Project列表页找到前面步骤中创建的名称为k8s-hpa-sls-project的Project,单击删除,按照界面提示释放实例。
释放台交换机:
登录专有网络控制台,在交换机页面,找到目标交换机,然后在操作列单击删除,按照界面提示释放实例。
释放专有网络VPC:
登录专有网络控制台,在专有网络页面,找到目标VPC,然后在操作列单击删除,按照界面提示释放实例。
一键部署
50
https://www.aliyun.com/solution/tech-solution/ack-hpa
方案概览
通过本教程,您将学习如何在阿里云容器服务上部署的应用,使用应用型负载均衡ALB(Application Load Balancer)七层负载均衡服务,将来自客户端的请求分发至后端容器Pod上,同时利用容器水平伸缩HPA(Horizontal Pod Autoscaler)功能实现弹性伸缩,能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如电商服务、线上教育、金融服务等。
方案架构
本架构采用单地域双可用区部署,将系统部署在2个不同可用区,实现了可用区级故障灾备能力,同时在节点和Pod两个维度开启了弹性伸缩能力,保证了业务的连续性。
本方案的技术架构包括以下基础设施和云服务:
1个专有网络VPC和2个交换机:构建云上私有网络。
1个应用型负载均衡ALB:负载均衡服务。
1个容器服务Kubernetes版集群:容器服务平台,提供容器应用管理服务。
1个SLS Project和1个SLS Logstore:提供访问记录的存储服务。
2-3台云服务器ECS:由容器服务Kubernetes版集群创建并部署Nginx服务,作为Web站点。
应用型负载均衡ALB(Application Load Balancer):专门面向七层应用,提供强大的应用层处理能力和丰富的高级转发规则。单ALB实例性能最大可达100万QPS。更多信息,请参见什么是应用型负载均衡ALB。
Pod水平自动扩缩HPA(Horizontal Pod Autoscaler):Kubernetes内置组件,提供Pod水平扩缩容能力。
此外阿里云容器服务提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,更多信息,请参见弹性伸缩概述,了解不同方案的适用场景、使用限制等。
默认HPA只支持基于CPU和内存的自动伸缩,并不能满足全部业务场景的运维需求,以IO密集型系统为例,CPU和内存并不是系统的唯一瓶颈。本教程将介绍如何实现基于QPS数据的应用弹性伸缩,更多应用弹性伸缩场景,请参见容器水平伸缩。
部署准备
10
如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。
为节省成本,本方案默认全部选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。
完成本方案的部署及体验,预计产生费用不超过10元(假设您选择本文示例规格资源,且资源运行时间不超过60分钟。实际情况中可能会因您操作过程中实际使用的流量差异,会导致费用有所变化,请以控制台显示的实际报价以及最终账单为准,如下表格仅供参考)。
序号
产品
规格
地域
1
云服务器 ECS
ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见ECS选型最佳实践。
本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。
华东1(杭州)
2
应用型负载均衡ALB
功能版本:标准版。
华东1(杭州)
3
容器服务Kubernetes版
集群版本:ACK托管集群Pro版。
华东1(杭州)
4
日志服务SLS
无规格要求。
华东1(杭州)
一键部署
10
单击一键部署前往ROS控制台,选择ECS实例规格和可用区(注意需要选择两个不同的可用区),填写ACK托管版集群名称等额外信息。具体产生的费用根据您选择的ECS规格而不同,以控制台显示为准。
本教程使用ecs.c6.xlarge和ecs.c7.xlarge规格作为示例,如果您发现目标可用区无推荐规格的实例,可以选择其他可用区或者其他规格的实例。
请您参见公有云支持的地域和可用区,选择应用型负载均衡ALB产品支持的地域和可用区,否则会导致后续步骤无法操作,建议您选择杭州地域可用区 J和可用区 K。
开始创建后,等待约10分钟左右,显示创建成功。
验证及清理
30
方案验证
清理资源
如果您无需继续使用,请尽快删除资源,避免继续产生费用:
登录ROS控制台。
在左侧导航栏,选择资源栈。
在资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除。
在删除资源栈对话框,选择删除方式为释放资源,然后单击确定,根据提示完成资源释放。