Kubernetes大集群怎么管?基于监控的弹性伸缩方法

导语: 我们通常使用Prometheus来对Kubernetes运行情况进行监控。并根据监控数据来扩容或者缩容。通常的扩/缩容都是根据内存或者CPU的使用,但是很多时候我们扩/缩容的依据通常是业务监控指标。如何根据业务监控指标来进行扩/缩容,本文作者给出了很优雅的方式。


Kubernetes自动弹性伸缩

自动弹性伸缩是一种基于资源使用情况自动弹性伸缩工作负载的方法。

Kubernetes的自动弹性伸缩有两个维度:

  • 处理node缩放操作的Cluster Autoscaler

  • 自动弹性伸缩部署副本集Pod数量的Horizontal Pod Autoscaler(HPA)。

Cluster Autoscaling和Horizontal Pod Autoscaler(HPA)可用于动态调整计算能力以满足系统SLA的要求。

HPA的演变


Horizontal Pod Autoscaler功能首次在Kubernetes V1.1中引入,自那时起已经发展了很久。 HPA V1版本基于观察到的CPU利用率和内存使用情况来自动伸缩POD。 在Kubernetes 1.6中引入了新的API自定义度量API,使HPA可以访问任意度量标准。 最终,Kubernetes 1.7引入了聚合层,允许第三方应用程序通过将自己注册为API附加组件来扩展Kubernetes API。

640?wx_fmt=png

  1. 安装提供核心指标的Metrics Server插件。

  2. 使用demo应用根据CPU和内存使用情况展示pod自动调节。

  3. 部署Prometheus和一个自定义的API服务器。 将自定义API服务器注册到聚合层。

  4. demo应用程序使用自定义指标配置HPA。

在开始之前,您需要安装Go 1.8或更高版本,并在您的GOPATH克隆k8s-prom-hpa[1]:

640?wx_fmt=png


1. 设置Metrics server

Kubernetes Metrics Server[2]是一个集群范围的资源使用数据聚合器,是Heapster[3]的继任者。 Metrics Server通过汇集来自kubernetes.summary_api.数据来收集node和POD的CPU和内存使用情况。summary API是用于将数据从Kubelet / cAdvisor传递到Metrics Server的API(基于内存十分高效)。

640?wx_fmt=png

640?wx_fmt=png

一分钟后, metric-server开始报告node和POD的CPU和内存使用情况。

查看node指标:

640?wx_fmt=png

查看pods指标:

640?wx_fmt=png

2.基于CPU和内存使用情况的Auto Scaling

我们将使用一个基于Golang的小型Web应用程序来测试Horizontal Pod Autoscaler(HPA)。

将podinfo[4]部署到default名称空间:

640?wx_fmt=png

使用http://<K8S_PUBLIC_IP>:31198.上的NodePort服务访问podinfo。

640?wx_fmt=png

创建HPA:

640?wx_fmt=png

几秒钟后,HPA控制器联系Metrics Server,然后获取CPU和内存使用情况:

640?wx_fmt=png

为了增加CPU压力,使用rakyll / hey运行负载测试:

640?wx_fmt=png

暂时删除podinfo。 稍后将在本教程中再次部署它:

640?wx_fmt=png


3.设置自定义Metrics Server

为了根据自定义指标进行缩放,您需要两个组件。 一个从您的应用程序收集指标并将它们存储在Prometheus[5]时间序列数据库中。 第二个组件使用collect, k8s-prometheus适配器[6]提供的度量标准扩展Kubernetes自定义指标API。

640?wx_fmt=png

创建monitoring名称空间:

640?wx_fmt=png

在monitoring命名空间中部署Prometheus v2:

640?wx_fmt=png

生成Prometheus适配器所需的TLS证书:

640?wx_fmt=png

部署Prometheus自定义指标API适配器:

640?wx_fmt=png

列出Prometheus提供的自定义指标:

640?wx_fmt=png

获取monitoring命名空间中所有POD的FS使用情况:

640?wx_fmt=png


4.基于自定义指标的Auto Scaling

在default命名空间中创建podinfoNodePort服务并部署:

640?wx_fmt=png

podinfo应用程序公开名为http_requests_total的自定义指标。 Prometheus适配器移除_total后缀并将度量标记为计数器度量。

640?wx_fmt=png

m代表milli-units,例如, 901m 意味着901 milli-requests (就是大约0.9个请求)。

640?wx_fmt=png

在default名称空间中部署podinfoHPA:

640?wx_fmt=png

几秒钟后,HPA从度量API获取http_requests值:

640?wx_fmt=png

以每秒25个请求的速度为podinfo服务加压:

640?wx_fmt=png

几分钟后,HPA开始增加POD数量:

640?wx_fmt=png

按照目前每秒的请求速度,部署将永远不会达到10个POD的最大值。 三个副本足以使每个POD的RPS保持在10以下。

640?wx_fmt=png

您可能已经注意到自动调节器不会立即响应峰值。 默认情况下,指标同步每30秒一次。 如果在最近3-5分钟内没有重新缩放,才能进行扩容/缩容。这确保了HP以防止冲突决策快速执行,并为Cluster Autoscaler提供了时间。

结论


并非所有系统都可以通过单独依靠CPU /内存使用量度来满足其SLA,但大多数Web和移动后端均需要基于每秒请求数来对任何流量突发进行处理。

参考链接

[1] https://github.com/stefanprodan/k8s-prom-hpa

[2] https://github.com/kubernetes-incubator/metrics-server

[3] https://github.com/kubernetes/heapster

[4] https://github.com/stefanprodan/k8s-podinfo

[5] https://prometheus.io

[6] https://github.com/DirectXMan12/k8s-prometheus-adapter

本文作者Stefan,由方圆翻译。转载译文请注明出处,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


相关阅读:

从美图容器优化实践谈Kubernetes网络方案设计

管理数万个实例,服务上百个业务:kubernetes在腾讯游戏的使用及演进历程

数据库容器化的价值——反驳数据库不适合容器化的错误观点

活动预告:

6 月 1 ~ 2 日,GIAC 全球互联网架构大会将于深圳举行。GIAC 是高可用架构技术社区推出的面向架构师、技术负责人及高端技术从业人员的技术架构大会。今年的 GIAC 已经有腾讯、阿里巴巴、百度、今日头条、科大讯飞、新浪微博、小米、美图、Oracle、链家、唯品会、京东、饿了么、美图点评、罗辑思维、ofo、旷视LinkedInPivotal 等公司专家出席。

本期 GIAC 大会上,容器部分精彩的议题如下:

640?wx_fmt=png

参加 GIAC,盘点2018最新技术。点击“阅读原文”了解大会更多详情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值