Kubernetes pod 自动扩缩与实例组自动扩缩不同步

Posted

技术标签:

【中文标题】Kubernetes pod 自动扩缩与实例组自动扩缩不同步【英文标题】:Kubernetes pod autoscaling out of sync with Instance Group autoscaling 【发布时间】:2016-08-24 19:33:41 【问题描述】:

我有一个简单的 wordpress 网站,由下面的 ReplicationControllerService 定义。应用部署并顺利运行后,我在 Kubernetes 创建的实例组上启用了自动扩展,方法是转到 GCE 控制台并使用相同的设置(最大 5,cpu 10)启用自动扩展。

自动缩放实例和 Pod 似乎工作得很好,只是它们之间总是不同步。 RC 自动缩放会从 CE 实例中移除 pod,但这些实例不会发生任何事情,因此它们会开始失败请求,直到 LB 健康检查失败并移除它们。

有没有办法让 kubernetes 像扩展它们运行的​​实例一样扩展 pod,这样就不会发生这种情况?或者有没有办法让它们保持同步?

我的流程如下:

创建集群

$ gcloud container clusters create wordpress -z us-central1-c -m f1-micro

创建 rc

$ kubectl create -f rc.yml

创建服务

$ kubectl create -f service.yml

自动缩放 rc

$ kubectl autoscale rc frontend --max 5 --cpu-percent=10

然后我在控制台中启用了自动缩放,并给服务器负载以使其可缩放。

rc.yml

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - image: custom-wordpress-image
        name: wordpress
        ports:
          - containerPort: 80
            hostPort: 80

service.yml

apiVersion: v1
kind: Service
metadata:
  labels:
    name: frontend
  name: frontend
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: wordpress

更新了解更多信息

如果我不使用 kubernetes 自动扩缩器,而是将副本设置为与实例组自动扩缩器最大实例数相同的数量,我似乎得到了想要的结果。当实例被添加到实例组时,kubernetes 会配置它们,因为它们被删除 kubernetes 会相应地更新。在这一点上,我想知道 Kubernetes 自动扩缩器的目的是什么。

【问题讨论】:

【参考方案1】:

据我了解,kubernetes autoscaler 功能主要用于 RC 和部署为其子级定义了 cpu 限制的情况。您可以定义一个自动缩放器,其中包含最小和最大 pod 数量以及 pod 的目标 CPU 使用率,它会根据这些限制在集群中扩展 pod,而不管集群大小。如果 pod 没有限制,那么您可能希望扩展集群并为每个额外节点安排一个额外的 pod,但我不确定这是否符合容器化服务的最佳实践,因为集群中运行无限 pod 的任何节点都可以主导,这可能会对其他 pod 的运行能力产生不利影响。比较难以预测。

【讨论】:

【参考方案2】:

TLDR;

在您的用例中,kubernetes 只会给您带来开销。您在实例组中的每个实例上运行 1 个 pod(docker 容器)。您还可以将 Docker 容器部署到 App Engine 灵活(以前的托管虚拟机)https://cloud.google.com/appengine/docs/flexible/custom-runtimes/ 并让您的实例组的自动缩放来处理它。

更长的答案

在 k8s 中,(目前)无法将实例缩放链接到 Pod 缩放。这是因为它们是两个不同的问题。 k8s 的 HPA 旨在让(小型)pod 扩展以将负载分散到您的集群(大型机器)上,因此它们会因负载增加而扩展。

如果您没有定义任何限制(每台机器 1 个 pod),您可以将最大 pod 数量设置为集群的最大扩展,有效地将所有这些 pod 设置为 pending 状态,直到另一个实例启动。

如果你想让你的 pod 让你的节点扩展,那么最好的方法(我们发现)是让它们“过度拥挤”一个实例,这样实例组扩展就会启动。我们通过设置相当低的内存来做到这一点/我们的 pod 的 cpu 要求和上限,有效地允许它们在实例的总可用 CPU/内存上突增。

resources:
  requests:
    cpu: 400m
    memory: 100Mi
  limits:
    cpu: 1000m
    memory: 1000Mi

【讨论】:

App Engine flexible 是一种解决方案,但它并不适合某些工作负载。您对所连接的磁盘的控制较少,没有可抢占的选项以及其他问题。这种每个节点一个 pod/容器的用例非常常见,如果 Google 可以针对它进行优化,那就太好了。【参考方案3】:

通过新增的 Kubernetes 1.3 autoscaling,我现在可以让 Kubernetes 自动扩展我的集群和我的 pod。

使用GCP's create command,我现在可以使用--enable-autoscaling 结合--min-nodes--max-nodes--num-nodes 轻松添加自动缩放集群。

【讨论】:

以上是关于Kubernetes pod 自动扩缩与实例组自动扩缩不同步的主要内容,如果未能解决你的问题,请参考以下文章

Pod的扩缩容

GKE 集群自动扩缩器与托管实例组中的自动扩缩器

Kubernetes水平自动扩缩容Hpa-超详细文档

3个自动伸缩机制,帮你降低Kubernetes的成本

再战 k8s(13):Pod 的扩缩容

[kubernetes] HPA实现自动水平伸缩POD