k8s.HPA.使用自定义指标Pod自动扩容

环境 env :

kubernetes v1.22

metrics-server 0.6.1

prometheus v2.36.1

prometheus-adapter.v0.10.0

概述

弹性伸缩

  • 1、资源层弹性, 如增减k8s节点
  • 2、调度层弹性, 如增减pod副本数量(HPA)、增减pod负载占比(VPA)

HPA概念

  • HPA全称Horizontal Pod Autoscaling 即pod水平自动扩展
  • HPA定期轮询获取监控指标,计算pod数量,自动增减pod数量
  • pod数量算法: 期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]

HPA的API版本

# 获取hpa版本
kubectl api-versions | grep autoscal
autoscaling/v1 #只支持cpu指标
autoscaling/v2beta1 #cpu,内存,自定义指标
autoscaling/v2beta2 #cpu,内存,自定义指标,外部指标
autoscaling/v2 #1.23版本开始有,v2beta2将被废弃

HPA Core metrics(核心指标)

# top命令正常则metrics-server已安装
kubectl top nodes # 安装metrics-server 0.6.1
# kubectl apply -f https://gitee.com/alivv/elvin-demo/raw/master/k8s/metrics-server.v0.6.1.yml

创建HPA实例

# 创建deployemnt和hpa demo
kubectl apply -f https://gitee.com/alivv/elvin-demo/raw/master/k8s/hpa-nginx-demo.yml # 查看hpa
kubectl get hpa
kubectl describe hpa hpa-nginx-demo # 查看pod数量
kubectl get deploy hpa-nginx-demo # 删除demo
kubectl delete -f https://gitee.com/alivv/elvin-demo/raw/master/k8s/hpa-nginx-demo.yml

HPA Custom Metrics(自定义指标)

prometheus-adpater部署

# prometheus部署 略
# prometheus-adpater部署, By Elvin
#下载修改prometheus地址后部署
wget https://gitee.com/alivv/elvin-demo/raw/master/k8s/prometheus-adapter.v0.10.0.yml
# 替换成自己的prometheus地址
prometheus_url=http://prometheus.monitor.svc:9090
sed -i "s@http://prometheus.monitor.svc:9090@${prometheus_url}@" prometheus-adapter.v0.10.0.yml kubectl apply -f prometheus-adapter.v0.10.0.yml # 查看接口和自定义指标
kubectl get --raw "/apis/custom.metrics.k8s.io" | jq .
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .

自定义指标实例如下

apiVersion: v1
kind: ConfigMap
metadata:
name: adapter-config
namespace: custom-metrics
data:
config.yaml: |
rules: - seriesQuery: '{__name__=~"container_memory_working_set_bytes|container_spec_memory_limit_bytes",container!="POD",namespace!="",pod!=""}'
resources:
overrides:
namespace:
resource: namespace
pod:
resource: pod
name:
matches: ^(.*)
#指标名称
as: "memory_limit_usage"
#prometheus查询语句
metricsQuery: round(sum (container_memory_working_set_bytes{container!="POD",namespace!="",pod!=""}) by (namespace, pod) / sum (container_spec_memory_limit_bytes{container!="POD",namespace!="",pod!=""}) by (namespace, pod) * sum (avg_over_time(kube_pod_status_ready{condition="true"}[1m])) by (namespace, pod) * 100)

简要说明

  • memory_limit_usage #内存使用率

    container_memory_working_set_bytes / container_spec_memory_limit_bytes

    java程序占用内存大,监控和扩容使用的限制值

  • pod处于ready状态前1分钟不参与计算

    避免pod刚启动时的cpu、内存波动造成hpa判断不准,

    使用avg_over_time求前1分钟的平均值,

    pod状态not ready时kube_pod_status_ready值为0

HPA实例

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-nginx-demo
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-nginx-demo
minReplicas: 1
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
#自定义监控指标名称
name: memory_limit_usage
target:
type: AverageValue
#平均值大于等于90时
averageValue: 90 #autoscaling/v2beta2开始支持扩缩策略
behavior:
scaleUp:
#扩容前等待s 默认0s
stabilizationWindowSeconds: 30
policies:
- type: Percent
value: 100
#每15s最大扩容当前1倍数量Pod
periodSeconds: 15
- type: Pods
value: 4
#每15s最大允许扩容4个Pod
periodSeconds: 15
#使用以上两种扩容策略中算出来扩容Pod数量最大的
selectPolicy: Max
scaleDown:
#缩容等待 默认300
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 100 # 允许全部缩掉
periodSeconds: 15

根据不同业务场景调节HPA扩缩容灵敏度


参考

#Pod 水平自动扩缩

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

#部署HPA实现高可用和成本控制

https://zzq23.blog.csdn.net/article/details/108982724

#HPA基于CPU、内存和自定义指标自动扩缩容

https://blog.csdn.net/fly910905/article/details/105375822/

#Kubernetes自定义监控指标 Prometheus Adapter

https://www.cnblogs.com/zhangmingcheng/p/15773348.html

#根据不同业务场景调节HPA扩缩容灵敏度

https://cloud.tencent.com/document/product/457/50660

#HPA自动伸缩常见问题

https://help.aliyun.com/document_detail/181491.html

k8s.HPA.使用自定义指标Pod自动扩容的更多相关文章

  1. k8s系列---资源指标API及自定义指标API

    不得不说千万不要随意更改版本,我用的1.13的版本,然后学到这一步时,还因yaml文件不同,卡住了很久,然后各种google才找到解决办法  https://www.linuxea.com/2112. ...

  2. Kubernetes 笔记 012 Pod 的自动扩容与缩容

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  3. 有状态软件如何在 k8s 上快速扩容甚至自动扩容

    概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, ...

  4. k8s HPA(HorizontalPodAutoscaler)--自动水平伸缩

    写在前面 我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱):一般没有上容器编排是手动加的,临时加的机器,临时部署的服务还要改Nginx的配置,最后回收机器的时候,也是手动回收,手 ...

  5. k8s之自定义指标API部署prometheus

    1.自定义指标-prometheus node_exporter是agent;PromQL相当于sql语句来查询数据; k8s-prometheus-adapter:prometheus是不能直接解析 ...

  6. k8s-资源指标API及自定义指标API-二十三

    一. 原先版本是用heapster来收集资源指标才能看,但是现在heapster要废弃了. 从k8s v1.8开始后,引入了新的功能,即把资源指标引入api: 在使用heapster时,获取资源指标是 ...

  7. Kubernetes 监控:Prometheus Adpater =》自定义指标扩缩容

    使用 Kubernetes 进行容器编排的主要优点之一是,它可以非常轻松地对我们的应用程序进行水平扩展.Pod 水平自动缩放(HPA)可以根据 CPU 和内存使用量来扩展应用,前面讲解的 HPA 章节 ...

  8. (K8s学习笔记八)Pod的扩缩容

    1.手动扩容机制 示例:对busybox-deployment手动扩缩容 apiVersion:apps/v1 kind: Deployment metadata: name: busybox-dep ...

  9. Kubernetes 学习23 kubernetes资源指标API及自定义指标API

    一.概述 1.上集中我们说到,官方文档提示说从k8s 1.11版本开始,将监控体系指标数据获取机制移向新一代的监控模型.也就意味着对于我们的k8s来讲现在应该有这样两种资源指标被使用.一种是资源指标, ...

  10. 简单4步,利用Prometheus Operator实现自定义指标监控

    本文来自Rancher Labs 在过去的文章中,我们花了相当大的篇幅来聊关于监控的话题.这是因为当你正在管理Kubernetes集群时,一切都会以极快的速度发生变化.因此有一个工具来监控集群的健康状 ...

随机推荐

  1. Windows 10 LTSC 2019(1809) WSL 安装 CentOS 7

    1.安装WSL    通过控制面板--程序和功能--启用或关闭WIndows功能,勾选"适用于Linux的Windows子系统".    或者通过管理员权限打开 PowerShel ...

  2. USB协议详解第11讲(USB描述符-总结)

    描述符回顾总结 1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备.设备需要的总 ...

  3. 活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术

    数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显.作为中国数据库联盟(ACDU)的品牌活动之一,[ACDU 中国行]在线下汇集数据库领域的行业知 ...

  4. 好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

    本文为墨天轮社区作者 张sir 原创作品,记录了日常运维Oracle数据库过程中遇到的一个慢SQL问题的解决.优化过程,文章内容全面具体.分析到位,且含有经验总结,分享给各位. 问题现象 这次出问题的 ...

  5. 某小说解锁VIP

    在User类中定位到这个方法,尝试直接返回true 可以发现apk显示了vip的到期时间,测试一下vip是否有效 显然这个vip是没起作用的,还有地方在控制这个vip的方法.在jadx中查看交叉引用 ...

  6. 05 Transformer 中的前馈神经网络(FFN)的实现

    2:20:理论链接 博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链 ...

  7. 神经网络之卷积篇:详解经典网络(Classic networks)

    详解经典网络 首先看看LeNet-5的网络结构,假设有一张32×32×1的图片,LeNet-5可以识别图中的手写数字,比如像这样手写数字7.LeNet-5是针对灰度图片训练的,所以图片的大小只有32× ...

  8. springboot2.X动态修改log4j2日志级别

    利用springboot提供的 spring-boot-starter-actuator 包可以实现动态修改log4j2日志级别的功能 添加依赖 添加依赖包 <dependency> &l ...

  9. C#使用Kubernetes (k8s)

    在C#中使用Kubernetes (k8s) 通常通过官方的Kubernetes .NET客户端与Kubernetes API进行交互.以下是如何在C#中使用Kubernetes的简要指南. 1. 安 ...

  10. php如何解决高并发

    PHP交流群  656679284  为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! 1.应用和静态资源分离 将静态资源(js,css,图片等)放到专门的服务器中. 2.页面缓存 将应用 ...