简介

通过手工执行 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的更多相关文章

  1. 终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩

    昨天晚上通过压测验证了 HPA 部署成功了. 所使用的 HPA 配置文件如下: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscale ...

  2. 排查 Kubernetes HPA 通过 Prometheus 获取不到 http_requests 指标的问题

    部署好了 kube-prometheus 与 k8s-prometheus-adapter (详见之前的博文 k8s 安装 prometheus 过程记录),使用下面的配置文件部署 HPA(Horiz ...

  3. Kubernetes HPA 使用详解

    文章转载自:https://www.qikqiak.com/post/k8s-hpa-usage/ Kubernetes 提供了这样的一个资源对象:Horizontal Pod Autoscaling ...

  4. 使用k8s-prometheus-adapter实现HPA

    环境: kubernetes 1.11+/openshift3.11 自定义metric HPA原理: 首选需要注册一个apiservice(custom metrics API). 当HPA请求me ...

  5. ofo容器pass架构分享

    一.我们先要了解一下,为什么企业需要一个paas平台?或者可以说paas到底能做什么? 1.1 我们先来了解一下paas到底是什么? PaaS是Platform-as-a-Service的缩写,意思是 ...

  6. k8s 安装 prometheus 过程记录

    开始以为只要安装 prometheus-operator 就行了. git clone https://github.com/coreos/prometheus-operator.git cd pro ...

  7. Podinfo,迷你的 Go 微服务模板

    ​项目介绍 Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践. 它已实现的技术指标(截选自官方 README.md ): 里面每一 ...

  8. Deployment必须包含资源对象

    Deployment 是一个控制器,能够用来控制 pod 数量跟期望数量一致,配置 pod 的发布方式 Deployment 会按照给定策略进行发布指定 pod,保证在更新过程中不可用数量在限定范围内 ...

  9. Prometheus自身的监控告警规则

    1.先在 Prometheus 主程序目录下创建rules目录,然后在该目录下创建 prometheus-test.yml文件,内容如下: 内容很多,可以根据实际情况进行调整. 规则参考网址:http ...

随机推荐

  1. Redis学习之路(四)之Redis集群

    [toc] #Redis集群 1.Redis Cluster简介 Redis Cluster为Redis官方提供的一种分布式集群解决方案.它支持在线节点增加和减少. 集群中的节点角色可能是主,也可能是 ...

  2. idea 解决 pom.xml 中,maven仓库无法导入的问题(红线)

    只需要用另一篇文章的 maven clean install 功能就行了 idea Cannot Resolve Symbol 问题解决

  3. python语言程序设计2

    1, 代码高亮色彩体系 2, 缩进,一行代码开始前的空白区域,表达程序的格式框架 单层缩进,多层缩进 特点 概念,缩进是语法的一部分,缩进不正确的话可能会导致程序运行错误 用处(意义),是表达代码间包 ...

  4. java写个自己的mvc框架学习笔记

    1. 介绍 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的 ...

  5. 程序员大佬推荐的java学习路线

    作为我的第一篇博客,我第一个想到的就是在校时就看到的这篇文章.并且在之后的时间里自己都反复观看过,有时候这不单单是一篇学习路线,也是审视自己技术能力的里程碑,和激励自己的鞭挞绳. 先来个书籍清单: & ...

  6. Linux/Mac 挂载远程服务器目录到本地

    1. 安装 sudo apt-get installsshfs 2. 创建SSHFS 挂载目录 sudo mkdir/mnt/siyuan 3.使用SSHFS 挂载远程的文件系统 sudo sshfs ...

  7. linux使用curl上传文件并且同时携带其它传递参数

    一般使用linux原生态的命令curl上传文件时命令如下 假如要上传文件是myfile.txt curl -F "file_name=@myfile.txt" -X POST &q ...

  8. 继承 多态 java相关基础知识

    1:静态语句块.构造语句块(就是只有大括号的那块)以及构造函数的执行顺序 例子: class HelloA { public HelloA() { System.out.println("H ...

  9. beta4

    吴晓晖(组长) 过去两天完成了哪些任务 昨天FloatingActionButton和权限获取调整 今天复习,没写东西,晚点有空了写 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还 ...

  10. PAT 甲级 1090 Highest Price in Supply Chain

    https://pintia.cn/problem-sets/994805342720868352/problems/994805376476626944 A supply chain is a ne ...