hpa自动扩容

官方文档

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

HPA是什么

Kubernetes有一个HPA(Horizontal Pod Autoscaler)的资源,可以实现基于CPU使用率的Pod自动伸缩的功能。

(1)HPA基于Master Node上的kube-controller-manager服务启动参数horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率。

如果需要设置horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。

(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

Horizontal Pod Autoscaler 演练

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。

本文将引领你了解如何为 php-apache 服务器配置和使用 Horizontal Pod Autoscaler。 与 Horizontal Pod Autoscaler 相关的更多信息请参阅 Horizontal Pod Autoscaler 用户指南

参数

minReplicas: 最小pod实例数

maxReplicas: 最大pod实例数

metrics: 用于计算所需的Pod副本数量的指标列表

resource: 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)

object: k8s内置对象的特定指标(需自己实现适配器)

pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)

external: 非k8s内置对象的自定义指标(需自己实现适配器)

案例:监控cpu,内存,每秒数据包自动扩容

apiVersion: autoscaling/v2beta1 #(支持cpu,memory,及自定义)
kind: HorizontalPodAutoscaler
metadata:
name: bikesvc
namespace: sg-bs
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: bikesvc
metrics:
- type: Resource
resource:
name: memory # 内存占用率(百分比)
targetAverageUtilization: 80
- type: Resource
resource:
name: cpu # cpu占用率(百分比)
targetAverageUtilization: 80
# - type: Pods
# pods:
# metricName: packets-per-second # (每秒数据包)
# targetAverageValue: 1
- type: Object
object:
metricName: packets-per-second # (每秒数据包)
target:
kind: Deployment
name: bikesvc
targetValue: 1000

度量指标

pod清单案例-pod定义cup内存指标

apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeName: sg-15
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: 125m # 向集群申请cpu
memory: 1024Mi # 向集群申请内存

cpu度量指标

    - type: Resource
resource:
name: cpu # cpu占用率(百分比)
targetAverageUtilization: 80

memory内存度量指标

		- type: Resource
resource:
name: memory # 内存占用率(百分比)
targetAverageUtilization: 80

pod度量指标

	第一种可选的度量指标类型是 Pod 度量指标。这些指标从某一方面描述了 Pod, 在不同 Pod 之间进行平均,并通过与一个目标值比对来确定副本的数量。 它们的工作方式与资源度量指标非常相像,只是它们仅支持 target 类型为 AverageValue。

		- type: Pods
pods:
metricName: packets-per-second # (每秒数据包)
targetAverageValue: 1000

Object度量指标

		第二种可选的度量指标类型是对象(Object)度量指标。这些度量指标用于描述 在相同名字空间中的别的对象,而非 Pods。 请注意这些度量指标不一定来自某对象,它们仅用于描述这些对象。 对象度量指标支持的 target 类型包括 Value 和 AverageValue。 如果是 Value 类型,target 值将直接与 API 返回的度量指标比较, 而对于 AverageValue 类型,API 返回的度量值将按照 Pod 数量拆分, 然后再与 target 值比较。 下面的 YAML 文件展示了一个表示 requests-per-second 的度量指标。

		- type: Object
object:
metricName: packets-per-second # (每秒数据包)
target:
kind: Deployment
name: bikesvc
targetValue: 1000

基于更特别的度量值来扩缩

​ 许多度量流水线允许你通过名称或附加的 标签 来描述度量指标。 对于所有非资源类型度量指标(Pod、Object 和后面将介绍的 External), 可以额外指定一个标签选择算符。例如,如果你希望收集包含 verb 标签的 http_requests 度量指标,可以按如下所示设置度量指标块,使得扩缩操作仅针对 GET 请求执行:

type: Object
object:
metric:
name: `http_requests` # http请求
selector: `verb=GET` # 标签筛选

查看hpa状态详情

> kubectl describe hpa -n sg-bs
Name: bikesvc
Namespace: sg-bs
Labels: <none>
Annotations: CreationTimestamp: Fri, 03 Dec 2021 03:35:20 +0000
Reference: Deployment/bikesvc
Metrics: ( current / target )
resource memory on pods (as a percentage of request): 31% (42299392) / 80%
"packets-per-second" on Deployment/bikesvc (target value): <unknown> / 1
resource cpu on pods (as a percentage of request): 34% (87m) / 80%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetObjectMetric 106s (x80 over 21m) horizontal-pod-autoscaler unable to get metric packets-per-second: Deployment on sg-bs bikesvc/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
对于上面展示的这个 HorizontalPodAutoscaler,我们可以看出有若干状态条件处于健康状态。 首先,AbleToScale 表明 HPA 是否可以获取和更新扩缩信息,以及是否存在阻止扩缩的各种回退条件。 其次,ScalingActive 表明 HPA 是否被启用(即目标的副本数量不为零) 以及是否能够完成扩缩计算。 当这一状态为 False 时,通常表明获取度量指标存在问题。 最后一个条件 ScalingLimitted 表明所需扩缩的值被 HorizontalPodAutoscaler 所定义的最大或者最小值所限制(即已经达到最大或者最小扩缩值)。 这通常表明你可能需要调整 HorizontalPodAutoscaler 所定义的最大或者最小副本数量的限制了。

k8s-hpa自动横向扩容的更多相关文章

  1. k8s HPA自动收缩

    HPA自动收缩 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 #创建一个replicaset测试 [r ...

  2. Elasticsearch 横向扩容以及容错机制

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  3. Elasticsearch由浅入深(二)ES基础分布式架构、横向扩容、容错机制

    Elasticsearch的基础分布式架构 Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式系统,分布式是为了应对大数据量. Elasticsearch ...

  4. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

  5. 1.利用consul实现k8s服务自动发现

    标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } ​ - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...

  6. K8S(17)二进制的1.15版本部署hpa自动伸缩

    K8S(17)二进制部署的K8S(1.15)部署hpa功能 目录 K8S(17)二进制部署的K8S(1.15)部署hpa功能 零.参考文件: 一.生成metrics-proxy证书 二.修改apise ...

  7. minikube metrics-server HPA 自动扩缩容错误

    minikube metrics-server pod 错误 启动 minikube addons enable metrics-server 之后查看 metrics-server pod 会有如下 ...

  8. 虚拟机(Visual Machine)的云平台的自动伸缩扩容(auto-scaling)技术

    云计算平台中允许客户依据应用的负载进行云计算资源的弹性动态伸缩(理想的情况是实现一个用多少付费多少的模型,最大限度地降低用户的运营成本) 在进行讨论之前,先对几个名词进行定义 1)客户:使用云服务的人 ...

  9. Kubernetes自动横向伸缩集群节点以及介绍PDB资源

    在kubernetes中,有HPA在需要的时候创建更多的pod实例.但万一所有的节点都满了,放不下更多pod了,怎么办?显然这个问题并不局限于Autoscaler创建新pod实例的场景.即便是手动创建 ...

随机推荐

  1. Docker配置tomcat端口映射后无法访问(404)

    1.配置tomcat端口映射 2.访问测试 3.修改webapps文件,webapps.dist是所需文件 4.虚拟机中重新访问 5.在主机也能访问成功(注意路径为虚拟机IP,不是localhost)

  2. SpringCloud微服务实战——搭建企业级开发框架(十四):集成Sentinel高可用流量管理框架【限流】

      Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保障微服务的稳定性. Sentinel 具有 ...

  3. C++ IO基础

    一:c++I/O处理,按照数据输入输出的过程,形象的将其看做流.数据在流中进行传播. 所有的流有两个基类:ios和streambuf类 streambuf:提供对缓冲区的基本操作,设置缓冲区等 ios ...

  4. 什么是SimpleNVR流媒体服务器软件?

    SimpleNVR是一款新兴流媒体服务器应用软件,占用内存少,无插件.跨平台,应用非常广泛,操作简单易上手,同时还支持一键观看,十分便捷.另外,跟其他一般流媒体服务器不同,SimpleNVR支持开发者 ...

  5. Spring Cloud调用接口过程

    Spring Cloud 在接口调用上,大致会经过如下几个组件配合: Feign== >Hystrix ==>Ribbon ==>Http Client(apache http co ...

  6. 谷粒 | 10 | 阿里云OSS存储对象服务

    阿里云OSS对象存储服务 准备工作 1.在service模块新建子模块service_oss 2.引入pom.xml文件中引入oss服务依赖 <dependencies> <!--a ...

  7. Java经典面试题(二)-不古出品

    @ 目录 1. 为什么说 Java 语言"编译与解释并存"? 2.Oracle JDK 和 OpenJDK 的对比? 3.字符型常量和字符串常量的区别? 4.Java 泛型了解么? ...

  8. Springboot 加载配置文件源码分析

    Springboot 加载配置文件源码分析 本文的分析是基于springboot 2.2.0.RELEASE. 本篇文章的相关源码位置:https://github.com/wbo112/blogde ...

  9. [atARC084D]Small Multiple

    构造一张图:$\forall x$,向$10x$连一条边权为0的边,向$x+1$连1条边权为1的边,那么0到$i$的代价即为$i$各位数字之和 考虑到我们只关心于当前点的两个特征:1.模$n$的余数( ...

  10. 多线程合集(二)---异步的那些事,async和await原理抛析

    引言 在c#中,异步的async和await原理,以及运行机制,可以说是老生常谈,经常在各个群里看到有在讨论这个的,而且网上看到的也只是对异步状态机的一些讲解,甚至很多人说异步状态机的时候,他们说的是 ...