Kubernetes HPA
简介
通过手工执行 kubectl scale 命令或者通过修改deployment的replicas数量,可以实现 Pod 扩容或缩容。但如果仅止于此,显然不符合 Google 对 Kubernetes 的定位目标 —— 自动化、智能化。在 Google 看来,分布式系统要能够根据当前负载的变化情况自动触发水平扩展或缩容的行为,因为这一过程可能是频繁发生的、不可预料的,所以手动控制的方式是不实现的。
因此,Kubernetes 的 v1.0 版本实现后,这帮大牛们就已经在默默研究 Pod 智能扩容的特性了,并在 Kubernetes v1.1 版本中首次发布了这一重量级新特性—— Horizontal Pod Autoscaling (Pod 横向自动扩容,简称 hPA)。随后的 v1.2 版本中 HPA 被升级为稳定版本(apiVersion: autoscaling/v1),但同时仍然保留旧版本(apiVersion: extensions/v1beta1)。从 v1.6 版本为 autoscaling/v2alpha1,仍在不断演进过程中。
HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。
当前,HPA可以有以下两种方式作为 Pod 负载的调度指标:
- CPUUtilizationPercentage。
- 应用程序自定义的度量指标,比如服务在每秒内的相应的请求数(TPS 或 QPS)。
CPUUtilizationPercentage 是一个计算平均值,即目标 Pod 所有副本自身的 CPU 利用率的平均值。一个 Pod 自身的 CPU 利用率是该Pod当前的 CPU 的使用量除以它的 Pod Request 的值,比如定义一个 Pod 的 Pod Request 为0.4,而当前的 Pod 的CPU 使用量为 0.2,则它的 CPU 使用率为 50%,如此一来,就可以算出来一个 RC 控制的所有 Pod 副本的 CPU 利用率的算术平均值了。如果某一时刻 CPUUtilizationPercentage 的值超过 80%,则意味着当前的 Pod 副本数很可能不足以支撑接来下更多的请求,需要进行动态扩容,而当前请求高峰时段过去后,Pod 的 CPU 利用率又会降下来,此时对应的 Pod 副本数应该自动减少到一个合理的水平。
CPUUtilizationPercentage 计算过程中使用到的 Pod 的 CPU 使用量通常是1min内的平均值,目前通过查询 Heapster 扩展组件来得到这个值,所以需要安装部署 Heapster,这样一来便增加了系统的复杂度和实时HPA特性的复杂度,因此,未来的计划是 Kubernetes 自身实现一个基础性能数据采集某块,从而更好的支持 HPA 和其他需要用到基础性能数据的功能模块。此外,如果目标 Pod 没有定义 Pod Request 的值,则无法使用 CPUUtilizationPercentage 来实现 Pod 很想自动扩容的能力。除了使用 CPUUtilizationPercentage,Kubernetes 从 v1.2 版本开始尝试支持应用程序自定义的度量指标,目前仍然为实验特性,不建议在生产环境使用。
简单配置
下面是 HPA 定义的一个具体例子:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
maxReplicas: 10
minReplicas: 4
scaleTargetRef:
kind: Deployment
name: nginx-demo
targetCPUUtilizationPercentage: 90
根据上面的定义,可以知道这个 HPA 控制的目标对象为一个名叫 nginx-demo 的 Deployment 里的 Pod 副本,当这些 Pod 副本的 CPUUtilizationPercentage 的值超过 90% 时会触发自动动态扩容行为,扩容或缩容时必须满足一个约束条件是 Pod 的副本数要介于4与 10 之间。
除了可以通过之间定义 YAML 文件并且调用 kubectl create 的命令来创建一个 HPA 资源对象的方式,还能通过下面的简单命令直接创建等价的 HPA 对象:
kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10
Kubernetes HPA的更多相关文章
- 终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
昨天晚上通过压测验证了 HPA 部署成功了. 所使用的 HPA 配置文件如下: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscale ...
- 排查 Kubernetes HPA 通过 Prometheus 获取不到 http_requests 指标的问题
部署好了 kube-prometheus 与 k8s-prometheus-adapter (详见之前的博文 k8s 安装 prometheus 过程记录),使用下面的配置文件部署 HPA(Horiz ...
- Kubernetes HPA 使用详解
文章转载自:https://www.qikqiak.com/post/k8s-hpa-usage/ Kubernetes 提供了这样的一个资源对象:Horizontal Pod Autoscaling ...
- 使用k8s-prometheus-adapter实现HPA
环境: kubernetes 1.11+/openshift3.11 自定义metric HPA原理: 首选需要注册一个apiservice(custom metrics API). 当HPA请求me ...
- ofo容器pass架构分享
一.我们先要了解一下,为什么企业需要一个paas平台?或者可以说paas到底能做什么? 1.1 我们先来了解一下paas到底是什么? PaaS是Platform-as-a-Service的缩写,意思是 ...
- k8s 安装 prometheus 过程记录
开始以为只要安装 prometheus-operator 就行了. git clone https://github.com/coreos/prometheus-operator.git cd pro ...
- Podinfo,迷你的 Go 微服务模板
项目介绍 Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践. 它已实现的技术指标(截选自官方 README.md ): 里面每一 ...
- Deployment必须包含资源对象
Deployment 是一个控制器,能够用来控制 pod 数量跟期望数量一致,配置 pod 的发布方式 Deployment 会按照给定策略进行发布指定 pod,保证在更新过程中不可用数量在限定范围内 ...
- Prometheus自身的监控告警规则
1.先在 Prometheus 主程序目录下创建rules目录,然后在该目录下创建 prometheus-test.yml文件,内容如下: 内容很多,可以根据实际情况进行调整. 规则参考网址:http ...
随机推荐
- 微信小程序选择并上传图片
上传图片 API: wx.chooseImage() 和 wx.uploadFile() wx.chooseImage({ count: 1, // 默认9 sizeType: ['origina ...
- HTML 脚本 (Script) 实例
1.JavaScript 使 HTML 页面具有更强的动态和交互性.HTML script 元素<script> 标签用于定义客户端脚本,比如 JavaScript. script 元素既 ...
- 记录一次Docker For Windows10镜像加速器配置
1.访问https://www.daocloud.io 注册账号 2.访问资源->加速器,或者直接访问网址https://www.daocloud.io/mirror,页面中间有加速配置,例如我 ...
- k8s网络之calico学习
一.知识准备 1.calico主要通过ipip协议与bgp协议来实现通信.前者通过ipip隧道作为通信基础,后者则是纯三层的路由交换 2.bgp协议主要由两种方式:BGP Speaker 全互联模式( ...
- PAT甲题题解-1059. Prime Factors (25)-素数筛选法
用素数筛选法即可. 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄. 而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为i ...
- Daily Scrum NO.2
工作概况 符美潇(PM) 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.为两名团队新成员制定了任务并录入TFS. 今日工作 1.Daily Scrum.日常会议及日 ...
- 《Linux内核分析》 之 计算机是如何工作的
[李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...
- Linux内核分析第四周总结
用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...
- Daily Scrum - 11/16
时间:午饭 今天小组例会主要是汇报了各自的进度.任烁那边主要为工程添加了单词的类(包含各个参数等成员变量),方便以后实现算法:拜重阳实现了一个简易的“点进-点出”UI,可谓迈出了艰难的第一步:章玮和罗 ...
- java 多维数据定义
//一维数组定义与输出class less02{ public static void main(String[] args) { int stu[]=new int[]{1,2 ...