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

简介: 干货教程!教你如何在K8S上实现根据CPU等实际使用量与用户的期望值进行比对,实现部署的自动扩展和缩减! 介 绍 Kubernetes有一个强大的功能,它能在运行的服务上进行编码并配置弹性伸缩。如果没有弹性伸缩功能,就很难适应部署的扩展和满足SLAs。

干货教程!教你如何在K8S上实现根据CPU等实际使用量与用户的期望值进行比对,实现部署的自动扩展和缩减! 


介 绍

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是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. 资源指标:

``` apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: hello-world namespace: default spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: hello-world minReplicas: 1 maxReplicas: 10 metrics:

  • type: Resource resource:name: cpu targetAverageUtilization: 50

  • type: Resource resource: name: memory targetAverageValue: 1000Mi

  • 自定义指标(和资源指标一样,不过需要添加自定义的cpu_system指标)

  1. 获得HPA信息和描述,并且检查资源指标是否已经显示出来:

资源指标:

自定义指标:

  1. 给我们的服务产生负载,进行弹性伸缩的测试。这里可以使用各种各样的工具(产生负载),不过这里我们使用https://github.com/rakyll/hey 向hello-world服务发出http请求,并观察弹性伸缩是否正常工作

  2. 观察自动的扩缩容

  • 资源指标:

  • 当cpu利用率达到目标比例时,自动扩展到2个pods

当cpu使用率达到目标值horizontal-pod-autoscaler-upscale-delay默认超过3分钟时,扩展到3个pods:

当cpu使用率降到目标值horizontal-pod-autoscaler-downscale-delay默认超过5分钟时,缩小到1个pods:

自定义指标:

  • 当cpu利用率达到目标时扩展到2个pods:

当cpu_system利用率限制达到目标值,扩展到3个pods:

当cpu利用率限制达到目标值horizontal-pod-autoscaler-upscale-delay超过3分钟(默认),扩展到4个pods:

当所有的指标都低于目标值horizontal-pod-autoscaler-downscale-delay 超过5分钟,自动缩小到1个pods:

总 结

我们看到了如何在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版本中得到支持。

本文转移开源中国-如何为Kubernetes配置Pod水平自动扩展

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
881 23
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
622 25
|
Prometheus Kubernetes 监控
Kubernetes监控:Prometheus与AlertManager结合,配置邮件告警。
完成这些步骤之后,您就拥有了一个可以用邮件通知你的Kubernetes监控解决方案了。当然,所有的这些配置都需要相互照应,还要对你的Kubernetes集群状况有深入的了解。希望这份指南能帮助你创建出适合自己场景的监控系统,让你在首次发现问题时就能做出响应。
885 22
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
582 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
348 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
弹性计算 调度 数据中心
阿里云 ACK One 注册集群云上弹性:扩展业务新利器
随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2314 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1689 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
本文讲的是Kubernetes之Pod调度【编者的话】Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
3037 0

热门文章

最新文章

推荐镜像

更多