如何为Kubernetes配置Pod水平自动扩展
干货教程!教你如何在K8S上实现根据CPU等实际使用量与用户的期望值进行比对,实现部署的自动扩展和缩减!
介 绍
Kubernetes有一个强大的功能,它能在运行的服务上进行编码并配置弹性伸缩。如果没有弹性伸缩功能,就很难适应部署的扩展和满足SLAs。这一功能称为Horizontal Pod Autoscaler (HPA)。
为什么使用HPA
使用HPA,您可以根据资源的使用情况或者自定义的指标,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。
HPA可以为您的服务带来两个直接的帮助:
-
在需要计算和内存资源时提供资源,在不需要时释放它们
-
按需增加/降低性能以实现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命名空间里。
按照下面的步骤实现:
-
配置kubectl连接到正确的Kubernetes集群
-
克隆metrics-server的Github仓库:git clone https://github.com/kubernetes-incubator/metrics-server
-
安装metrics-server包(假设Kubernetes升级到了1.8):kubectl create -f metrics-server/deply/1.8+/
-
检查metrics-server是否运行正常。在命名空间kube-system可以检查服务pod以及日志
- 检查是否可以从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:
- 在k8s集群上初始化helm
- 从Github仓库克隆banzai-charts:
- 安装prometheus-adapter,指定具体的Prometheus URL和端口
- 检查prometheus-adapter是否运行正常。检查服务pod和日志是在kube-system命名空间下
- 检查指标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来打开对指标的读取访问。
要实现这一点,需要下面的步骤:
-
配置kubectl正确连接到k8s集群
-
复制ClusterRole和ClusterRoleBinding文件:
在Kubernetes集群上创建它们(如果你想使用自定义指标的话):
服务部署
为了让HPA正常工作,服务部署应该要有容器的资源请求定义。
我们用一个hello-world的例子来测试一下HPA是否正常工作。
我们根据下面步骤进行,第一步,正确配置kubectl连接到k8s集群,第二步,复制hello-world的部署文件。
- 在k8s集群上部署它
-
为资源或者自定义指标复制HPA
-
资源指标:
``` 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指标)
- 获得HPA信息和描述,并且检查资源指标是否已经显示出来:
资源指标:
自定义指标:
-
给我们的服务产生负载,进行弹性伸缩的测试。这里可以使用各种各样的工具(产生负载),不过这里我们使用https://github.com/rakyll/hey 向hello-world服务发出http请求,并观察弹性伸缩是否正常工作
-
观察自动的扩缩容
-
资源指标:
-
当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水平自动扩展

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kubernetes集群中的高性能网络策略
自从7月份发布Kubernetes 1.3以来,用户已经能够在其集群中定义和实施网络策略。这些策略是防火墙规则,用于指定允许流入和流出的数据类型。如果需要,Kubernetes可以阻止所有未明确允许的流量。本文针对K8s的网络策略进行介绍并对网络性能进行测试。 网络策略 K8s的网络策略应用于通过常用标签标识的pod组。然后,可以使用标签来模拟传统的分段网络,这些网络通常用于在多层应用程序中隔离层:例如,您可以通过特定的“段”标签来标识前端和后端pod。策略控制这些段之间的流量,甚至控制来自外部源的流量。 分段流量 这对于应用程序开发人员意味着什么?最后,Kubernetes获得了提供 深度防御 的必要能力。流量可以分段,应用程序的不同部分可以独立保护。例如,您可以通过特定的网络策略非常轻松地保护每个服务:由服务器后的Replication Controller标识的所有窗格都已由特定标签标识。因此,您可以使用同一标签将策略应用于这些pod。 长期以来,深度防御被建议作为最佳实践。在AWS和OpenStack上,通过将安全组应用于VM,可以轻松实现应用程序的不同部分或层之间...
- 下一篇
用Kubernetes解决容器的混乱(上)
存在的问题。你需要精心准备比Dockerfiles更多的东西来将其应用于生产——管理所有容器的容器编排系统。 问题 让我们来看一个相对简单的应用程序,一个使用PHP和MySQL的、数据库驱动的Web应用程序。你想到的第一个解决方案可能是分解所有HTTP职责,例如将API和前端用户界面(UI)投放到一个容器中,将所有后端存储投放到另一个容器中。 那么,你看下面两个图: 如果要扩展这个架构,很容易,你可以添加前端容器的更多副本。 接下来的两个图显示具有单个后端的单个前端,以及具有单个后端的多个前端: 这时有人过来告诉你这不是好的微服务架构。他是对的,因为你真的需要分担责任。从同一个容器提供PHP驱动的API和HTML / JS / CSS UI不是最佳做法。 最好将它们分成两个容器: PHP和NGINX提供API NGINX提供HTML / JS / CSS 还有人指出,在临时容器上运行MySQL持久性数据存储是次优的,因为当容器关闭时你就丢失了数据。 要解决这个问题,你可以向位于该容器外部的一个容器添加持久存储卷。 运行MySQL的容器可以关闭而不会带走你的数据。 现在,你可以扩展容器解...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7设置SWAP分区,小内存服务器的救世主