企业级运维之云原生与Kubernetes实战课程 - 第四章第4讲 ACK集群弹性伸缩

简介: 弹性伸缩是根据业务需求和策略,经济地自动调整弹性计算资源的管理服务。

企业级运维之云原生与Kubernetes实战课程

第四章第4 ACK集群弹性伸缩

 

 

视频地址:

https://developer.aliyun.com/learning/course/913/detail/14608

 

 

一、 弹性伸缩概述

 

1.  集群弹性伸缩

 

弹性伸缩是根据业务需求和策略,经济地自动调整弹性计算资源的管理服务。

 

弹性伸缩的本质是解决容量和成本之间的博弈。当出现资源不足、资源浪费或激增峰值容量的场景下,就需要运用弹性伸缩,如下图。

 image.png

 

2.  弹性伸缩的优势

 

针对三类人群,弹性伸缩的优势分别是:

 

  • 开发人员:应用获得高可用的保障;
  • 运维人员:降低基础设施的管理成本;
  • 架构师:架构灵活应对突发的激增峰值。

 

3.  弹性伸缩的分类

 

弹性伸缩分为两个维度:调度层弹性和资源层弹性。

 

a.  调度层弹性:

 

  • 所有弹性都与Pod相关,而无需关心资源情况;
  • 主要负责修改负载的调度容量变化;
  • 组件包括:
  • HPAPod水平伸缩组件,调整应用的副本数;
  • VPAPod纵向伸缩组件,面向有状态服务的扩容和升级场景;
  • CronHPA:定时伸缩组件,面向周期性负载场景

 

b.  资源层弹性:

 

  • 所有弹性都与Pod和资源情况相关;
  • 主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECSECI等资源的方式进行调度容量的补充;
  • 组件包括:
  • cluster-autoscaler:当Pod资源不足时,主动进行节点伸缩;
  • virtual-kubelet-autoscaler:当没有足够资源给Pod调度时,弹出虚拟节点,并将Pod调度到虚拟节点。

 

二、HPA

 

Pod水平伸缩(HPA)可以基于CPU/Memory等指标对Pod副本数进行扩缩。

 

1.  HPA原理

 

a.  HPA自动伸缩的三步骤:

 

  • 获取被伸缩资源对象管理的所有Pod度量;
  • 计算使度量数值到达或接近所指定目标数值所需的Pod数量;
  • 更新被伸缩资源的replicas字段;

image.png

 

b.  适用对象

 

  • Deployment
  • StatefulSet
  • ReplicaSet
  • ReplicationController

 

c.  不适用对象

 

  • DaemonSet

 

2.  计算所需的Pod数量

 image.png

 

如上图所示,假设有3PodCPU使用率分别是60%90%50%QPS分别为153012

 

场景一:单个Pod指标的自动伸缩

 

如果目标CPU使用率为50%,计算需要多少副本数:(60+90+50/50=4,因此,需要扩容1Pod

 

场景2:多个Pod指标的自动伸缩

 

除了目标CPU使用率指标,又增加了目标QPS指标,这时HPA会单独计算每个指标的副本数,然后取最大值;

 

当目标QPS20,副本数=15+30+12/20=3,因此两个指标的副本数取最大值就是4

 

计算公式:

 image.png

 

公式解读:所有的Pod监控数值求和后除以HPA资源上配置的目标值。

 

3.  HPA特性

 

a.  统计周期

 

  • --horizontal-Pod -autoscaler-sync-period参数控制统计指标的周期,默认15s

 

b.  忽略Pod 度量

 

  • Pod被标记为删除;
  • Pod缺失度量值,它将会被搁置,只在最终确定扩缩数量时再考虑;
  • 当使用CPU指标来扩缩时,任何还未就绪(例如还在初始化)状态的Pod,该Pod会被搁置;

 

c.  冷却、延迟支持

 

  • 场景:指标动态变化较频繁,会造成副本数量频繁变化,称之为“抖动”;
  • --horizontal-Pod -autoscaler-downscale-stabilization可以控制冷却时间,即自从上次缩容执行结束后,多久可以再次执行缩容,默认时间是5分钟;

 

d.  边界值计算

 

  • 在计算边界条件时,会自动加入10%的缓冲负载缓解整体的负载情况;

 

e.  支持的指标

 

  • 除了自带的CPUMemory指标外,还支持用户自定义指标以及外部指标。

 

4.  HPA示例

 

apiVersion: autoscaling/v1

 kind: HorizontalPodAutoscaler

 metadata:

   name:test

 spec:

   maxReplicas:3

   minReplicas:2

   scaleTargetRef:

     apiVersion:apps/v1

     kind:Deployment

     name: test1

   targetCPUUtilizationPercentage: 80

 

参数说明:

 

  • max/minReplicas:最大/最小副本数;
  • scaleTargetRef:设置当前HPA绑定的对象,在本例中绑定名为test1Deployment
  • targetCPUUntilizationPercentage:目标CPU使用率。

 

5.  创建HPA应用

 

HPA应用有两种创建方式,一种是通过容器服务器控制台创建,另一种是通过Kuberletctl命令创建。

 

a.  通过容器服务器控制台创建

 

示例:为已有应用开启HPA

 

  • 在集群管理页左侧导航栏中,选择工作负载 > 无状态;
  • 在无状态页面中,单击目标应用名称进入详情页;
  • 单击容器伸缩页签,然后单击“创建”;
  • 在创建对话框中设置伸缩配置,单击“确定”;

 image.png

 

b.  通过Kubectl命令创建

 

通过编排模板来手动创建HPA,并将其绑定到要伸缩的Deployment对象上,通过kubectl命令实现容器自动伸缩配置。

 

注意:HPA需要给Pod设置request资源,如果没有request资源,HPA不会运行。

 

三、节点自动伸缩

 

1.  节点扩容

 

节点是否扩容是根据集群中是否有pending状态的Pod来决策的。

 image.png

 

扩容原理:

 

cluster-autoscaler是通过对处在PendingPod进行监听而触发的。当Pod处在Pending的原因是调度资源不足的时候,会触发cluster-autoscaler的模拟调度,模拟调度器会计算在配置的伸缩组中,哪个伸缩组弹出节点后可以调度这些PendingPod

 

2.  节点缩容

 

节点是否缩容是根据集群中是否有节点调度利用率低于阈值来决策的。

 image.png

 

缩容原理:

 

  • 首先只有弹性伸缩弹出的节点会被缩容,静态的节点是无法被cluster-autoscaler接管的。缩容的判断是通过每个节点单独判断的,当任意一个节点的调度利用率低于所设置的调度阈值时,会触发节点的缩容判断。
  • 同时还要计算哪个伸缩组弹出节点后可以调度这些pending,此时cluster-autoscaler会尝试模拟驱逐节点上面的负载,判断当前节点是否可以排水彻底。有些特殊的Podkube-system命名空间的非DaemonSet PodPDB控制的Pod等),则会跳过该节点而选择其他的候选节点。
  • 当节点发生驱逐时,会先进行排水,将节点上的Pod驱逐到其他的节点,然后再下线该节点。

 

3.  操作演示

 

步骤一:执行自动伸缩

 

在集群列表页面,在目标集群右侧的操作列下,选择更多> 自动伸缩,进入集群自动弹性伸缩配置页面。

 

步骤二:授权

 

授权RAM角色AliyunCSManagedAutoScalerRole

 image.png

在云资源访问授权页面,单击同意授权;

 image.png

步骤三:配置自动伸缩

 

a.  在集群自动弹性伸缩配置页面,填写以下信息并提交:

 

  • 允许缩容;
  • 缩容阈值:cluster-autoscaler管理的伸缩组中,每一个节点的资源申请值(Request)与每一个节点的资源容量的比值,当低于配置的阈值时,节点会进行缩容;
  • GPU缩容阈值;
  • 缩容触发时延:集群满足配置的缩容阈值时,在配置的缩容触发时延到达后,集群开始缩容。单位:分钟,默认情况下是10分钟;
  • 静默时间:扩容出的节点,在静默时间过后,方可进入缩容判断;
  • 弹性灵敏度;
  • 节点池扩容顺序策略。

 image.png

 

b.  创建节点池,设置伸缩组的配置项;

 image.png

 

c.  单击确认配置,创建伸缩组。

 

 

本讲小结

 

1.  ACK集群伸缩的几种类型,包括HPAVPACronHPA、节点自动伸缩、虚拟节点自动伸缩;

2.  HPA水平伸缩的机制节点自动伸缩的机制。

 

思考:

  • HPA和节点自动伸缩,有什么区别?
  • 如何延缓hpa来回扩缩造成的抖动?
相关文章
|
6月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
808 0
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19821 30
|
运维 Cloud Native 开发工具
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
550 8
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
225 18
|
运维 Oracle 前端开发
Oracle 11g RAC集群日常运维命令总结
Oracle 11g RAC集群日常运维命令总结
685 2
|
存储 运维 监控
实时计算Flink版在稳定性、性能、开发运维、安全能力等等跟其他引擎及自建Flink集群比较。
实时计算Flink版在稳定性、性能、开发运维和安全能力等方面表现出色。其自研的高性能状态存储引擎GeminiStateBackend显著提升了作业稳定性,状态管理优化使性能提升40%以上。核心性能较开源Flink提升2-3倍,资源利用率提高100%。提供一站式开发管理、自动化运维和丰富的监控告警功能,支持多语言开发和智能调优。安全方面,具备访问控制、高可用保障和全链路容错能力,确保企业级应用的安全与稳定。
305 0