10

我想在我的 GKE 上运行 CronJob,以便每天执行批处理操作。理想的情况是我的集群在作业未运行时扩展到 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 个节点,而是会出现以下错误:

无法调度 pod:没有可用于调度 pod 的节点。

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

我错过了什么?

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

4

2 回答 2

3

更新:

注意:从 Kubernetes 版本 1.7 开始,您可以为节点池指定最小大小为零。如果其中的实例不需要运行您的工作负载,这允许您的节点池完全缩减。

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


老答案:

不支持将整个集群扩展为 0,因为您始终需要至少一个节点用于系统 pod:

查看文档

您可以创建一个带有用于系统 pod 的小型机器的节点池,以及一个带有大型机器的附加节点池,您可以在其中运行您的工作负载。这样,第二个节点池可以缩减到 0,并且您仍然有空间来运行系统 pod。

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

初步建议:

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

于 2018-08-15T09:08:31.127 回答
0

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

  1. App Engine 标准环境,允许您将实例扩展到 0 ( https://cloud.google.com/appengine/docs/standard/go/config/appref ) 或
  2. 云功能,无论如何它们都是“无实例”/无服务器的。您可以使用此非官方指南来触发您的云功能(https://cloud.google.com/community/tutorials/using-stackdriver-uptime-checks-for-scheduling-cloud-functions
于 2018-08-15T09:30:47.260 回答