Kubernetes 自动伸缩 auto-scaling
使用 Kubernetes 的客户能够迅速响应终端用户的请求,交付软件也比以往更快。但是,当你的服务增长速度比预期更快时,计算资源不够时,该怎么处理呢?
此时可以很自豪地说: Kubernetes 1.3 提供了一个解决方案:自动伸缩( auto-scaling )。搭建在 Google 计算引擎( GCE )和 Google 容器引擎( GKE )(以及即将用于 AWS )上, Kubernetes 会在必要时自动扩容你的集群,并在不需要时缩容,以便为你省下一笔费用。
Part 1 :自动伸缩的优势
这里我们用一个例子说明自动伸缩的应用场景。
想象一下你有一个 7*24 (全天候)的服务,它的负载随着时间变化。在美国地区,白天服务非常繁忙,夜间负载相对较低。
理想情况下,我们希望集群中节点和运行中 Pod 的数量能够动态调整负载,以适应终端用户的需求。新的 自动伸缩 功能与 Horizontal Pod Autoscaler 配合在一起可以自动解决这个问题。
Part 2 :在 GCE 设置 Autoscaling
以下操作指南适用于 GCE 。对于 GKE 请在集群操作手册(查看“相关链接”)查看 autoscaling 这个章节。
开始之前,我们需要一个活跃的 GCE 项目,并且启用 Google Cloud Monitoring 、 Google Cloud Logging 和 Stackdriver 。
如果你想了解如何创建一个 GCE 项目,请阅读入门指南(查看“相关链接”)。我们还需要下载一个 Kubernetes 项目的最新版本(版本 v1.3.0+)。
第一步:创建一个集群,并启用 Autoscaler 。
集群中的节点数量将从 2 开始,并自动调整到最大 5 。要实现这一点,我们需要设置以下环境变量:

通过 kube-up.sh 启动集群:

kube-up.sh 脚本创建一个集群,并默认启用了 Autoscaler 插件。如果集群中存在 pending pod , autoscaler 将尝试向集群中添加新的节点,然后 pending 的 pod 会被调度到新节点上。
我们观察一下集群,它应该有两个节点:

第二步:运行并暴露 PHP-Apache 服务
为了演示自动伸缩功能,我们基于 php-apache 镜像制作了一个自己的镜像。镜像可以在这里(见“参考链接”)找到。它定义一个 index.php 页面,这个页面会执行 CPU 密集的计算。
首先,我们创建一个 deployment ,并将其端口暴露出来:

现在,我们将等待一段时间,验证部署和服务是否被正确创建和运行:

使用 wget 命令检查 Php-apache 服务是否运行正常:

第三步:启动 Horizontal Pod Autoscaler
depleoyment 正常运行后,我们将为它创建一个 Horizontal Pod Autoscaler 对象。使用 kubectl autoscale 命令就可以:

这里我们定义了一个 Horizontal Pod Autoscaler ,它保证 deployment 对象 php-apache 控制的 Pod 数量在 1 ~ 10 之间。
换句话说, horizontal autoscaler 通过 deployment 对象增加或减少 Pod 副本数量,以保证所有 Pod 的 CPU 平均使用率在 50%左右。
kubectl run 创建 deployment 时,为每个 Pod 申请了 0.5 核 CPU ,也就是说,每个 Pod 实际平均使用 0.25 核 CPU )。
关于该算法的详细信息查看文章末尾(“相关链接”)。
我们可以通过” kubectl get hpa ”检查 autoscaler 的状态:

注意,当前的 CPU 使用率是 0%,因为我们没有向服务器发送任何请求(当前列显示的是与 hpa 对应的 rc 下所有 pods 的 CPU 使用率的均值。
第四步:提高负载
现在,我们将看到 Autoscalers ( Cluster Autoscaler 和 Horizontal Pod Autoscaler )如何响应不断增加的负载。我们将启动两个实例(请运行在不同的终端),每个实例启动一个访问 php-apache 服务的死循环:

我们需要稍微等待一段时间( 1min 左右),然后检查 Horizontal Pod Autoscaler 的状态:

Horizontal Pod Autoscaler 已经把 Pod 数量增加到 7 。我们检查下是不是所有的 Pod 都在运行:

我们可以发现:一些 pod 处于 pending 状态。我们使用 ” kubectl describe ” 命令查看其中一个 pending pod ,以获取 pending 的原因:

该 pod 正在 pending 是由于在系统中没有足够的 CPU 资源。我们还可以看到有一个 TriggeredScaleUp 事件。这意味着 pod 触发了 Cluster Autoscaler 的响应,一个新节点将被添加到集群中。
现在我们再等待一段时间( 3min 左右),并列出所有节点:

我们可以发现:一个新节点 kubernetes-minion-group-6z5i 被 Cluster Autoscaler 添加到集群中。我们确认下所有的 pods 都已经运行正常:

添加节点以后,所有的 php-apache pods 都在正常运行!
第五步:降低负载
现在,我们停止向服务器打压力。我们把两个向 server 发请求的死循环都结束掉,然后观察 php-apache 服务的状态:

我们可以看到, Pod 的 CPU 平均使用率已经降到 0%, Pod 个数也降到 1 。
把多余的 Pod 删除以后,大部分的集群资源都都被空出来。短时间内,集群不会被缩容,因为 Cluster Autoscaler 必须确保 php-apache 服务对资源的需求确实降低了,而不是短期或临时原因(比如 Pod 升级)。
更多细节参考 Cluster Autoscaler 的文档(“相关链接”)。
集群缩容可能比扩容花费更多时间。大约 10-12 分钟后,您可以验证集群节点数量的下降:

集群中节点的个数重新恢复到 2 , 节点 kubernetes-minion-group-6z5i 已经被 Autoscaler 删除。
Part 3 :其他使用场景
看完上面的例子,我们可以发现,结合 Horizontal Pod Autoscaler 和 Cluster Autoscaler 动态调整 pods 数量是很简单的。
在有些场景下, Cluster Autoscaler 自己也能发挥不少作用,尤其是应对某些不规则的负载变化。
举个例子,与集群相关的开发或者集成测试一般不会在周末和晚上进行。
对于批处理集群,当所有 Job 都结束,而新的 Job 也只能在几个小时后才开始。
让机器闲着绝对是暴殄天物。
在这些场景下, Cluster Autoscaler 能够减少空闲结点的数量,并显示减少支出,因为你只需要为实际运行的服务付费,同时也能够保证你总是有足够的资源运行你的任务。
Kubernetes 自动伸缩 auto-scaling的更多相关文章
- Kubernetes自动伸缩pod-HPA
在运维中,虽然能预先知道负载何时会飙升,或者如果负载的变化是较长时间内逐渐发生的,手动扩容也是可以接受的,但指望靠人工干预来处理突发而不可预测的流量增长,仍然不够理想. 幸运的是,Kubernetes ...
- 基于Prometheus,Alermanager实现Kubernetes自动伸缩
到目前为止Kubernetes对基于cpu使用率的水平pod自动伸缩支持比较良好,但根据自定义metrics的HPA支持并不完善,并且使用起来也不方便. 下面介绍一个基于Prometheus和Aler ...
- kubernetes云平台管理实战:HPA水平自动伸缩(十一)
一.自动伸缩 1.启动 [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu ...
- kubernetes要实现的目标——随机关掉一台机器,看你的服务能否正常;减少的应用实例能否自动迁移并恢复到其他节点;服务能否随着流量进行自动伸缩
Kubernetes 是来自 Google 云平台的开源容器集群管理系统.基于 Docker 构建一个容器的调度服务.该系统可以自动在一个容器集群中选择一个工作容器供使用.其核心概念是 Contain ...
- Kubernetes自动横向伸缩集群节点以及介绍PDB资源
在kubernetes中,有HPA在需要的时候创建更多的pod实例.但万一所有的节点都满了,放不下更多pod了,怎么办?显然这个问题并不局限于Autoscaler创建新pod实例的场景.即便是手动创建 ...
- 基于Kubernetes的hpa实现pod实例数量的自动伸缩
Pod 是在 Kubernetes 体系中,承载用户业务负载的一种资源.Pod 们运行的好坏,是用户们最为关心的事情.在业务流量高峰时,手动快速扩展 Pod 的实例数量,算是玩转 Kubernetes ...
- kubernetes之Pod水平自动伸缩(HPA)
https://k8smeetup.github.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ Horizon ...
- 译:Spring Boot 自动伸缩
原文链接:https://dzone.com/articles/spring-boot-autoscaler 作者:Piotr Mińkowski 译者:helloworldtang 自动伸缩是每个人 ...
- [html]三列居中自动伸缩的结构
html三列居中自动伸缩的结构 <div style="width:100%;height:80px;border:1px solid #DDD;margin-bottom:10px; ...
随机推荐
- mac sublime切换编辑语言的方法(添加其他版本的python)
在sublime中指定python版本,操作如下: Sublime——tools——build system——new build system 把文件中的内容替换为 { "cmd" ...
- Bootstrap-CL:警告
ylbtech-Bootstrap-CL:警告 1.返回顶部 1. Bootstrap 警告(Alerts) 本章将讲解警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警 ...
- c语言个人财务管理系统
这个是我的一个网上朋友写的,仅供大家参考: 在这里留个记录 #include<stdio.h>#include<string.h>#define null 0#define m ...
- DAG最长路径
1.DAG最长路径(不记录路径) int dfs1(int s) { )return dis[s]; ; i < G[s].size(); ++i) { int to = G[s][i]; di ...
- Axure RP Extension for Chrome经常损坏
昨天自己修改后的谷歌浏览器插件,才使用了一天,今天刚打开浏览器就弹出了“已停用不支持的扩展程序”提示,第三方扩展程序就这么不受谷歌浏览器待见呢!?好吧,想办法解决! 通过扩展程序里“该扩展程序未列在 ...
- Spring Boot 2.x 启动全过程源码分析
Spring Boot 2.x 启动全过程源码分析 SpringApplication 实例 run 方法运行过程 上面分析了 SpringApplication 实例对象构造方法初始化过程,下面继续 ...
- Discuz 任务、道具、任务和验证类插件制作
一.广告类脚本位置:source/class/adv/adv_name.php语言包位置:source/language/adv/lang_name.php <?php class adv_na ...
- ffmpeg默认输出中文为 UTF-8
在使用ffmpeg 进行对音视频文件解码输出信息的时候会出现乱码. 从网上找到了说ffmpeg默认格式 为 utf-8 如果vs工程使用的的 Unicode 则需要将 utf-8转 Unicode 才 ...
- linux Crontab 使用
cron 用法说明 全文如下: cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...