AIGC在金融场景是如何落地的? 了解详情
写点什么

如何为 Kubernetes 配置 Pod 水平自动扩展

  • 2020-04-15
  • 本文字数:4145 字

    阅读完需:约 14 分钟

如何为Kubernetes配置Pod水平自动扩展

介绍

Kubernetes 有一个强大的功能,它能在运行的服务上进行编码并配置弹性伸缩。如果没有弹性伸缩功能,就很难适应部署的扩展和满足 SLAs。这一功能称为 Horizontal Pod Autoscaler (HPA)

为什么使用 HPA

使用 HPA,您可以根据资源的使用情况或者自定义的指标,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。


HPA 可以为您的服务带来两个直接的帮助:


  1. 在需要计算和内存资源时提供资源,在不需要时释放它们

  2. 按需增加/降低性能以实现 SLA

HPA 工作原理

HPA 会根据监测到的 CPU/内存利用率(资源指标),或基于第三方指标应用程序(如 Prometheus、Datadog 等)提供的自定义指标,自动调整副本控制器、部署或者副本集合的 pods 数量(定义最小和最大 pods 数)。HPA 是一种控制回路,它的周期由 Kubernetes 的 controller manager –horizontal-pod-autoscaler-sync-period 标志控制(默认值是 30s)。



HPA 工作图解

HPA 定义

HPA 是 Kubernetes 中弹性伸缩 API 组下的一个 API 资源。当前稳定的版本是autoscaling/v1,它只提供了对 CPU 自动缩放的支持。如果您想额外获得对内存和自定义指标的支持,可以使用 Beta 版本autoscaling/v2beta1


您可以在 HPA API 对象中看到更多信息:https://git.k8s.io/community/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md#horizontalpodautoscaler-object


在一般情况下 HPA 是由 kubectl 来提供支持的。可以使用 kubectl 进行创建、管理和删除:

创建 HPA :

  • 带有 manifest: kubectl create -f <HPA_MANIFEST>

  • 没有 manifest(只支持 CPU):kubectl autoscale deployment hello-world –min=2 --man=5 –-cpu-percent=50

获取 hpa 信息:

  • 基本信息: kubectl get hpa hello-world

  • 细节描述: kubectl describe hpa hello-world

删除 hpa:

  • kubectl delete hpa hello-world


下面是一个 HPA manifest 定义的例子:



  • 这里使用了 autoscaling/v2beta1 版本,用到了 cpu 和内存指标

  • 控制 hello-world 项目部署的自动缩放

  • 定义了副本的最小值 1

  • 定义了副本的最大值 10

  • 当满足时调整大小:

  • CPU 使用率超过 50%

  • 内存使用超过 100Mi

安装

在 HPA 可以在 Kubernetes 集群上使用之前,有一些元素需要在系统中安装和配置。

需求

检查确定 Kubernetes 集群服务正在运行并且至少包含了这些标志:


  • kube-api: requestheader-client-ca-file

  • kubelet: read-only-port 在端口 10255

  • kube-controller: 可选,只在需要和默认值不同时使用

  • horizontal-pod-autoscaler-downscale-delay:”5m0s”

  • horizontal-pod-autoscaler-upscale-delay:”3m0s”

  • horizontal-pod-autoscaler-sync-period: “30s”


对于 RKE,Kubernetes 集群定义,请确定您已经在服务部分添加了这些行。如果要在 Rancher v2.0.X UI 中执行此操作,请打开”Cluster options”- “Edit as YAML”并添加下面的定义:



要部署指标服务,您的 Kubernetes 集群必须要正确配置和部署。


注意:在部署和测试示例时,本文使用的是 Rancher v2.0.6 以及 k8s v1.10.1 集群

资源指标

如果 HPA 想要使用资源指标,那么就需要用到metrics-server包了,它在 Kubernetes 集群中的kube-system命名空间里。


按照下面的步骤实现:


  1. 配置 kubectl 连接到正确的 Kubernetes 集群

  2. 克隆metrics-server 的 Github 仓库:git clone https://github.com/kubernetes-incubator/metrics-server

  3. 安装metrics-server包(假设 Kubernetes 升级到了 1.8):kubectl create -f metrics-server/deply/1.8+/

  4. 检查metrics-server是否运行正常。在命名空间kube-system可以检查服务 pod 以及日志



  1. 检查是否可以从 kubectl 访问指标 API:如果您要直接访问 Kubernetes 集群,请使用 kubectl config 的服务器 URL,比如‘https://:6443’



如果您想通过 Rancher 访问 Kubernetes 集群,那么 kubectl config 的服务器 URL 就要像:https://<RANCHER_URL>/k8s/clusters/<CLUSTER_ID>,即你还要在原本的


API 路径后面加上/k8s/clusters/<CLUSTER_ID>


自定义指标(Prometheus)

自定义指标作为一种资源,可以由许多第三方应用程序提供。我们准备在演示中使用 Prometheus。假设 Prometheus 已经部署在您的 Kubernetes 集群中了,它可以从 pods、节点、命名空间等等地方获得正确的指标,我们将使用 Prometheus url,http://prometheus.mycompany.io,它公开于端口 80。


Prometheus 可以在 Rancher v2.0 目录中部署。如果在 Kubernetes 集群上没有运行,那么就在 Rancher 目录中部署它。


如果 HPA 想要使用 Prometheus 中的自定义指标,那么 Kubernetes 集群上的kube-system命名空间则需要用到k8s-prometheus-adapter。为了方便 k8s-prometheus-adapter 的安装,我们将使用 banzai-charts 提供的 Helm chart。


通过下面的步骤可以使用这一 chart:


  1. 在 k8s 集群上初始化 helm



  1. 从 Github 仓库克隆banzai-charts



  1. 安装prometheus-adapter,指定具体的 Prometheus URL 和端口



  1. 检查prometheus-adapter是否运行正常。检查服务 pod 和日志是在kube-system命名空间下



  1. 检查指标 API 是否可以从 kubectl 进行访问:直接访问 Kubernetes 集群,那么 kubectl config 的服务器 URL 就比如https://<K8s_URL>:6443



如果是从 Rancher 进行访问,那么 kubectl config 的服务器 URL 就是https://<RANCHER_URL>/k8s/clusters/<CLUSTER_ID>,需要加上后缀/k8s/clusters/<CLUSTER_ID>


ClusterRole 和 ClusterRoleBinding

默认情况下,HPA 将尝试通过用户的 system:anonymous 读取(系统的和自定义的)指标。用户需要定义 view-resource-metrics 以及 view-custom-metrics,而 ClusterRole 和 ClusterRoleBinding 将它们分配给 system:anonymous 来打开对指标的读取访问。


要实现这一点,需要下面的步骤:


  1. 配置 kubectl 正确连接到 k8s 集群

  2. 复制 ClusterRole 和 ClusterRoleBinding 文件:




在 Kubernetes 集群上创建它们(如果你想使用自定义指标的话):


服务部署

为了让 HPA 正常工作,服务部署应该要有容器的资源请求定义。


我们用一个 hello-world 的例子来测试一下 HPA 是否正常工作。


我们根据下面步骤进行,第一步,正确配置 kubectl 连接到 k8s 集群,第二步,复制hello-world的部署文件。



  1. 在 k8s 集群上部署它



  1. 为资源或者自定义指标复制 HPA

  2. 资源指标:



* type: Resource resource:name: cpu targetAverageUtilization: 50* type: Resource resource: name: memory targetAverageValue: 1000Mi* 自定义指标(和资源指标一样,不过需要添加自定义的cpu_system指标)
![](https://static001.infoq.cn/resource/image/a6/75/a6a8e42d4a590131c0d468e862864e75.png)
4. 获得HPA信息和描述,并且检查资源指标是否已经显示出来:
资源指标:
![](https://static001.infoq.cn/resource/image/8e/7a/8ef3426531e625f38c2d42ba0a8da87a.png)
自定义指标:
![](https://static001.infoq.cn/resource/image/36/36/367217ea831c87eba55996ab6cfc0036.png)
5. 给我们的服务产生负载,进行弹性伸缩的测试。这里可以使用各种各样的工具(产生负载),不过这里我们使用<https://github.com/rakyll/hey> 向hello-world服务发出http请求,并观察弹性伸缩是否正常工作
6. 观察自动的扩缩容
* 资源指标: * 当cpu利用率达到目标比例时,自动扩展到2个pods
![](https://static001.infoq.cn/resource/image/32/1e/328afe6703ecb06069714c825544961e.png)
![](https://static001.infoq.cn/resource/image/d7/d4/d7f39dbbdaf4412c1667a6351d78dad4.png)
当cpu使用率达到目标值`horizontal-pod-autoscaler-upscale-delay`默认超过3分钟时,扩展到3个pods:
![](https://static001.infoq.cn/resource/image/98/34/98ec8cf85340e82aafed6d56ab0ecf34.png)
![](https://static001.infoq.cn/resource/image/40/a2/4017217a1758d081c89bc3ffc8ef79a2.png)
当cpu使用率降到目标值`horizontal-pod-autoscaler-downscale-delay`默认超过5分钟时,缩小到1个pods:
![](https://static001.infoq.cn/resource/image/fe/ce/fea3bb9432faaa2c26fef3470a7af3ce.png)
![](https://static001.infoq.cn/resource/image/90/2f/90df8347d584d08ff4537a1db481042f.png)
自定义指标:
* 当cpu利用率达到目标时扩展到2个pods:
![](https://static001.infoq.cn/resource/image/2b/40/2b49b1e7be05d070d34c1e87f9dec640.png)
![](https://static001.infoq.cn/resource/image/b9/60/b9c57bbef90d74250a8c420c0001f960.png)
当cpu_system利用率限制达到目标值,扩展到3个pods:
![](https://static001.infoq.cn/resource/image/ec/e5/ecb93b577cbc9877b8a270174a16dfe5.png)
![](https://static001.infoq.cn/resource/image/0d/b9/0d4478ba351fa53579b89ac1af4ee4b9.png)
当cpu利用率限制达到目标值`horizontal-pod-autoscaler-upscale-delay`超过3分钟(默认),扩展到4个pods:
![](https://static001.infoq.cn/resource/image/fd/46/fd4295f9c37afa6c95edee6ccbaeee46.png)
![](https://static001.infoq.cn/resource/image/9e/32/9ed81b30f71c4d83f6111433984e7c32.png)
当所有的指标都低于目标值`horizontal-pod-autoscaler-downscale-delay`超过5分钟,自动缩小到1个pods:
![](https://static001.infoq.cn/resource/image/f9/49/f93c42aa61af263780eac3ebe1f23f49.png)
![](https://static001.infoq.cn/resource/image/0a/06/0a707bd1cbc7e77b68ed68184a608606.png)
## 总结
我们看到了如何在Rancher上使用Kubernetes HPA来进行部署的弹性扩缩容。这是一个非常出色好用的功能,可以让部署的规模适应于实际的服务负载并且实现服务SLA。
我们还看到,如何在kube-controller上对`horizontal-pod-autoscaler-downscale-delay` (默认5分钟)和 `horizontal-pod-autoscaler-upscale-delay` (默认3分钟) 进行参数化,调整扩缩容的反应。
对于我们的自定义指标,我们在例子`cpu_system`中进行了展示,不过我们还可以使用所有导出给Prometheus的指标,并了解当前服务的性能,比如`http_request_number`、`http_response_time`等等。
为了让之后HPA更容易使用,我们现在正努力将metric-server作为插件集成到RKE集群部署中。它现在已经包含在RKE v0.1.9-rc2中进行测试,目前还尚未得到官方的支持。它会在RKE v0.1.9版本中得到支持。
复制代码


2020-04-15 23:05746

评论

发布
暂无评论
发现更多内容

一个基于DPoS共识算法的区块链案例解析

Regan Yue

区块链 11月日更 细讲区块链

VR和AR只是入门,真正的元宇宙远不止于此

CECBC

使用 JavaScript 创建和下载文件

devpoint

JavaScript File Blob 11月日更

Android C++系列:访问Assets 文件夹

轻口味

c++ android jni 11月日更

“元宇宙”到底是啥?为啥火了?鼓励探索警惕忽悠

CECBC

你找的网络安全系列书籍,都在这了!

喀拉峻

网络安全 安全 信息安全

Pulsar的Chunk Message原理剖析

Zike Yang

Apache Pulsar 11月日更

详解低延时高音质:丢包、抖动与 last mile 优化那些事儿

声网

音频体验 RTE技术详解 last mile 优化

自定义View:多点触摸与实现任意拖动图片控

Changing Lin

11月日更

什么是低代码平台?

石云升

低代码平台 11月日更

Go 语言,测试功能详解 - 下

微客鸟窝

Go 语言 11月日更

技术改进项目的质量保障思路

QualityFocus

架构 软件测试 自动化测试 质量保障 技术改进

HW3 - 外包学生管理系统架构文档

WWH

架构实战营

【Promise 源码学习】第九篇 - Promise.resolve 和 Promise.reject 的实现

Brave

源码 Promise 11月日更

TypeScript 类型系统

HoneyMoose

版本化ASP.NET Core WebApi

喵叔

11月日更

双十一还是孤身一人?超强AI神器送你一个"对象"

百度大脑

人工智能 百度

点进来,与白洞一起体验一场沉浸式智慧轨道之旅

脑极体

Golang Gin 框架参数解析介绍(三)

liuzhen007

11月日更

16 K8S之容器健康监测

穿过生命散发芬芳

k8s 11月日更

消息队列表结构设计

guangbao

TypeScript 是弱类型

HoneyMoose

Ta们用数字种植绿色山河:牛津博士与储能之变

脑极体

AlmaLinux树莓派初体验

IT蜗壳-Tango

11月日更

进击的Java(八)

ES_her0

11月日更

linux实战清理挖矿病毒kthreaddi

入门小站

Linux

博文推荐 | Apache Pulsar 对现代数据堆栈至关重要的四个原因

Apache Pulsar

kafka 架构 Apache Pulsar 数据堆栈 DataStax

MVCC的机制初识

卢卡多多

MVCC 11月日更

在线极限词,敏感词,违禁词查询工具

入门小站

工具

【Quarkus技术系列】「云原生架构体系」配置参考指南相关的功能机制配置介绍分析

洛神灬殇

入门 配置信息 Quarkus 11月日更

译文 | 科普:Pulsar 和 Kafka 架构对比

Apache Pulsar

kafka 架构 分布式 中间件 Apache Pulsar

  • 扫码添加小助手
    领取最新资料包
如何为Kubernetes配置Pod水平自动扩展_文化 & 方法_Rancher_InfoQ精选文章