Kubernetes 启用自动缩放时,GKE不会缩放到0或从0开始缩放

Kubernetes 启用自动缩放时,GKE不会缩放到0或从0开始缩放,kubernetes,google-cloud-platform,autoscaling,google-kubernetes-engine,kubernetes-cronjob,Kubernetes,Google Cloud Platform,Autoscaling,Google Kubernetes Engine,Kubernetes Cronjob,我想在GKE上运行CronJob,以便每天执行批处理操作。理想的情况是,当作业未运行时,我的集群将扩展到0个节点,并动态扩展到1个节点,并在每次满足计划时在其上运行作业 我首先尝试使用文档中的一个简单CronJob来实现这一点,它只打印当前时间并终止 我首先使用以下命令创建了一个集群: gcloud container clusters create $CLUSTER_NAME \ --enable-autoscaling \ --min-nodes 0 --max-nodes

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

我首先尝试使用文档中的一个简单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个节点,而是会出现以下错误:

无法调度吊舱:没有节点可用于调度吊舱

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

我错过了什么


编辑:我已经让它工作并详细说明了我的解决方案。

更新:

注意:从Kubernetes 1.7版开始,您可以指定最小值 节点池的大小为零。这允许您的节点池进行扩展 如果不需要中的实例来运行 工作量


旧答案:

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

您可以创建一个节点池,其中包含一台用于系统吊舱的小型计算机,以及一个额外的节点池,其中包含一台用于运行工作负载的大型计算机。通过这种方式,第二个节点池可以缩小到0,并且您仍然有空间运行系统吊舱

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

初步建议:


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

我认为调整GKE来做这种工作不是个好主意。如果您确实需要0个实例,我建议您使用其中一个

  • App Engine标准环境,允许将实例扩展到0() 或
  • 云函数,它们无论如何都是“无实例的”/无服务器的。您可以使用此非官方指南来触发您的云功能()

  • 遗憾的是,这对我来说不起作用,因为我需要一台拥有大量vCPU的机器来利用多处理。哦,我不知道如何解释文档中的信息。我想你的解决方案是一个选择。也就是说,您将如何跟踪集群上作业的完成情况?我同意这不是一个特别好的任务。嗯,关于作业完成的信息仍然可以在集群上找到(
    kubectl get jobs
    )。或者,您可以尝试运行Airflow来进行缩放/提交和完整性跟踪。但我从来没有太多的好经验。如果添加一个具有非常小的机器的nodepool,它将继续运行,并让具有较大机器规模的nodepool降到0,那么您的意思是拥有一个节点池,该节点池中有一台小型机器,该机器可以为系统吊舱持续运行,并且具有另一个节点池,该节点池中有一台大型机器,可以根据需要进行扩展?大型计算机节点池是否会自动从/缩小到0节点?我想我必须向CronJob添加resources规范,以便将其安排在正确的节点池上,对吗?是的,这将是尝试的一般想法。是的,通过指定'requires'CPU,您可以在大型计算机上安排cron作业。好的,我通过执行您的建议来实现这一点,即运行两个不同的节点池。你想在这个帖子上再回答一次吗?这样我就可以接受你的答案,而不是在评论中长篇大论的答案?如果没有,我就接受这个。还请注意,在某些情况下,我的节点池无法扩展,例如,如果我创建的池的初始大小为0而不是1。我不知道为什么。。。