当GKE(Google容器引擎)Kubernetes集群上只有一个部署时,Horizo​​ntalPodAutoscaler是否有意义?

时间:2016-07-18 20:35:45

标签: kubernetes autoscaling google-kubernetes-engine

我有一个"同类" Kubernetes设置。我的意思是我只运行单一类型的pod(一个http服务器)的实例,其中负载均衡器服务向它们分配流量。

根据我的推理,为了充分利用我的群集(编辑:具体 - 获得对http请求的最佳平均响应时间)我应该:

  1. 每个节点上至少运行一个pod:节点上没有正在运行的pod,这意味着我正在为该节点付费而没有准备好提供请求。
  2. 每个节点上最多运行一个pod:这些pod是线程化的http服务器,因此它们可以最大限度地利用节点,因此在节点上运行多个pod并不能为我提供任何支持。
  3. 这意味着每个节点应该只有一个pod。我使用DaemonSet实现了这一点。

    另一种方法是配置部署并对其应用Horizo​​ntalPodAutoscaler,让Kubernetes处理pod和pod to node映射的数量。与此相比,我的方法有什么不利之处吗?

    我的评估是,Horizo​​ntalPodAutoscaler主要与异构情况相关,其中一个Horizo​​ntalPodAutoscaler可以以另一个部署为代价扩展部署。但由于我只有一种类型的pod,我只有一个部署,我会以牺牲自身为代价来扩展该部署,这是没有意义的。

1 个答案:

答案 0 :(得分:0)

Horizo​​ntalPodAutoscaler实际上是满足您需求的有效解决方案。解决您的两个问题:

<强> 1。每个节点上至少有一个pod

这不是你真正关心的问题。担心的是你的集群利用不足。但是,即使您在每个节点上都运行了pod,也可能未充分利用群集。考虑一个三节点集群:

  1. 方案A:在每个节点上运行pod,每个节点10%CPU使用率
  2. 场景B:pod仅在一个节点上运行,70%CPU使用率
  3. 即使方案A在每个节点上都有一个窗格,但实际上集群的利用率低于场景B,其中只有一个节点有一个窗格。

    <强> 2。每个节点上最多运行一个pod

    Kubernetes调度程序尝试传播pod,以便您不会在单个节点上使用相同类型的多个pod。由于在您的情况下其他节点应为空,因此调度程序在其他节点上启动pod时应该没有问题。此外,如果您具有与节点资源等效的pod请求资源,则会阻止调度程序在已有节点的节点上安排新pod。

    现在,无论你使用DaemonSet还是HPA,你都可以达到同样的效果,但我个人会选择HPA,因为我觉得它更适合你的语义,如果你最终决定添加其他类型的pod到群集

    使用DamonSet意味着pod必须在每个节点(或某个子集)上运行。这非常适合像记录器或每个节点的度量收集器。但是你真的只是想根据需要使用可用的群集资源为你的pod提供支持,这与HPA的意图相匹配。

    另外,我相信GKE支持群集自动缩放,因此您永远不应该为不需要的节点付费。