启用自动缩放后,GKE 不会缩放 to/from 0

GKE does not scale to/from 0 when autoscaling enabled

我想 运行 我的 GKE 上的 CronJob 以便每天执行批处理操作。理想情况是我的集群在作业未 运行ning 时扩展到 0 个节点,并在每次满足计划时动态扩展到 1 个节点和 运行 上的作业。

我首先尝试通过使用在 kubernetes 文档中找到的一个简单的 CronJob 来实现这一点,它只打印当前时间并终止。

我首先使用以下命令创建了一个集群:

gcloud container clusters create $CLUSTER_NAME \
    --enable-autoscaling \
    --min-nodes 0 --max-nodes 1 --num-nodes 1 \
    --zone $CLUSTER_ZONE

然后,我创建了一个具有以下描述的 CronJob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: Never

作业计划每小时 运行 并在终止前打印当前时间。

首先,我想创建具有 0 个节点的集群,但设置 --num-nodes 0 会导致错误。为什么会这样?请注意,我可以在创建集群后手动将集群缩减到 0 个节点。

其次,如果我的集群有 0 个节点,则不会安排作业,因为集群不会自动扩展到 1 个节点,而是会出现以下错误:

Cannot schedule pods: no nodes available to schedule pods.

第三,如果我的集群有 1 个节点,作业 运行 正常,但在那之后,集群不会缩减到 0 个节点,而是保持在 1 个节点。我让我的集群 运行 用于两个连续的作业,并且它没有在两者之间缩小。我假设一个小时应该足以让集群这样做。

我错过了什么?

编辑:我已经开始工作并详细说明了我的解决方案 here

更新:

Note: Beginning with Kubernetes version 1.7, you can specify a minimum size of zero for your node pool. This allows your node pool to scale down completely if the instances within aren't required to run your workloads.

https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler


旧答案:

不支持将整个集群扩展到 0,因为系统总是需要至少一个节点 pods:

See docs

您可以为系统 pods 创建一个带有小型机器的节点池,以及一个带有大型机器的额外节点池,您可以在其中 运行 处理您的工作负载。这样第二个节点池可以缩小到 0,而你仍然有 space 到 运行 系统 pods。

尝试后,@xEc 提到:另请注意,在某些情况下我的节点池无法扩展,例如我创建的初始大小为 0 而不是 1 的池。

初步建议:

也许你可以 运行 一个微型虚拟机,用 cron 来扩展集群,提交一个作业(而不是 CronJob),等待它完成,然后将它缩小到 0?

我认为针对此类工作调整 GKE 不是一个好主意。如果你真的需要 0 个实例,我建议你使用

  1. App Engine 标准环境,允许您将实例扩展到 0 (https://cloud.google.com/appengine/docs/standard/go/config/appref) 或者
  2. Cloud Functions,它们是 'instanceless'/无服务器的。您可以使用此非官方指南来触发您的 Cloud Functions (https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions)