Tasks

Step-by-step instructions for performing operations with Kubernetes.

Edit This Page

Horizontal Pod Autoscaling

该文档描述了 Kubernetes 的 Horizontal Pod Autoscaling 的当前状态。

什么是 Horizontal Pod Autoscaling?

利用 Horizontal Pod Autoscaling,kubernetes 能够根据监测到的 CPU 利用率(或者在 alpha 版本中支持的应用提供的 metric)自动的扩缩容 replication controller,deployment 和 replica set 中 pod 的数量。

Horizontal Pod Autoscaler 作为 kubernetes API resource 和 controller 的实现。Resource 确定 controller 的行为。Controller 会根据监测到用户指定的目标的 CPU 利用率周期性地调整 replication controller 或 deployment 的 replica 数量。

Horizontal Pod Autoscaler 如何工作?

Horizontal Pod Autoscaler diagram

Horizontal Pod Autoscaler 由一个控制循环实现,循环周期由 controller manager 中的 --horizontal-pod-autoscaler-sync-period 标志指定(默认是 30 秒)。

在每个周期内,controller manager 会查询 HorizontalPodAutoscaler 中定义的 metric 的资源利用率。Controller manager 从 resource metric API(每个 pod 的 resource metric)或者自定义 metric API(所有的metric)中获取 metric。

HorizontalPodAutoscaler 控制器可以以两种不同的方式获取 metric :直接的 Heapster 访问和 REST 客户端访问。

当使用直接的 Heapster 访问时,HorizontalPodAutoscaler 直接通过 API 服务器的服务代理子资源查询 Heapster。需要在集群上部署 Heapster 并在 kube-system namespace 中运行。

有关 REST 客户端访问的详细信息,请参阅 支持自定义度量

Autoscaler 访问相应的 replication controller,deployment 或 replica set 来缩放子资源。

Scale 是一个允许您动态设置副本数并检查其当前状态的接口。

有关缩放子资源的更多细节可以在 这里 找到。

API Object

Horizontal Pod Autoscaler 是 kubernetes 的 autoscaling API 组中的 API 资源。当前的稳定版本中,只支持 CPU 自动扩缩容,可以在 autoscaling/v1 API 版本中找到。

在 alpha 版本中支持根据内存和自定义 metric 扩缩容,可以在 autoscaling/v2alpha1 中找到。autoscaling/v2alpha1 中引入的新字段在 autoscaling/v1 中是做为 annotation 而保存的。

关于该 API 对象的更多信息,请参阅 HorizontalPodAutoscaler Object

在 kubectl 中支持 Horizontal Pod Autoscaling

Horizontal Pod Autoscaler 和其他的所有 API 资源一样,通过 kubectl 以标准的方式支持。

我们可以使用 kubectl create 命令创建一个新的 autoscaler。

我们可以使用 kubectl get hpa 列出所有的 autoscaler,使用 kubectl describe hpa 获取其详细信息。

最后我们可以使用 kubectl delete hpa 删除 autoscaler。

另外,可以使用 kubectl autoscale 命令,很轻易的就可以创建一个 Horizontal Pod Autoscaler。

例如,执行 kubectl autoscale rc foo —min=2 —max=5 —cpu-percent=80 命令将为 replication controller foo 创建一个 autoscaler,目标的 CPU 利用率是80%,replica 的数量介于 2 和 5 之间。

关于 kubectl autoscale 的更多信息请参阅 这里

滚动更新期间的自动扩缩容

目前在Kubernetes中,可以通过直接管理 replication controller 或使用 deployment 对象来执行 滚动更新,该 deployment 对象为您管理基础 replication controller。

Horizontal Pod Autoscaler 仅支持后一种方法:Horizontal Pod Autoscaler 被绑定到 deployment 对象,它设置 deployment 对象的大小,deployment 负责设置底层 replication controller 的大小。

Horizontal Pod Autoscaler 不能使用直接操作 replication controller 进行滚动更新,即不能将 Horizontal Pod Autoscaler 绑定到 replication controller,并进行滚动更新(例如使用 kubectl rolling-update)。

这不行的原因是,当滚动更新创建一个新的 replication controller 时,Horizontal Pod Autoscaler 将不会绑定到新的 replication controller 上。

支持多个 metric

Kubernetes 1.6 中增加了支持基于多个 metric 的扩缩容。您可以使用 autoscaling/v2alpha1 API 版本来为 Horizontal Pod Autoscaler 指定多个 metric。然后 Horizontal Pod Autoscaler controller 将权衡每一个 metric,并根据该 metric 提议一个新的 scale。在所有提议里最大的那个 scale 将作为最终的 scale。

支持自定义 metric

注意: Kubernetes 1.2 根据特定于应用程序的 metric ,通过使用特殊注释的方式,增加了对缩放的 alpha 支持。

在 Kubernetes 1.6中删除了对这些注释的支持,有利于 autoscaling/v2alpha1 API。 虽然旧的收集自定义 metric 的旧方法仍然可用,但是这些 metric 将不可供 Horizontal Pod Autoscaler 使用,并且用于指定要缩放的自定义 metric 的以前的注释也不在受 Horizontal Pod Autoscaler 认可。

Kubernetes 1.6增加了在 Horizontal Pod Autoscaler 中使用自定义 metric 的支持。

您可以为 autoscaling/v2alpha1 API 中使用的 Horizontal Pod Autoscaler 添加自定义 metric 。

Kubernetes 然后查询新的自定义 metric API 来获取相应自定义 metric 的值。

前提条件

为了在 Horizontal Pod Autoscaler 中使用自定义 metric,您必须在您集群的 controller manager 中将 --horizontal-pod-autoscaler-use-rest-clients 标志设置为 true。然后,您必须通过将 controller manager 的目标 API server 设置为 API server aggregator(使用 --apiserver 标志),配置您的 controller manager 通过 API server aggregator 与API server 通信。 Resource metric API和自定义 metric API 也必须向 API server aggregator 注册,并且必须由集群上运行的 API server 提供。

您可以使用 Heapster 实现 resource metric API,方法是将 --api-server 标志设置为 true 并运行 Heapster。 单独的组件必须提供自定义 metric API(有关自定义metric API的更多信息,可从 k8s.io/metrics repository 获得)。

进一步阅读

Analytics

Create an Issue Edit this Page